【问题标题】:ColdFusion Rest API to SCOUT - Content-Type: application/vnd.api+jsonColdFusion Rest API 到 SCOUT - 内容类型:application/vnd.api+json
【发布时间】:2020-01-22 18:32:04
【问题描述】:

我正在尝试使用 ColdFusion 运行一个简单的 REST api,并且无论尝试如何都收到相同的错误。 使用 4 个参数,该调用在 Postman 中运行良好。但无法在 ColdFusion CFHTTP 中重新创建。

<cfhttp url="https://api.sandbox.scoutrfp.com/v3/contracts" method="GET" result="ITEM_INFO">
    <cfhttpparam type="header" name="X-Api-Key" value="#variables.API_KEY#">
    <cfhttpparam type="header" name="X-User-Token" value="#variables.USER_TOKEN#">
    <cfhttpparam type="header" name="Content-Type" value="application/vnd.api+json">
    <cfhttpparam type="header" name="X-User-Email" value="#variables.USER_EMAIL#"> 
</cfhttp>

我已将标题替换为 cgi 类型为

<cfhttpparam type="CGI" encoded="false" name="Content_Type" value="application/vnd.api+json">

我已添加邮递员发送的所有临时标头。

总是相同的错误:JSON:API 的 Content-Type 标头丢失或不正确:预期的请求包括 'Content-Type: application/vnd.api+json

似乎 CFHTTP 标记未正确发送值“application/vnd.api+json” - 可能以某种方式对其进行了错误编码?是否有另一种方法可以通过 CFHTTP 发送此 Content-Type 以获得响应?

【问题讨论】:

  • 您是否尝试过使用 content-type 作为 application/json ?
  • 我做到了 - 但供应商实际上希望将 application/vnd.api+json 视为内容类型...
  • 切换到“POST”方法会发生什么?

标签: rest api coldfusion coldfusion-2016 cfhttpparam


【解决方案1】:

content-type application/vnd.api+json 对于 ColdFusion 来说可能太新了。

通过 HTTP 发送内容类型标头的另一种方法是使用 Curl

(代码中的意图是将结果保存在当前目录,即包含这个CFM文件的目录)

<!--- Use your own path to the Curl executable --->

<cfexecute name = "C:\bin\curl-7.35.0-win64\bin\curl.exe" 
     arguments = ' -H "X-Api-Key:#variables.API_KEY#" -H "X-User-Token:#variables.USER_TOKEN#" -H "Content-Type:application/vnd.api+json" -H  "X-User-Email:#variables.USER_EMAIL#" https://api.sandbox.scoutrfp.com/v3/contracts ' 
outputfile="#expandPath('.')#\ITEM_INFO.html" />

【讨论】:

  • 我的想法也是ColdFusion 2016至少不支持content-type application/vnd.api+json。我已经能够让 cfexecute 保存到文件中。它不会将结果保存到变量中。并且尝试读取 html 页面(或 txt 或 .json)不会加载到可用的 json 中。如何将 api 结果合并回一个可用的 JSON 变量,就好像它来自 CFHTTP。
  • 问题似乎是在编写 html 文件并尝试在同一代码中读取。该文件尚未识别的样子。如果我对之前创建的文件运行代码(实际上没有通过 curl 再次运行 api),它将加载。仍然会产生需要使用 json 的问题 - cfexecute 有一个变量参数 - 为什么它不会像 cfhttp 那样保存 json?
【解决方案2】:

在将方法更改为 POST 后为 X-HTTP-Method-Override = GET 使用额外的标头有效。 Curl 解决方案还可以在 cfexecute 之后和尝试读取使用返回的 api 内容写入的新创建文件之前插入。

 <cfhttp url="https://#variables.ENVIRONMENT#/v3/contracts" method="POST" result="ITEM_INFO">

            <cfhttpparam type="header" name="X-Api-Key" value="#variables.API_KEY#">
            <cfhttpparam type="header" name="X-User-Token" value="#variables.USER_TOKEN#">
            <cfhttpparam type="header" name="Content-Type" value="application/vnd.api+json">
            <cfhttpparam type="header" name="X-User-Email" value="#variables.USER_EMAIL#">
            <cfhttpparam type="header" name="X-HTTP-Method-Override" value="GET">
    </cfhttp>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 2015-03-19
    • 2020-07-16
    • 1970-01-01
    • 2017-08-28
    • 2020-03-20
    • 2019-08-01
    相关资源
    最近更新 更多