更新: 2012 年 9 月 26 日: 私がセットアップしたデモ アカウントで API キーをリクエストしたところ、5 月の account_id と共に 1 つが送られてきました。以下にコードをドロップすると、メンバーを追加するための魅力のように機能しました。
まず、このコードはテストされていません (上記の更新を参照)。私は MyEmma アカウントを持っていません。API を使用するには、account_id に対して有料の顧客である必要があるようです。それが吹く!しかし、これはあなたを本当に近づけるはずであり、私の強迫観念になっているロジックをカプセル化するためのいくつかのアイデアを与えるかもしれません.
第二に、この投稿は 9 か月前のものであり、おそらく長い間それを理解しているか、宝くじに当選してその場所を運営していることに気づきました。したがって、誰もこの投稿を見ることさえありません。しかし、私は自分でいくつかの答えを探していて、偶然見つけました... JSON の作成と解析は私の日常生活の一部であるため、これは常に自分自身をまっすぐに設定し続ける必要があるものです. それで、あなたの質問への素早い答えであることが判明したのは、深夜の自己奉仕的で強迫的な挑戦になりました. とにかく...
...JSON で行っていることは、クライアント側のネストされた構造を作成することです。2 つのキーと値のペア (フィールドと電子メール) を持つルート構造があります。次に、構造体 '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 には望ましくありません。これは、あなたが抱えている問題の一部である可能性があります。
エマが大文字と小文字を区別して理解できない場合、あなたはあなたの...
{"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 を書いてきました...明らかに治療が必要です!