繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM