我正在尝试在Laravel中发出HTTP客户端请求。我试过直接使用Guzzle,它工作正常,但当通过Laravel中的“Guzzle HTTP客户端周围的API”进行时,我总是得到400。我找不到错误在哪里,因为它似乎是正确的。我给予这两个例子。
$method = 'post',route和$headers也是一样的。
狂饮(200成功)
$client = new \GuzzleHttp\Client();
$response = $client->request($method, $this->BASEURL . $endpoint, [
'body' => '{"name":"testName"}',
'headers' => $headers,
]);
Laravel HTTP客户端(400 bad request)
$response = Http::withHeaders($headers)
->withBody('{"name":"testName"}', 'application/json')
->{$method}($this->BASEURL . $endpoint);
使用Guzzle的AirbnbAPI示例
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.airbnb.com/v2/listings', [
'body' => '{"name":"erer"}',
'headers' => [
'X-Airbnb-API-Key' => 'XXXXXXXX',
'X-Airbnb-OAuth-Token' => 'XXXXXX',
'X-Airbnb-Req-Api-Version' => '2022.12.31',
'accept' => 'application/json',
'content-type' => 'application/json',
],
]);
echo $response->getBody();
2条答案
按热度按时间j13ufse21#
你可以在调用方法时直接传入json body作为第二个参数:
默认情况下,数据将使用application/json内容类型发送。
jdgnovmf2#
如果你的
$headers
数组有一个“content-type”键,但它的大小写不是Content-Type
,那么问题可能是你发送了多个content-type头。例如,如果
$headers
数组有一个content-type
键,那么通过调用withHeaders()
,您将设置content-type
头。下一次调用
withBody()
将把Content-Type
头设置为application/json
。由于header名称是数组中的键,并且它们不相同(数组键区分大小写),因此header数组将以
content-type
header和Content-Type
header结束,并且两者都将在请求中发送。您要么需要从
$headers
变量中删除content-type
条目,要么需要确保它的大小写为Content-Type
,以便Http客户端正确覆盖它。