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