更新:2012年9月26日:在请求我设置的演示账户的API密钥后,他们向我发送了一个API密钥并附带我的账户ID。我将代码放在下面,它可以很好地用于添加成员。
首先,让我说一下,这段代码没有经过测试 (参见上面的更新)。我没有MyEmma账户,显然你必须是付费客户才能使用API的账户ID。这太糟糕了!但这应该让你接近实际情况,并可能给你一些封装逻辑的想法,这已经成为我的追求。
其次,我意识到这篇文章已经有9个月了,你可能已经长时间弄清楚了,或者已经赢得彩票并且现在正在运营这个地方。所以可能根本没有人会看到这篇文章。但我自己也在寻找答案,并偶然发现了它……由于构建和解析JSON是我日常生活的一部分,我总是需要保持清晰的思路。因此,对你的问题的快速回答变成了深夜的、自私的、着迷的挑战。无论如何……
……你正在使用JSON创建客户端嵌套结构。你有根结构,其中包含两个键值对(fields和email)。然后,'fields'结构保存了一个键值对,你正在为该电子邮件地址发送的内容(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。这可能是您遇到问题的一部分。>
<如果 Emma 由于大小写原因而无法理解,则会出现问题...>
{"error": "Unable to parse JSON request"}
但是当我们使用数组表示法明确设置键名,然后序列化对象时,我们会得到漂亮的、传统的JSON格式...
{"fields":{"first_name":"myFirstName"},"email":"email@domain.com"}
下面是我们向Emma发送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@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>
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;
}
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "email@domain.com";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
variables.entryPoint = "/members/add";
variables.PUBLIC_API_KEY= "PUBLIC_API_KEY";
variables.PRIVATE_API_KEY= "PRIVATE_API_KEY";
variables.myResponse = callEmma(variables.entryPoint,variables.PUBLIC_API_KEY,variables.PRIVATE_API_KEY,variables.dataFields);
variables.myResponse = deserializejson(variables.myResponse);
if(variables.myResponse.added){
writeoutput("Member " & variables.myResponse.member_id & " added!");
}
else{
writeoutput("There was an error adding this member");
}
</cfscript>
天啊!我写太多的API了...我显然需要治疗!
<cfset stFields = { "fields" = { "first_name" = "myFirstName", "is_active" = javaCast('Boolean', true) } }>
这将导致以下JSON字符串:{"fields":{"first_name":"myFirstName","is_active":true},"email":"email@domain.com"}
- timbrown