更新:2012 年 9 月 26 日:在使用我设置的演示帐户请求 API 密钥后,他们向我发送了一个可能的帐户 ID。我将代码放在下面,它就像添加成员的魅力。
首先让我说这些代码都没有经过测试 (参见上面的更新)。我没有 MyEmma 帐户,显然您必须成为 account_id 的付费客户才能使用 API。那吹!但这应该让你真正接近,并且可能会给你一些封装逻辑的想法,这已经成为我的痴迷。
其次,我意识到这篇文章已经 9 个月大了,你可能早就想通了,或者中了彩票并且现在正在运行这个地方。所以没有人甚至可能会看到这篇文章。但是我自己在寻找一些答案并遇到了它......并且由于制定和解析 JSON 是我日常生活的一部分,所以我总是需要继续努力。所以结果是对你问题的快速回答,变成了一个深夜、自我服务、强迫性的挑战。好歹...
...您使用 JSON 所做的是创建客户端嵌套结构。您拥有包含两个键值对(字段和电子邮件)的根结构。然后结构“字段”包含一个结构,其中包含您为该电子邮件地址(first_name)发送的键值对。大概你可以发送更多。
您正在构建嵌套结构。请记住,结构中的键可以保存结构。这些键可以保存结构,等等。它可以变得像你想要的那样黑暗和讨厌。但这就是 JSON 的全部内容......它是一个客户端对象。
所以这是您的数据构建和 JSON 对象...
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "email@domain.com";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
</cfscript>
请注意,我使用数组表示法显式设置结构键名称。我们必须这样做以控制 Coldfusion 的情况。否则,键将全部大写......不希望我们想要区分大小写的 JavaScript。这可能是您遇到的问题的一部分。
如果艾玛因为案件不明白,那么你会得到你的......
{"error": "Unable to parse JSON request"}
但是当我们使用数组表示法显式设置我们的键名,然后序列化我们的对象时,我们会得到漂亮、漂亮、时尚的 JSON...
{"fields":{"first_name":"myFirstName"},"email":"email@domain.com"}
所以下面,我把我们对 Emma 的 http 请求放在一个函数中。将 Content-Type 标头设置为 application/json也很重要,因此浏览器会将其作为对象发送,而不仅仅是文本字符串。我们将 JSON 作为请求的主体发送,而不是在名为“字段”的表单字段中发送……希望当你大声说出来时这很有意义。这是功能...
<cffunction name="callEmma" access="private" displayname="CallEmma" description="This makes an HTTP REQUEST to MyEmma" returnformat="JSON" output="false" returntype="Any">
<cfargument name="endpoint" required="true" type="string" displayname="EndPoint">
<cfargument name="PUBLIC_API_KEY" required="true" type="string" displayname="PUBLIC_API_KEY">
<cfargument name="PRIVATE_API_KEY" required="true" type="string" displayname="PRIVATE_API_KEY">
<cfargument name="dataFields" required="true" type="struct" displayname="DataFields">
<cfscript>
local = {};
local.baseURL = "https://api.e2ma.net/";
local.account_id = "12345";
local.phoneNumber = local.baseURL & local.account_id & arguments.endPoint;
local.connection = new http();
local.connection.setMethod("POST");
local.connection.setUrl(local.phoneNumber);
local.connection.setUsername(arguments.PUBLIC_API_KEY);
local.connection.setPassword(arguments.PRIVATE_API_KEY);
local.connection.setUserAgent(cgi.http_user_agent);
local.connection.addParam(type="header",name="Content-Type", value="application/json");
local.connection.addParam(type="body", value=arguments.dataFields);
local.objGet = local.connection.send().getPrefix();
local.content = local.objGet.filecontent;
return local.content
</cfscript>
</cffunction>
然后再一次,这是我们的 JSON 构建(嵌套结构)......
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "email@domain.com";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
</cfscript>
然后我们设置要传递给函数的变量...
<cfscript>
variables.entryPoint = "/members/add";
variables.PUBLIC_API_KEY= "PUBLIC_API_KEY";
variables.PRIVATE_API_KEY= "PRIVATE_API_KEY";
</cfscript>
然后打电话...
<cfscript>
variables.myResponse = callEmma(variables.entryPoint,variables.PUBLIC_API_KEY,variables.PRIVATE_API_KEY,variables.dataFields);
variables.myResponse = deserializejson(variables.myResponse);
</cfscript>
然后我们接受我们的响应,反序列化它,并输出我们想要的变量。
<cfscript>
if(variables.myResponse.added){
writeoutput("Member " & variables.myResponse.member_id & " added!");
}
else{
writeoutput("There was an error adding this member");
}
</cfscript>
再说了,我通常<cfscript>
尽可能多地使用。它更容易阅读,它让我感觉自己比实际聪明得多。所以当我们把它们放在一起,为了剪切和粘贴,我们有这个......
<cfscript>
// Function to make our calls to Emma
private any function callEmma(required string endPoint,required string PUBLIC_API_KEY,required string PRIVATE_API_KEY,required string dataFields)
description="This makes an HTTP REQUEST to MyEmma"
displayname="CallEmma"
returnformat="JSON"
output="false"
{
local = {};
local.baseURL = "https://api.e2ma.net/";
local.account_id = "12345";
local.phoneNumber = local.baseURL & local.account_id & arguments.endPoint;
local.connection = new http();
local.connection.setMethod("POST");
local.connection.setUrl(local.phoneNumber);
local.connection.setUsername(arguments.PUBLIC_API_KEY);
local.connection.setPassword(arguments.PRIVATE_API_KEY);
local.connection.setUserAgent(cgi.http_user_agent);
local.connection.addParam(type="header",name="Content-Type", value="application/json");
local.connection.addParam(type="body",value=arguments.dataFields);
local.objGet = local.connection.send().getPrefix();
local.content = local.objGet.filecontent;
return local.content;
}
// Put our data together
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "email@domain.com";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
// Define the parameters for our call to Emma
variables.entryPoint = "/members/add";
variables.PUBLIC_API_KEY= "PUBLIC_API_KEY";
variables.PRIVATE_API_KEY= "PRIVATE_API_KEY";
// Call Emma
variables.myResponse = callEmma(variables.entryPoint,variables.PUBLIC_API_KEY,variables.PRIVATE_API_KEY,variables.dataFields);
variables.myResponse = deserializejson(variables.myResponse);
//Output to browser
if(variables.myResponse.added){
writeoutput("Member " & variables.myResponse.member_id & " added!");
}
else{
writeoutput("There was an error adding this member");
}
</cfscript>
我的上帝!我一直在写太多的 API ......我显然需要治疗!