laravel 使用Guzzle获取HTTP客户端400错误

d4so4syb  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(226)

我正在尝试在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();
j13ufse2

j13ufse21#

你可以在调用方法时直接传入json body作为第二个参数:

$response = Http::withHeaders($headers)->{$method}($this->BASEURL . $endpoint, ['name' => 'testName']);

默认情况下,数据将使用application/json内容类型发送。

jdgnovmf

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客户端正确覆盖它。

相关问题