ОБНОВЛЕНИЕ: 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@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"}
Итак, ниже я помещаю наш 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>
Затем мы берем наш ответ, десериализуем его и выводим переменные так, как хотим.1053 *
Больше я обычно использую <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 ... Мне явно нужна терапия!