Запросы PATCH и PUT не работают с данными формы - PullRequest
0 голосов
/ 05 июня 2018

Я использую Laravel для создания приложения RESTFUL, и я тестирую приложение с почтальоном.В настоящее время существует проблема для PATCH или PUT, если данные отправлены почтальоном с данными формы.

// Parameter `{testimonial}` will be sent to backend.
Route::post  ('testimonials/{testimonial}', 'TestimonialController@update');

// Parameter `{testimonial}` will not be sent to backend (`$request->all()` will be empty) if sent from Postman with form-data.
Route::patch ('testimonials/{testimonial}', 'TestimonialController@update');
Route::put   ('testimonials/{testimonial}', 'TestimonialController@update');
  • Используя данные формы, $request->all() будет в порядке для POST.
  • Используя x-www-form-urlencoded, $request->all() будет в порядке для PATCH, PUT и POST.
  • Однако, если я отправляюPUT и PATCH с данными формы от Почтальона, $request->all() будет пустым (параметры не будут отправлены в бэкэнд).

Сейчас решение заключается в использовании POST для обновления модели.Я хочу знать, почему PATCH и PUT не работают при отправке с данными формы от Почтальона.

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Метод Laravel PATCH и PUT не работает с form-data, это известная проблема Symfony и даже PHP (Google для этого - Laravel использует множество базовых пакетов Symfony, включая Request).

  1. Если вам не нужно передавать файлы по запросу, измените form-data на raw с типом содержимого json.Например: {"name":"changed"}.Он будет читаться как php://input, и ваш код должен работать хорошо ($request->all() сейчас ["name" => "changed]).

  2. Если вам нужно передать файл (ы), по моему мнению, НЕ передавать его в методы REST API.Вы можете написать другой метод, который будет делать с вашими файлами все, что вам нужно (например, POST form-data -> загрузить файл -> обновить базу данных -> вернуть путь к файлу / url / даже его содержимое base64), затем вы можете использовать еговывод / результат, чтобы продолжить с вашим методом patch / put (raw с типом содержимого json).Я всегда так делаю, когда работаю с файлами в API.

Надеюсь, что это поможет!

0 голосов
/ 05 июня 2018

Типы мультимедиа форм не имеют семантики, определенной для PATCH, поэтому использовать их действительно плохая идея (см. https://www.rfc -editor.org / errata / eid3169 ).

Для PUT ожидаемое поведение будет хранить только полезную нагрузку в кодированном виде (в этом формате).Это действительно то, что вы хотите здесь?

0 голосов
/ 05 июня 2018

Это известная проблема, и предложенный обходной путь согласно следующему Github комментарий заключается в том, что при отправке запросов PATCH / PUT необходимо выполнить следующие действия:

Вы должны отправить POST и установить для _method значение PUT (аналогично отправке форм), чтобы сделать ваши файлы видимыми

Таким образом, по сути вы отправляете запрос POST с параметром, который устанавливает фактический метод, и Laravel, кажется,понять это.

Согласно документации 1014 *:

Поскольку HTML-формы не могут выполнять PUT, PATCH или DELETE запросов,вам нужно будет добавить скрытое поле _method, чтобы подделать эти HTTP-глаголы.Директива @method Blade может создать для вас это поле:

<form action="/foo/bar" method="POST">
    @method('PUT')

    ...
</form> 

В качестве альтернативы, вы можете использовать вспомогательную функцию method_field, чтобы выполнить выше:

Функция method_field генерирует скрытое поле ввода HTML, содержащее поддельное значение HTTP-глагола формы.Например, используя синтаксис Blade:

<form method="POST">
    {{ method_field('PUT') }}
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...