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

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

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

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

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

  1. POST https://api.e2ma.net//123/members/add
  2. {
  3. "fields": {
  4. "first_name": "myFirstName"
  5. },"email": "email@domain.com"
  6. }

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

  1. <cfset fields[name_first]="#SerializeJSON( "myFirstName" )#" />
  2. <cfset form.email="#SerializeJSON( "email@domain.com" )#" />
  3.  
  4. <cfhttp
  5. url="https://api.e2ma.net/123/members/add"
  6. method="POST"
  7. username="username"
  8. password="pssword"
  9. useragent="#CGI.http_user_agent#"
  10. result="objGet">
  11.  
  12. <!--- add email --->
  13. <cfhttpparam
  14. type="formfield"
  15. name="email"
  16. value='#form.email#'
  17. />
  18.  
  19. <!--- add field: name_first --->
  20. <cfhttpparam
  21. type="formfield"
  22. name="fields"
  23. value='#fields[name_first]#'
  24. />
  25.  
  26. </cfhttp>
  27.  
  28. <cfoutput>#objGet.FileContent#</cfoutput>

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

解决方法

您应该将请求字符串作为httpparam类型的body发送.请求的正文可能类似于您的预制结构的整个表单范围.确保在隐式结构创建期间使用数组符号来设置结构键或将它们置于“引号”中,以确保在serializeJSON()发生时保留其正确的外壳,否则ColdFusion将大写结构键.
  1. <cfset stFields = {
  2. "fields" = {
  3. "first_name" = "myFirstName"
  4. },"email" = "email@domain.com"
  5. }>
  6.  
  7. <cfhttp url="http://api.url.com" method="post" result="httpResp" timeout="60">
  8. <cfhttpparam type="header" name="Content-Type" value="application/json" />
  9. <cfhttpparam type="body" value="#serializeJSON(stFields)#">
  10. </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相关文章