更新: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字符串 –