AGGIORNAMENTO: 26/09/2012: Dopo aver richiesto una chiave API con l'account demo che ho impostato, me ne hanno inviato uno insieme a may account_id. Ho lasciato cadere il codice in basso e ha funzionato come un fascino per l'aggiunta di un membro.
Vorrei iniziare dicendo che
nessuno di questo codice è testato
(vedere Update sopra). Non ho un account MyEmma e apparentemente devi essere un cliente pagante per un account_id per utilizzare l'API. Che soffia! Ma questo dovrebbe portarti molto vicino e potrebbe darti delle idee per incapsulare la logica, che è diventata la mia ossessione.
In secondo luogo, mi rendo conto che questo post ha 9 mesi e probabilmente lo avete capito da tempo, o avete vinto la lotteria e ora gestite il posto. Quindi nessuno potrà mai nemmeno vedere questo post. Ma stavo cercando alcune risposte io stesso e l'ho incontrato ... e dal momento che la formulazione e l'analisi di JSON sono parte della mia vita quotidiana, questo è qualcosa che ho sempre bisogno di continuare a mettere su me stesso. Quindi quella che si è rivelata una rapida risposta alla tua domanda, è diventata una sfida a tarda notte, egoista, ossessiva. In ogni caso ...
... quello che stai facendo con JSON, sta creando strutture nidificate lato client. Hai la struttura radice con due coppie di valori-chiave (campi e email). Quindi i "campi" della struttura contengono una struttura con la coppia di valori-chiave che invii per quell'indirizzo email (first_name). Presumibilmente è possibile inviare di più.
Si stanno costruendo strutture nidificate. Ricorda che una chiave in una struttura può contenere una struttura. E quelle chiavi possono contenere strutture e così via. Può diventare oscuro e cattivo come vuoi andare. Ma questo è tutto JSON è ... è un oggetto lato client.
Quindi ecco la tua build di dati e l'oggetto JSON ...
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "[email protected]";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
</cfscript>
Nota che sto impostare esplicitamente i nomi dei tasti della struttura con la notazione di matrice. Dobbiamo farlo per controllare il caso con Coldfusion. Altrimenti, le chiavi saranno tutte maiuscole ... non vogliamo che vogliamo per JavaScript sensibile al maiuscolo/minuscolo. Questo potrebbe essere parte del problema che stai avendo.
Se Emma non capisce a causa del caso, allora si dovrebbe ottenere il vostro ...
{"error": "Unable to parse JSON request"}
Ma quando abbiamo fissato i nostri nomi in modo esplicito chiave usando la notazione array, quindi serializzare il nostro oggetto, abbiamo diventa bello e carino, buon vecchio stile JSON ...
{"fields":{"first_name":"myFirstName"},"email":"[email protected]"}
Quindi di seguito, ho inserito la nostra richiesta http su Emma in una funzione. È anche molto importante per impostare l'intestazione Content-Type come application/json, quindi il browser lo invierà come un oggetto e non solo una stringa di testo. E stiamo inviando il nostro JSON come il corpo della nostra richiesta, non in un campo modulo chiamato 'campi' ... speriamo che abbia senso quando lo dici ad alta voce. Ecco la funzione ...
<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>
Poi, ancora una volta, ecco il nostro accumulo JSON (strutture annidate) ...
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "[email protected]";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
</cfscript>
Poi abbiamo impostato le variabili da passare alla funzione ...
<cfscript>
variables.entryPoint = "/members/add";
variables.PUBLIC_API_KEY= "PUBLIC_API_KEY";
variables.PRIVATE_API_KEY= "PRIVATE_API_KEY";
</cfscript>
Poi fare la telefonata ...
<cfscript>
variables.myResponse = callEmma(variables.entryPoint,variables.PUBLIC_API_KEY,variables.PRIVATE_API_KEY,variables.dataFields);
variables.myResponse = deserializejson(variables.myResponse);
</cfscript>
Quindi prendiamo la nostra risposta, deserializziamo e produciamo le variabili come vogliamo.
<cfscript>
if(variables.myResponse.added){
writeoutput("Member " & variables.myResponse.member_id & " added!");
}
else{
writeoutput("There was an error adding this member");
}
</cfscript>
più, io di solito uso <cfscript>
per quanto mi è possibile. È più facile da leggere e mi fa sentire molto più intelligente di quanto lo sia io. Così, quando abbiamo messo tutto insieme, per il taglio-e-incolla, abbiamo questo ...
<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>
mio Dio! Ho scritto WAY troppe API ... Ho chiaramente bisogno di terapia!
capisco quello che stai dicendo, ma sto ancora ricevendo il { "errore": "Impossibile analizzare JSON richiesta"} indietro dall'API. Ciò significa che non invierò la "email": "email @ dominio.com "o" campi ": { " first_name ":" myFirstName "} parametri correttamente nel mio esempio sopra.Questo è quello che ho bisogno di aiuto con. Passando quelle stringhe JSON correttamente –