2012-01-19 36 views
1

我們正在嘗試與需要JSON格式數據的遠程API進行通信。我們試圖如下提交此使用JQuery,但都拿到SOP錯誤:如何使用Coldfusion 9將JSON發佈到遠程URL?

<script type="text/javascript"> 
    $.ajax({ 
    username: 'username', 
    password: 'password', 
    url: "https://api.e2ma.net/123/members/add", 
    dataType: 'json', 
    type: 'POST', 
    data: 
    { 
     "fields": { 
     "name_first": "Name" 
    }, 
    "email": "[email protected]" 
    } 
    }); 
</script> 

不幸的是,他們的API 支持JSONP

我們怎樣才能將這個JSON數據直接從Coldfusion 9中發佈到他們的遠程API?

另外,我們需要做些什麼來從他們的API解析迴應

下面是該文檔的鏈接:http://myemma.com/api-docs/

這裏是一個簡單的代碼片段從這些文檔添加新成員的呼叫:

import_single_member(account_id) 
POST /#account_id/members/add 

Adds or updates an audience member 

Parameters: 

    email (string) – Email address of member to add or update 
    fields (dictionary) – Names and values of user-defined fields to update 
    group_ids (integer) – Optional. Add imported members to this list of groups. 
    signup_form_id – Optional. Indicate that this member used a particular signup form. 

Returns:  
    The member_id of the new or updated member, and whether the member was added or an existing member was updated 

Example: 

POST /123/members/add 
{ 
    "fields": { 
    "first_name": "Benjamin" 
    }, 
    "email": "[email protected]" 
} 

{ 
    "added": true, 
    "member_id": 1024 
} 

感謝。

+0

你想設置,抓住遠程JSON數據服務器上的代理,你再打電話給當地的代理使用JavaScript,它獲取遠程數據,並將其返回給瀏覽器。 jQuery提供了使用'$ .parseJSON()'解碼JSON的能力。您的代理僅充當JavaScript和遠程服務之間的中介,以避免跨域策略問題。 – Jasper

+0

沒有辦法通過直接從CF中發佈這個JSON數據來完全跳過JQuery/JS(從而需要代理)嗎? –

+0

當然,用CF抓取遠程數據,然後以任何你想要的格式輸出。我只提到了JavaScript部分,因爲你用jQuery標記了問題。如果沒有JavaScript,您將不得不重新加載整個頁面以獲取新數據,我認爲只使用服務器端腳本是不利的。 – Jasper

回答

1

您將需要構建代理,因爲您無法從JavaScript將其發佈到其他服務器。你的JS代碼應該是這個樣子:

$.ajax({ 
url: "https://yourserver/proxy.cfm", 
dataType: 'json', 
type: 'POST', 
data: 
"name_first": "Name", 
"email": "[email protected]" 
} 
}); 

而且你的ColdFusion代碼應該是這個樣子:

<cfhttp url="https://api.e2ma.net/123/members/add" method="post" username="username" password="password"> 
    <cfhttpparam name="email" value="#form.email#"> 
    <cfhttpparam name="fields" value='{"name_first":"#form.name_first#"}'> 
</cfhhtp> 

我不知道,如果場將在需要的格式,但TI應八九不離十。

您也可以返回不管你回去的JavaScript這樣你的帖子後:

<cfoutput>#cfhttp.filecontent#<cfoutput> 
+0

好的,所以我們需要使用cfhttp。既然如此,爲了使這個儘可能模塊化,我們可以在ajax調用中指定不同的方法,這會在proxy.cfm中指向不同的cfhttp調用?一個用於添加,一個用於刪除等等? –

+0

當然。爲了簡單起見,您可以使用cfswitch,併爲每個需要使用的方法提供一個案例。你也可以使ColdFusion代碼具有足夠的通用性,以便將需要的任何內容傳遞到另一臺服務器上。但是,如果不知道其他服務器的API以及它期望的字段和集合類型,我不想從那裏開始。 –