我确信我完全搞砸了,但是在Stack Overflow用户的帮助下我得到了这么多,所以非常感谢到目前为止.
我需要将JSON数据POST到远程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"
}
Run Code Online (Sandbox Code Playgroud)
这是我迄今为止构建的,但继续从远程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>
Run Code Online (Sandbox Code Playgroud)
同样,我肯定会以某种方式破坏我的数据结构,但我不确定我做错了什么,特别是关于正确设置"fields":{"first_name":"myFirstName"}结构/数组.
我有一个现有的CFC,在将结构传递给方法时工作正常.
问题是,我们现在还需要通过JSON将数据传递到同一个函数中.
这是CFC片段:
<cffunction
name="subscribeAPI"
access="remote"
returntype="struct"
returnformat="json"
output="false">
<cfargument
name="structure"
type="struct"
required="true"
hint="data structure received from call">
<cfif StructKeyExists(arguments.structure, "listID")
AND len(arguments.structure.listID)>
...
</cfif>
<cfreturn LOCAL />
Run Code Online (Sandbox Code Playgroud)
以下是我们传递结构的方式:
<cfset preStruct = {
apiAction="Create",
listID="1463",
email="#form.cartEmail#",
firstname="#form.first_name#",
preCart="#now()#",
planDescription="#application.name.site#"
}
/>
<cfscript>voidReturn = application.goxObj.subscribeAPI(preStruct);</cfscript>
Run Code Online (Sandbox Code Playgroud)
现在,我们还需要传递以下内容,但由于CFC期望结构,显然会出现错误:
function HandleSubscribe(){
$j.getJSON(
"/com/list.cfc?wsdl",
{
method : "subscribeAPI",
action : "Create",
listID : $j( "#listID" ).val(),
triggerKey : $j( "#triggerKey" ).val(),
email : $j( "#emailNL" ).val(),
firstname : $j( "#firstnameNL" ).val()
},
handleSubscribeCallback
);
Run Code Online (Sandbox Code Playgroud)
} …