2012-01-19 35 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以及它期望的字段和集合类型,我不想从那里开始。 –