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