php - 将 API 调用从 PHP 和 cURL 转换为 ColdFusion cfhttp
问题描述
我正在尝试编写对在线测试公司的 API 调用。他们在 PHP 和 cURL 中提供了一个示例调用,我需要在 ColdFusion 11 中使用<CFHTTP>
. 到目前为止,我的尝试失败了。我从他们的服务器/API 得到的唯一响应是:
Statuscode = "连接失败。状态码不可用。"
和
ErrorDetail = "I/O 异常:握手期间远程主机关闭连接"。
如果它正常工作,我会得到一个详细说明计算分数的 JSON 字符串。请注意,在下面的代码中,出于安全原因,我更改了一些值,除了它是原始代码。任何建议或意见将不胜感激,谢谢。
这是 ColdFusion/cfhttp 代码:
<cfoutput>
<cfset sdata = [
{
"customerid" = "ACompany",
"studentid" = "test",
"form" = "X",
"age" = "18.10",
"norms" = "grade",
"grade" = "2"
},
{
"scores" = [
{"subtest"="math","score"="34"},
{"score"="23","subtest"="lang"},
{"score"="402","subtest"="rcomp"}
]
}
]>
<!--- create JSON string for request --->
<cfset jsdata = serializeJSON(sdata)>
<!--- make the call --->
<cfhttp method="Get" url="https://www.APIwebsite.php" timeout="10" result="varx">
<cfhttpparam type="header" name="Content-Type" value = "application/json; charset=utf-8"/>
<cfhttpparam type="body" value = "#jsdata#"/>
<cfhttpparam type="header" name="Authorization" value="AuthCode"/>
<cfhttpparam type="header" name="Content-Length" value = "#len(jsdata)#"/>
</cfhttp>
<!--- show results --->
cfhttp return status code: [#varx.statusCode#]<br>
cfhttp return fileContent: [#varx.fileContent#]<br>
</cfoutput>
这是 PHP/cURL 代码:
<?php
$data = array
(
"customerid" => "ACompany",
"studentid" => "test",
"scoringtype" => 2,
"form" => "X",
"age" => "18.10",
"norms" => 'grade',
"grade" => '2',
"scores" => array(
array("subtest" => "math", "score" => "34"),
array("subtest" => "lang", "score" => "23"),
array("subtest" => "rcomp", "score" => "402")
));
$url = 'https://www.APIwebsite.php';
$json_string = json_encode($data);
$headers = array (
"Content-Type: application/json; charset=utf-8",
"Content-Length: " .strlen($json_string),
"Authorization: AuthCode"
);
$channel = curl_init($url);
curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);
curl_setopt($channel, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($channel, CURLOPT_HTTPHEADER, $headers);
curl_setopt($channel, CURLOPT_POSTFIELDS, $json_string);
curl_setopt($channel, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($channel, CURLOPT_CONNECTTIMEOUT, 10);
$response = curl_exec($channel); // execute the request
$statusCode = curl_getInfo($channel, CURLINFO_HTTP_CODE);
$error = curl_error($channel);
curl_close($channel);
http_response_code($statusCode);
if ( $statusCode != 200 ){
echo "Status code: {$statusCode} \n".$error;
} else {
$data = json_decode($response,true);
foreach ($data as $key => $value) {
echo nl2br($key . ': ' . $value . "\n");
}
}
?>
解决方案
首先确保您提供的 url 正确(我知道它是用于示例但 .php 不是有效的域名扩展名),并且 SSL 证书有效
如果两者都正确,则应将请求方法更改POST
为通过正文发送 json 数据
根据http语义
客户端不应在 GET 请求中生成正文。在 GET 请求中接收到的有效负载没有定义的语义,不能改变请求的含义或目标,并且可能导致一些实现拒绝请求并关闭连接,因为它有可能成为请求走私攻击
cfhttp 中有一个 charset 参数,所以你不需要在 header 中发送它
这是一个应该工作的代码
<cfset sdata = [
{
"customerid" = "ACompany",
"studentid" = "test",
"form" = "X",
"age" = "18.10",
"scoringtype" = 2,
"norms" = "grade",
"grade" = "2"
},
{
"scores" = [
{"subtest"="math","score"="34"},
{"score"="23","subtest"="lang"},
{"score"="402","subtest"="rcomp"}
]
}
]>
<!--- create JSON string for request --->
<cfset jsdata = serializeJSON(sdata)>
<!--- make the call --->
<cfhttp method="post" charset="utf-8" url="https://api.website.com/" timeout="10" result="varx">
<cfhttpparam type="header" name="Content-Type" value="application/json"/>
<cfhttpparam type="header" name="Authorization" value="AuthCode"/>
<cfhttpparam type="header" name="Content-Length" value="#len(jsdata)#"/>
<cfhttpparam type="body" value="#jsdata#"/>
</cfhttp>
<!--- show results --->
<cfoutput>
cfhttp return status code: [#varx.statusCode#]<br>
cfhttp return fileContent: [#varx.fileContent#]<br>
</cfoutput>
推荐阅读
- google-analytics - 您可以将两个 Google Analytics(分析)跟踪代码添加到同一个网页吗?
- javascript - 从依赖项中获取文件
- android - 某些 Android 设备的防伪问题
- sql-server - 将 .sql 脚本部署到单个实例上的多个数据库的简单方法
- swift - 使用正则表达式查找多个网址
- c - 将 32 位数字缩小为 16 位数字的有效方法
- java - 颜色类型的方法 setBackground(Color) 未定义
- android - Google Actions 的 Intent 名称无效
- firebase - 用颤振在firestore中增加一个值
- visual-studio-2019 - 运行单元测试时,Visual Studio 不遵守“发生构建或部署错误时,请勿启动”