我正在使用 cfhttp 尝试从我们的组织 API 中提取一些 json。当我尝试从我们自己的一台服务器中提取示例 json 时,我的代码可以正常工作,但是当我将它指向 API 本身时,我收到连接失败。这是代码:
<cfhttp method="get" url="http://[url]/api/menu">
<cfhttpparam type="URL" name="id" value="[guid]">
</cfhttp>
<cfset FileWrite("#application.tempDirPath#/temp.json", CFHTTP.FileContent)>
我用 [url] 和 [guid] 替换了实际值。
我曾尝试在浏览器中访问此 url,地址为https://[url]/api/menu?id=[guid],它运行良好,表明我的机器访问该 url 没有问题。该 url 是我们网络中的一个服务器,只要我在公司 VPN 上,我就可以访问它。
我尝试过的事情:
- 实时代码应指向 https。我已经尝试过http和https。
- 我试过在同一个 url 上点击主页,它也导致连接失败,但在浏览器中可以工作。
- 我已经用http://www.google.com尝试过同样的代码,并且下载谷歌 html 没有问题。
- 我试过重新启动 ColdFusion 和我的机器。
我尝试通过标头禁用压缩:
<cfhttp method="get" url="http://[url]/api/menu"> <cfhttpparam type="header" name="Accept-Encoding" value="deflate;q=0" /> <cfhttpparam type="header" name="TE" value="deflate;q=0" /> <cfhttpparam type="URL" name="id" value="[guid]"> </cfhttp>
我无权访问目标服务器。我可以向那些有权寻求帮助的人寻求帮助,但他们此时的结论是“这是一个 ColdFusion 问题。”,所以我不确定我能获得多少帮助。这使我无法检查防火墙规则或用户代理限制;欢迎就在本地测试这些东西的方法提出建议。
编辑
根据对这个问题的评论,我确定 http 只是重定向到该地址的 https。所以我按照ColdFusion https 连接失败中提供的说明导入证书。这样做后,我按照说明验证证书是否已成功导入。然后我重新启动了 CF 服务器。
之后我再次运行我的代码并将 cfhttp 结构作为一个整体转储到临时文件中。结果是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<STRUCT ID="1">
<ENTRY NAME="Errordetail" TYPE="STRING">I/O Exception: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target</ENTRY>
<ENTRY NAME="Mimetype" TYPE="STRING">Unable to determine MIME type of file.</ENTRY>
<ENTRY NAME="Statuscode" TYPE="STRING">Connection Failure. Status code unavailable.</ENTRY>
<ENTRY NAME="Filecontent" TYPE="STRING">Connection Failure</ENTRY>
<ENTRY NAME="Responseheader" TYPE="STRUCT">
<STRUCT ID="2" />
</ENTRY>
<ENTRY NAME="Text" TYPE="BOOLEAN">true</ENTRY>
<ENTRY NAME="Charset" TYPE="STRING" />
<ENTRY NAME="Header" TYPE="STRING" />
</STRUCT>