gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:18:07 25 4
gpt4 key购买 nike

我对 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 header 完全不同 - 稍后会详细介绍)

第二,当你想要一个 POST 请求时,不要使用 CURLOPT_CUSTOMREQUEST , 使用 CURLOPT_POST .

第三,当将字符串传递给 CURLOPT_POSTFIELDS 时,内容类型隐式变为 Content-Type: application/x-www-urlencoded , 除非你覆盖它。并且您显然不是在发送 x-www-urlencoded 数据,而是 JSON 编码的数据,所以您的内容类型都是错误的,它应该是 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不是实际的 bool 值,而是字符串文字 True - 我错误地将其编码为 json bool 值 true,抱歉,已修复。 (尽管我怀疑它无论如何都应该是一个 bool 值,并且您的原始代码只是将其编码错误,也许您应该在 api 文档中仔细检查 isActive 的类型,假设有一个)

关于PHP cURL 给出错误,但在 POSTMAN 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com