我相信我完全搞砸了这个,但是在Stack Overflow用户的帮助下我得到了很多,所以感谢至此.
我需要将JSON数据发送到远程API.显然,由于SOP问题,我无法使用jQuery,远程API不支持JSONP.
我也不想使用任何类型的代理来绕过SOP限制.
根据API文档(http://myemma.com/api-docs/),这是他们期望的数据的格式(请求和响应数据以JSON传输):
POST https://api.e2ma.net//123/members/add { "fields": { "first_name": "myFirstName" },"email": "email@domain.com" }
这是我迄今为止所建立的,但仍然从远程API接收“无法解析JSON”错误:
<cfset fields[name_first]="#SerializeJSON( "myFirstName" )#" /> <cfset form.email="#SerializeJSON( "email@domain.com" )#" /> <cfhttp url="https://api.e2ma.net/123/members/add" method="POST" username="username" password="pssword" useragent="#CGI.http_user_agent#" result="objGet"> <!--- add email ---> <cfhttpparam type="formfield" name="email" value='#form.email#' /> <!--- add field: name_first ---> <cfhttpparam type="formfield" name="fields" value='#fields[name_first]#' /> </cfhttp> <cfoutput>#objGet.FileContent#</cfoutput>
再次,我肯定会以某种方式破坏我的数据结构,但我不知道我做错了什么,特别是在正确设置“fields”:{“first_name”:“myFirstName”}结构/数组时.
解决方法
您应该将请求字符串作为httpparam类型的body发送.请求的正文可能类似于您的预制结构的整个表单范围.确保在隐式结构创建期间使用数组符号来设置结构键或将它们置于“引号”中,以确保在serializeJSON()发生时保留其正确的外壳,否则ColdFusion将大写结构键.
<cfset stFields = { "fields" = { "first_name" = "myFirstName" },"email" = "email@domain.com" }> <cfhttp url="http://api.url.com" method="post" result="httpResp" timeout="60"> <cfhttpparam type="header" name="Content-Type" value="application/json" /> <cfhttpparam type="body" value="#serializeJSON(stFields)#"> </cfhttp>
更新10/26/13
对于我最近一直在使用API的所有工作,我想我会更新一个简单的方法来自动化我发现的这个套管.我使用了JSON Util图书馆和Ben Nadel的JSON Serializer Utility CFC 的组合来完成所有回报的更好的序列化一致性.
以下是我如何实现这一点的示例GIST.
https://gist.github.com/timmaybrown/7226809
当我在我的项目中转变为使用持久性实体CFC时,我发现使用我自己的子CFC方法扩展了Ben Nadel的序列化器CFC,它使用getComponentMetaData()函数循环我所有的持久cfc属性,以构建不同键的结构,套管用于序列化.该方法允许我的api自动继承我的实体中的属性名称的外壳,非常有用.在重新启动时有一点开销,但是非常值得保持您的API在您的API中保持一致.
更新9/8/16Re:我上面关于一致的套管.我已经在我的数据库中针对较新的项目倾向于不同的列命名约定,所以我不必与很多这些问题进行斗争. first_name而不是firstName等