ОБНОВЛЕНИЕ: 26.09.2012: после запроса ключа API с демонстрационной учетной записью, которую я настроил, они отправили мне его вместе с may account_id. Я разместил код ниже, и он отлично сработал при добавлении участника.
Позвольте мне начать с того, что ни один из этих кодов не протестирован (см. Обновление выше). У меня нет учетной записи MyEmma, и, очевидно, вы должны быть платным клиентом для account_id, чтобы использовать API. Это дует! Но это должно приблизить вас и может дать вам некоторые идеи для инкапсуляции логики, которая стала моей навязчивой идеей.
Во-вторых, я понимаю, что этому посту 9 месяцев, и вы, вероятно, либо давно в этом разобрались, либо выиграли в лотерею и уже управляете этим местом. Так что никто не может даже увидеть этот пост. Но я сам искал ответы и наткнулся на них ... и, поскольку формулировка и анализ JSON - часть моей повседневной жизни, это то, что мне всегда нужно, чтобы настроить себя прямо. То, что оказалось быстрым ответом на ваш вопрос, превратилось в ночной, корыстный, навязчивый вызов. Во всяком случае...
... то, что вы делаете с JSON, создает вложенные структуры на стороне клиента. У вас есть корневая структура с двумя парами ключ-значение (поля и электронная почта). Затем структура «fields» содержит структуру с парой ключ-значение, которую вы отправляете для этого адреса электронной почты (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 в качестве тела нашего запроса, а не в поле формы под названием «поля» ... надеюсь, это имеет смысл, когда вы произносите это вслух. Вот функция ...
<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>
Боже мой! Я писал слишком много API ... Мне явно нужна терапия!
person
Steve Reich
schedule
25.09.2012