我有一些PHP cURL的问题。我试图使用PHP cURL从API获取数据。这是我在PHP中的cURL代码:
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://www.example.com/dos/AW/API",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "{\"Filter\" : {\"IsActive\" : \"True\",\"OutputSelector\" : \"Name\"}}",
CURLOPT_HTTPHEADER => array(
"API_ACTION: GetItem",
"API_KEY: MHlIARzQqxVpOg2dUxH4q9w7bx3pOL6K",
"Accept: application/json"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
?>
使用该代码我可以获得响应,但响应包含一些错误。我也尝试使用POSTMAN
进行检查,并且API运行正常,因为我使用相同的数据得到了成功的响应。我的问题是:&#34;我的cURL
代码是否有任何问题可以解释为什么我在使用cURL
时遇到错误并且我在POSTMAN
&#34得到了成功的回复;
如果有人能帮助我,我将不胜感激。 非常感谢你。
答案 0 :(得分:2)
首先,在调试curl代码时,使用CURLOPT_VERBOSE
,在调试你的curl请求时会告诉你很多有用的信息(如果这样做,你可能会注意到Postman请求的{{1} }与curl的content-type
http标题完全不同 - 很快就会有更多内容
第二,如果您想要POST请求,请不要使用content-type
,请使用CURLOPT_CUSTOMREQUEST
。
第三,将字符串传递给CURLOPT_POSTFIELDS时,内容类型隐式变为CURLOPT_POST
,除非您覆盖它。你显然不是发送x-www-urlencoded数据,而是发送JSON编码的数据,所以你的内容类型都错了,它应该是Content-Type: application/x-www-urlencoded
第四,你可以根据需要对json进行硬编码,但是如果json_encode它代码看起来更漂亮
第五,不要在不检查返回类型的情况下使用setopt / setopt_array。
解决所有问题,你最终会得到类似的东西:
Content-type: application/json
编辑:修复了json数据,当我写它时,我没有看到function ecurl_setopt_array($ch, array $options) {
if (! curl_setopt_array ( $ch, $options )) {
throw new \RuntimeException ( 'curl_setopt_array failed. ' . curl_errno ( $ch ) . ': ' . curl_error ( $ch ) );
}
}
$curl = curl_init ();
ecurl_setopt_array ( $curl, array (
CURLOPT_URL => "https://www.example.com/dos/AW/API",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_VERBOSE => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode ( array (
'Filter' => array (
'IsActive' => 'True',
'OutputSelector' => 'Name'
)
) ),
CURLOPT_HTTPHEADER => array (
"API_ACTION: GetItem",
"API_KEY: MHlIARzQqxVpOg2dUxH4q9w7bx3pOL6K",
"Accept: application/json",
'Content-Type: application/json'
)
) );
$response = curl_exec ( $curl );
$err = curl_error ( $curl );
curl_close ( $curl );
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
不是实际的布尔值,而是字符串文字isActive
- 我错误地将其编码为json布尔值相反,抱歉,修复。 (虽然我怀疑它应该是一个布尔值,并且你的原始代码只是编码错了,也许你应该仔细检查api文档中的True
类型,假设有一个)
答案 1 :(得分:1)
@Antonio,你得到的回复来自另一端,可能是你遗漏了限制另一端查询处理的东西。尝试打印http_code,或使用curl_getinfo获取完整信息。
如果响应代码为200,那么您可以从另一端请求验证请求。
PS:由于回购限制无法发表评论。