如何使用ColdFusion CFHTTP将JSON数据发送到远程API

前端之家收集整理的这篇文章主要介绍了如何使用ColdFusion CFHTTP将JSON数据发送到远程API前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我相信我完全搞砸了这个,但是在Stack Overflow用户的帮助下我得到了很多,所以感谢至此.

我需要将JSON数据发送到远程API.显然,由于SOP问题,我无法使用jQuery,远程API不支持JSONP.

我也不想使用任何类型的代理来绕过SOP限制.

根据API文档(http://myemma.com/api-docs/),这是他们期望的数据的格式(请求和响应数据以JSON传输):

POST https://api.e2ma.net//123/members/add
{
  "fields": {
    "first_name": "myFirstName"
  },"email": "email@domain.com"
}

这是我迄今为止所建立的,但仍然从远程API接收“无法解析JSON”错误

<cfset fields[name_first]="#SerializeJSON( "myFirstName" )#" />
<cfset form.email="#SerializeJSON( "email@domain.com" )#" />

<cfhttp
  url="https://api.e2ma.net/123/members/add"
  method="POST"
  username="username"
  password="pssword"
  useragent="#CGI.http_user_agent#"
  result="objGet">

  <!--- add email --->
  <cfhttpparam
    type="formfield"
    name="email"
    value='#form.email#'
  />

  <!--- add field: name_first --->
  <cfhttpparam
    type="formfield"
    name="fields"
    value='#fields[name_first]#'
  />

</cfhttp>

<cfoutput>#objGet.FileContent#</cfoutput>

再次,我肯定会以某种方式破坏我的数据结构,但我不知道我做错了什么,特别是在正确设置“fields”:{“first_name”:“myFirstName”}结构/数组时.

解决方法

您应该将请求字符串作为httpparam类型的body发送.请求的正文可能类似于您的预制结构的整个表单范围.确保在隐式结构创建期间使用数组符号来设置结构键或将它们置于“引号”中,以确保在serializeJSON()发生时保留其正确的外壳,否则ColdFusion将大写结构键.
<cfset stFields = {
    "fields" = {
        "first_name" = "myFirstName"
     },"email" = "email@domain.com"
}>   

<cfhttp url="http://api.url.com" method="post" result="httpResp" timeout="60">
    <cfhttpparam type="header" name="Content-Type" value="application/json" />
    <cfhttpparam type="body" value="#serializeJSON(stFields)#">
</cfhttp>

更新10/26/13
对于我最近一直在使用API​​的所有工作,我想我会更新一个简单的方法自动化我发现的这个套管.我使用了JSON Util图书馆和Ben Nadel的JSON Serializer Utility CFC 的组合来完成所有回报的更好的序列化一致性.

以下是我如何实现这一点的示例GIST.
https://gist.github.com/timmaybrown/7226809

当我在我的项目中转变为使用持久性实体CFC时,我发现使用我自己的子CFC方法扩展了Ben Nadel的序列化器CFC,它使用getComponentMetaData()函数循环我所有的持久cfc属性,以构建不同键的结构,套管用于序列化.该方法允许我的api自动继承我的实体中的属性名称的外壳,非常有用.在重新启动时有一点开销,但是非常值得保持您的API在您的API中保持一致.

更新9/8/16Re:我上面关于一致的套管.我已经在我的数据库中针对较新的项目倾向于不同的列命名约定,所以我不必与很多这些问题进行斗争. first_name而不是firstName等

猜你在找的JavaScript相关文章