[英]PHP cURL gives an error but works fine in POSTMAN
我的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正常工作,因为我得到了与同一数据成功的响应。 我的问题是:“我的cURL
代码是否有什么错误,可以解释为什么当我使用cURL
并在POSTMAN
获得成功响应时出现POSTMAN
”?
我将不胜感激,如果有人可以帮助我。 非常感谢你。
鉴于您没有向我们展示成功的邮递员请求,我们无法确定您犯了什么错误,也就是说,您在这里犯了两个明显的错误。
首先,在调试curl代码时,请使用CURLOPT_VERBOSE
,它会在调试curl请求时为您提供许多有用的信息(如果您这样做,您可能会注意到Postman请求的content-type
与curl的content-type
完全不同http标头-即将对此进行详细介绍)
其次,当您需要POST请求时,请勿使用CURLOPT_CUSTOMREQUEST
,而应使用CURLOPT_POST
。
第三,将字符串传递给CURLOPT_POSTFIELDS时,除非您将其覆盖,否则内容类型将隐式变为Content-Type: application/x-www-urlencoded
。 并且您显然不是在发送x-www-urlencoded数据,而是JSON编码数据,因此您的content-type都是错误的,它应该是Content-type: application/json
第四,您可以根据需要对json进行硬编码,但是如果您对json_encode进行编码,则代码看起来会更漂亮
第五,不要在未检查返回类型的情况下使用setopt / setopt_array。
修复所有问题后,您将得到如下结果:
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;
}
编辑:修复了json数据,当我编写它时,我没有看到isActive
不是实际的布尔值,而是字符串文字True
我错误地将其编码为json布尔值true,对不起,已修复。 (尽管我怀疑它还是应该是布尔值,并且您的原始代码只是将其编码为错误,但假设您有一个,则应该在api文档中仔细检查isActive
的类型)
@Antonio,您得到的响应来自另一端,可能是您缺少限制另一端查询处理的内容。 尝试打印http_code,或使用curl_getinfo获取完整的信息。
如果响应代码为200,则可以从另一端要求验证请求。
PS:由于回购限制,无法发表评论。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.