我正在尝试在 Laravel 中发出 http 客户端请求。我试过直接使用 guzzle 并且它有效,但是当通过 laravel 中的“Guzzle HTTP 客户端周围的 API”进行操作时,我总是得到 400。 我找不到错误在哪里,因为它似乎是正确的。 我举两种情况的例子:
$method = 'post', route 和 $headers 也是一样的
Guzzle(200 次成功):
$client = new \GuzzleHttp\Client();
$response = $client->request($method, $this->BASEURL . $endpoint, [
'body' => '{"name":"testName"}',
'headers' => $headers,
]);
Laravel http 客户端(400 错误请求):
$response = Http::withHeaders($headers)->withBody('{"name":"testName"}', 'application/json')->{$method}($this->BASEURL . $endpoint);
编辑 使用 guzzle 的 AirbnbAPI 示例:
<?php
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();
你用错了
HTTP
包。我们在 Laravel 中使用 HTTP
包的方式是利用 GuzzleHTTP
即 use GuzzleHttp\Psr7\Utils;
例如代码可以是这样的:
use GuzzleHttp\Psr7\Utils;
....
$response = Http::withHeaders($headers)->withBody(Utils::streamFor('{"name":"testName"}'), 'application/json')->{$method}($this->BASEURL . $endpoint);
您可以在 Laravel 官网了解更多关于 GuzzleHTTP 包的信息文档
调用方法时可以直接传入json body作为第二个参数:
$response = Http::withHeaders($headers)->{$method}($this->BASEURL . $endpoint, ['name' => 'testName']);
默认情况下,数据将使用 application/json 内容类型发送。
如果您的
$headers
数组有一个“内容类型”键,它不是 Content-Type
,那么问题可能是您发送了多个内容类型标题。
例如,如果您的
$headers
数组有一个 content-type
键,那么通过调用 withHeaders()
,您正在设置 content-type
标题。
下一次调用
withBody()
会将 Content-Type
标头设置为 application/json
.
由于标头名称是数组中的键,并且它们不相同(数组键区分大小写),因此标头数组将同时包含
content-type
标头和 Content-Type
标头,并且两者都将被发送在请求中。
您需要从
content-type
变量中删除 $headers
条目,或者您需要确保它被设置为 Content-Type
以便 Http 客户端将正确覆盖它。