PHP cURL给出错误但在POSTMAN中工作正常

时间:2017-07-21 09:09:09

标签: php api curl 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运行正常,因为我使用相同的数据得到了成功的响应。我的问题是:&#34;我的cURL代码是否有任何问题可以解释为什么我在使用cURL时遇到错误并且我在POSTMAN&#34得到了成功的回复;

如果有人能帮助我,我将不胜感激。 非常感谢你。

2 个答案:

答案 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:由于回购限制无法发表评论。