Я пытаюсь сделать HTTP-запрос клиента в Laravel. Я пытался использовать Guzzle напрямую, и это работает, но когда я делаю это через «API вокруг HTTP-клиента Guzzle» в Laravel, я всегда получаю 400. Я не могу найти, где ошибка, поскольку она кажется правильной. Я привожу пример двух случаев.
$method = 'post', а также route и $headers.
Жрать (200 успехов)
$client = new \GuzzleHttp\Client();
$response = $client->request($method, $this->BASEURL . $endpoint, [
'body' => '{"name":"testName"}',
'headers' => $headers,
]);
HTTP-клиент Laravel (400 неверных запросов)
$response = Http::withHeaders($headers)
->withBody('{"name":"testName"}', 'application/json')
->{$method}($this->BASEURL . $endpoint);
Пример из AirbnbAPI с использованием Guzzle
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();
Нет, базовый URL инициализируется в классе. В обоих случаях это одно и то же
В вашей переменной $headers определен тип контента? Если это так, а ключ не 'Content-Type' (с учетом регистра), это может вызвать вашу проблему.
Пожалуйста, прочитайте документацию, так как в ней прекрасно объясняется, как использовать фасад Http...
Отвечает ли это на ваш вопрос? HTTP-клиент Laravel 7 — невозможно отправить POST-запрос с `body`
Неправильная ссылка, хотел использовать эту






Вы можете передать тело json напрямую при вызове метода в качестве второго аргумента:
$response = Http::withHeaders($headers)->{$method}($this->BASEURL . $endpoint, ['name' => 'testName']);
По умолчанию данные будут отправляться с использованием типа контента application/json.
Хорошо, это работает :). Но знаете ли вы, почему с помощью Guzzle я могу передать его в теле, а не использовать метод Laravel withBody()?
Это фасад, прочитайте документацию о том, как его использовать
Если в вашем массиве $headers есть ключ «тип контента», который не имеет регистра Content-Type, проблема может заключаться в том, что вы отправляете несколько заголовков типа контента.
Например, если в вашем массиве $headers есть ключ content-type, то при вызове withHeaders() вы устанавливаете заголовок content-type.
Следующий вызов withBody() установит для заголовка Content-Type значение application/json.
Поскольку имена заголовков являются ключами в массиве, и они не совпадают (ключи массива чувствительны к регистру), массив заголовков будет содержать как заголовок content-type, так и заголовок Content-Type, и оба будут отправлены в запросе.
Вам либо нужно удалить запись content-type из вашей переменной $headers, либо вам нужно убедиться, что она имеет регистр Content-Type, чтобы клиент Http перезаписал ее правильно.
Ваш BASEURL совпадает с URL-адресом вашего приложения?