簡體   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