Cập nhật: 9/26/2012: Sau khi yêu cầu khóa API với tài khoản demo tôi đã thiết lập, họ đã gửi cho tôi cùng với tài khoản có thể account_id. Tôi đã bỏ mã bên dưới và nó hoạt động như một sự quyến rũ để thêm một thành viên.
Hãy để tôi bắt đầu bằng cách nói rằng
không có mã nào trong số này được kiểm tra
(xem phần cập nhật ở trên). Tôi không có tài khoản MyEmma và dường như bạn phải là khách hàng thanh toán cho tài khoản_id để sử dụng API. Điều đó thổi! Nhưng điều này sẽ giúp bạn thực sự gần gũi và có thể cung cấp cho bạn một số ý tưởng để đóng gói logic, điều này đã trở thành nỗi ám ảnh của tôi.
Thứ hai, tôi nhận thấy bài đăng này đã được 9 tháng tuổi và bạn có thể đã tìm ra nó hoặc giành được xổ số và đang chạy địa điểm ngay bây giờ. Vì vậy, không ai có thể nhìn thấy bài đăng này. Nhưng tôi đang tìm kiếm một số câu trả lời cho bản thân và chạy qua nó ... và kể từ khi xây dựng và phân tích cú pháp JSON là một phần trong cuộc sống hàng ngày của tôi, đây là điều tôi luôn cần phải tiếp tục. Vì vậy, những gì hóa ra là một câu trả lời nhanh cho câu hỏi của bạn, đã trở thành một đêm khuya, tự phục vụ, thách thức ám ảnh. Ở bất kỳ mức giá nào ...
... những gì bạn đang làm với JSON, đang tạo cấu trúc lồng nhau phía khách hàng. Bạn có cấu trúc gốc với hai cặp khóa-giá trị (trường và email). Sau đó, cấu trúc 'các trường' nắm giữ một cấu trúc với cặp khóa-giá trị mà bạn đang gửi qua cho địa chỉ email đó (first_name). Có lẽ bạn có thể gửi thêm.
Bạn đang xây dựng các cấu trúc lồng nhau. Hãy nhớ rằng một khóa trong cấu trúc có thể chứa một cấu trúc. Và những chìa khóa đó có thể giữ cấu trúc, vân vân. Nó có thể trở nên tối và khó chịu như bạn muốn. Nhưng đó là tất cả JSON là ... đó là một đối tượng phía khách hàng.
Vì vậy, đây là công cụ xây dựng dữ liệu và JSON của bạn ...
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "[email protected]";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
</cfscript>
Lưu ý rằng tôi đang thiết lập một cách rõ ràng cấu trúc tên quan trọng với ký hiệu mảng. Chúng ta phải làm điều này để kiểm soát trường hợp với Coldfusion. Nếu không, các phím sẽ nằm trong tất cả các mũ ... không muốn chúng tôi muốn JavaScript có phân biệt chữ hoa chữ thường. Đây có thể là một phần của vấn đề bạn đang gặp phải.
Nếu Emma không hiểu vì trường hợp, sau đó bạn sẽ nhận được của bạn ...
{"error": "Unable to parse JSON request"}
Nhưng khi chúng ta rõ ràng thiết lập tên chủ chốt của chúng tôi sử dụng ký hiệu mảng, và sau đó serialize đối tượng của chúng tôi, chúng tôi nhận được tốt đẹp và đẹp, tốt thời trang ol 'JSON ...
{"fields":{"first_name":"myFirstName"},"email":"[email protected]"}
Vì vậy, dưới đây, tôi đặt yêu cầu http của chúng tôi để Emma trong một chức năng. Một điều rất quan trọng là đặt tiêu đề Kiểu nội dung là application/json, do đó trình duyệt sẽ gửi nó làm đối tượng chứ không phải chỉ là chuỗi văn bản. Và chúng tôi đang gửi JSON của chúng tôi làm phần thân yêu cầu của chúng tôi, không có trong trường biểu mẫu được gọi là 'trường' ... hy vọng điều đó có ý nghĩa khi bạn nói to. Dưới đây là các chức năng ...
<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>
Sau đó, một lần nữa, đây là xây dựng của chúng tôi JSON (cấu trúc lồng nhau) ...
<cfscript>
variables.dataFields = {};
variables.dataFields['fields'] = {};
variables.dataFields['email'] = "[email protected]";
variables.dataFields.fields['first_name'] = "myFirstName";
variables.dataFields = serializejson(variables.dataFields);
</cfscript>
Sau đó, chúng tôi thiết lập các biến để vượt qua các chức năng ...
<cfscript>
variables.entryPoint = "/members/add";
variables.PUBLIC_API_KEY= "PUBLIC_API_KEY";
variables.PRIVATE_API_KEY= "PRIVATE_API_KEY";
</cfscript>
Sau đó, thực hiện cuộc gọi điện thoại ...
<cfscript>
variables.myResponse = callEmma(variables.entryPoint,variables.PUBLIC_API_KEY,variables.PRIVATE_API_KEY,variables.dataFields);
variables.myResponse = deserializejson(variables.myResponse);
</cfscript>
Sau đó chúng tôi nhận phản hồi của chúng tôi, deserialize nó, và đầu ra các biến tuy nhiên chúng tôi muốn.
<cfscript>
if(variables.myResponse.added){
writeoutput("Member " & variables.myResponse.member_id & " added!");
}
else{
writeoutput("There was an error adding this member");
}
</cfscript>
Ngoài ra, tôi thường sử dụng <cfscript>
nhiều nhất có thể. Nó dễ đọc hơn và nó khiến tôi cảm thấy thông minh hơn tôi thực sự. Vì vậy, khi chúng tôi đặt nó tất cả cùng nhau, cho cắt-và-dán, chúng tôi có điều này ...
<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>
Chúa ơi! Tôi đã viết WAY quá nhiều API ... Tôi rõ ràng cần điều trị!
tôi hiểu những gì bạn đang nói, nhưng tôi vẫn đang nhận được { "lỗi": "Không thể phân tích JSON yêu cầu"} trở lại từ API. Điều này có nghĩa là tôi không gửi "email": "email @ domain.com "hoặc" trường ": { thông số" first_name ":" myFirstName "} chính xác trong ví dụ trên của tôi. Đó là những gì tôi cần trợ giúp. Hãy chuyển đúng các chuỗi JSON đó. –