Получение ошибки HTTP-клиента 400 с помощью Guzzle

Я пытаюсь сделать 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();

Ваш BASEURL совпадает с URL-адресом вашего приложения?

Sumit kumar 18.05.2023 12:42

Нет, базовый URL инициализируется в классе. В обоих случаях это одно и то же

Phyron 18.05.2023 12:47

В вашей переменной $headers определен тип контента? Если это так, а ключ не 'Content-Type' (с учетом регистра), это может вызвать вашу проблему.

patricus 18.05.2023 16:08

Пожалуйста, прочитайте документацию, так как в ней прекрасно объясняется, как использовать фасад Http...

matiaslauriti 18.05.2023 16:57

Отвечает ли это на ваш вопрос? HTTP-клиент Laravel 7 — невозможно отправить POST-запрос с `body`

miken32 18.05.2023 18:17

Неправильная ссылка, хотел использовать эту

miken32 18.05.2023 18:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
6
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете передать тело json напрямую при вызове метода в качестве второго аргумента:

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

По умолчанию данные будут отправляться с использованием типа контента application/json.

Хорошо, это работает :). Но знаете ли вы, почему с помощью Guzzle я могу передать его в теле, а не использовать метод Laravel withBody()?

Phyron 18.05.2023 16:51

Это фасад, прочитайте документацию о том, как его использовать

matiaslauriti 18.05.2023 16:57

Если в вашем массиве $headers есть ключ «тип контента», который не имеет регистра Content-Type, проблема может заключаться в том, что вы отправляете несколько заголовков типа контента.

Например, если в вашем массиве $headers есть ключ content-type, то при вызове withHeaders() вы устанавливаете заголовок content-type.

Следующий вызов withBody() установит для заголовка Content-Type значение application/json.

Поскольку имена заголовков являются ключами в массиве, и они не совпадают (ключи массива чувствительны к регистру), массив заголовков будет содержать как заголовок content-type, так и заголовок Content-Type, и оба будут отправлены в запросе.

Вам либо нужно удалить запись content-type из вашей переменной $headers, либо вам нужно убедиться, что она имеет регистр Content-Type, чтобы клиент Http перезаписал ее правильно.

Другие вопросы по теме

Похожие вопросы

Показать штрих-код и заголовок в одной статье с помощью barryvdh/laravel-dompdf
Как отправить массив данных с помощью шаблонов блейдов и Laravel?
У меня есть тамильский шрифт в моем Laravel Blade View, он отлично работает на веб-странице, но не в pdf. Когда я загружаю pdf, тамильские слова перетасовываются
Как автоматически отфильтровать чужую таблицу delete_at = null при использовании соединения в красноречии laravel?
Laravel 10x: запросы формы всегда возвращают сообщение об успешном завершении
Перенаправить зарегистрированного пользователя, если он перешел на страницу входа
Нпм ОШИБКА! путь \\wsl.localhost\Ubuntu-22.04\home\jdoe\DevProjects\litenotes\node_modules\.bin\autoprefixer
Мульти арендатор плюс складской фасад
Laravel Не удалось получить размер файла для файла в месте
Как исправить, что контроллер целевого класса не существует в Laravel? Он работает на другом контроллере, но не работает на этом конкретном контроллере