更新:2012年9月26日:请求与我建立了模拟账户的API密钥后,他们给我发了一个伴随着可能ACCOUNT_ID。我将代码放在下面,它的作用就像添加成员的魅力。
让我说
没有这个代码的测试
(见上更新)开始。我没有MyEmma帐户,显然你必须是account_id的付费客户才能使用API。这一击!但是这应该让你真正接近,并可能给你一些封装逻辑的想法,这已经成为我的痴迷。
其次,我意识到这篇文章已经9个月大了,你可能已经很长时间了,或者赢了彩票,现在正在运行这个地方。所以没人会看到这篇文章。但我自己也在寻找一些答案,并且碰到了它......而且由于制定和解析JSON是我日常生活的一部分,这是我始终需要不断设定自己的一部分。所以结果是你的问题的一个快速答案,成为深夜,自我服务,迷恋的挑战。无论如何...
...你在做什么与JSON,正在创建客户端嵌套结构。您有两个键值对(字段和电子邮件)的根结构。然后,结构“字段”保存一个结构,其中包含您为该电子邮件地址(first_name)发送的键值对。大概你可以发送更多。
您正在构建嵌套结构。请记住,一个结构中的关键可以容纳一个结构。而这些键可以容纳结构等等。它可以像你想要的那样变得黑暗和讨厌。但是,所有的JSON都是......这是一个客户端对象。
所以这里是你的数据构建和JSON对象...
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "[email protected]";
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 protected]"}
所以下面,我把我们的HTTP请求到艾玛的功能。对于也非常重要的是将Content-Type标头设置为application/json,因此浏览器将它作为对象发送,而不仅仅是文本字符串。并且我们正在发送我们的JSON作为我们请求的主体,不在名为'fields'的表单字段中......希望当您大声说出时,这是有意义的。这里的功能...
<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 protected]";
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 protected]";
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>
MY GOD!我一直在写太多的API ......我显然需要治疗!
我明白你在说什么,但我仍然得到{“错误”:“无法解析JSON要求“}从API返回。这意味着我没有提交“email”:“email @ domain”。com“或”fields“:{ ”first_name“:”myFirstName“}参数正确地在我上面的例子中,这就是我需要帮助的东西,正确地传递这些JSON字符串 –