Laravel API: проверка не получает доступ к данным запроса PUT в моем API

Контекст

Я реализую обновление информации о пользователе с помощью PUT запроса в Laravel 8. Я использую Postman для отправки запроса и просмотра результатов.

Ожидаемое поведение

Мой PUT запрос достигает функции контроллера, которая предназначена для обновления аутентифицированного пользователя. Последний успешно обновляется. Таким образом, вызов validate выполняется успешно и находит данные в запросе.

Фактическое поведение

Мой PUT запрос достигает функции контроллера, которая предназначена для обновления аутентифицированного пользователя. Последний не обновляется успешно. Фактически, вызов validate выполняется успешно, но не находит данные в запросе.

Вместо этого проверка данных говорит:

{сообщение: Указанные данные недействительны., ошибки: {электронная почта: [Поле адреса электронной почты является обязательным. ], имя: [Поле имени обязательно для заполнения. ]}}

Маршрут и запрос

Запрос почтальона

curl --location --request PUT 'https://XYZ/api/set_user_data' \
--header 'X-Requested-With: XMLHttpRequest' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer 12|leRLA5yopCLIxe0oN9MMThctqD78iJDjZdZQkcgs' \
--data-urlencode '[email protected]' \
--data-urlencode 'name=test2'

В терминологии Postman это означает, что Params не отправляются, отправляется токен носителя авторизации, отправляются некоторые заголовки и отправляются некоторые данные Body в коде x-www-form-urlencoded.

Маршрут API

In routes/api.php:

Route::put('/set_user_data', [UserController::class, 'setUserData'])->name('set_user_data');

UserController::setUserData:

public function setUserData(Request $request) {
    if(!Auth::check()) {
        return 'unauthenticated.';
    }

    $request->validate([
        'email' => 'required|email',
        'name' => 'required|string'
    ]);

 // ... update user here but out of topic
}

Что я пытался сделать ... или не делать

  • Вот некоторые ответы Stackoverflow: отправить POST запрос и отправить в теле _method=PUT. Я не хочу этого делать. Я действительно предпочитаю отправить PUT запрос. Потому что я разрабатываю API. Это полностью оправдывает тот факт, что я должен использовать PUT запрос, а не PUT.

  • Вот некоторые ответы Stackoverflow: используйте x-www-form-urlencoded, а не простой form. Это не решает проблему; более того, это уже так. Может быть, это поможет с отправкой изображений. (обратите внимание, я не хочу отправлять сюда изображения).

Вопрос

Почему validate Laravel не находит данные моего запроса и как это исправить?


person JarsOfJam-Scheduler    schedule 12.03.2021    source источник
comment
вам необходимо отправить действительный запрос JSON. Laravel требует метод PUT только для веб-запросов, а не для запросов API.   -  person Anuj Shrestha    schedule 12.03.2021


Ответы (1)


Вы отправляете запрос как "Content-type: application/json", но не отправляете тело как действительный JSON.

Вы отправляете это: [email protected]&name=test2

Вы должны отправить это:

{"email":"[email protected]", "name": "test2"}

действительный объект JSON

person RDev    schedule 12.03.2021
comment
Вы думаете, почему validate не выполняется? - person JarsOfJam-Scheduler; 12.03.2021
comment
@ JarsOfJam-Scheduler, я думаю, validate выполняется, он просто не видит данных из-за того, что тело отправлено не как JSON - person RDev; 12.03.2021
comment
Ты прав! И если однажды мне нужно было отправить изображение с помощью json, например, я мог бы отправить версию base64? - person JarsOfJam-Scheduler; 12.03.2021
comment
Для тех, кто хочет знать, как я отправляю PUT запрос с данными JSON в Postman, я просто нажимаю Body, затем raw, затем выбираю JSON и записываю данные в формате JSON. - person JarsOfJam-Scheduler; 12.03.2021