簡體   English   中英

耗時POST請求導致500錯誤,即使該方法的Curl起作用

[英]Guzzle POST request results in 500 error even though Curl for that works

我有以下用於擊中POST API的PHP代碼塊

$client = new \GuzzleHttp\Client(['debug'=>true]);
$response = $client->request(
    $request_method,
    $request_url,
    [
        'json' => $request_data,
        'http_errors' => false
    ]
);

$http_code = $response->getStatusCode();

盡管在調試日志中正確列出了所有標頭,但仍導致來自服務器的500響應,如下所示:

* Hostname was NOT found in DNS cache
*   Trying 52.xxx.xx.xx...
* Connected to <<hostname>> (52.xxx.xx.xx) port 80 (#0)
> POST /api/rest/auth_key HTTP/1.1
User-Agent: GuzzleHttp/6.2.1 curl/7.38.0 PHP/7.0.9-1~dotdeb+8.1
Content-Type: application/json
Host: <<hostname>>
Content-Length: 42

* upload completely sent off: 42 out of 42 bytes

上面的$ request_url是POST請求的完整URL。
$ request_data是要發送的JSON內容(PHP關聯數組)。
$ request_method'POST'

即使我從請求中刪除json數據,並期望從API獲得400響應,我仍然會遇到同樣的500錯誤。 通過Curl觸發的相同請求可以在以下代碼中正常工作:

$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => $request_url,
  CURLOPT_CUSTOMREQUEST => $request_method,
  CURLOPT_POSTFIELDS => json_encode($request_data),
  CURLOPT_HTTPHEADER => [
    "content-type: application/json"
  ],
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

已經嘗試調試了很長時間,甚至在SO中尋找類似的參考資料,但均無濟於事。 在這方面的任何幫助將是巨大的。

由於我的聲譽不高,因此我無法發表評論,因此,如果這不能回答您的問題或無法解決問題,請提前抱歉。

我曾經遇到過類似的問題,其中cURL正常工作,但是卻收到500個響應或400個錯誤的請求(請求太長)。 事實證明,當您在POST請求的第三個參數中包含json數據時,該數據將被包含在請求的標頭中。

該文檔提供了一些示例,其中將GuzzleHttp\\Psr7\\Request類的第四個參數用作請求的主體(請參見http://docs.guzzlephp.org/en/stable/psr7.html )。 一旦使用了它並在標題中顯式設置了內容類型,我的問題就解決了。

這意味着您的請求將如下所示:

$response = $client->request(
    $request_method,
    $request_url,
    ['Content-Type'=>'application/json'],
    json_encode($request_data)
);

希望這也會對您有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM