Laravel API: 验证不访问我的 API 中的 PUT 请求数据
Laravel API: validate doesn't access the PUT request data in my API
上下文
我正在 Laravel 8 中使用 PUT
请求实施用户信息更新。我使用 Postman 发送请求并查看结果。
预期行为
我的 PUT
请求到达控制器的功能,该功能被授权更新经过身份验证的用户。后者更新成功。所以validate
调用成功执行并找到请求中的数据。
实际行为
我的 PUT
请求到达控制器的功能,该功能被授权更新经过身份验证的用户。后者没有更新成功。事实上,validate
调用执行成功但未在请求中找到数据。
相反,数据验证说:
{
"message": "The given data was invalid.",
"errors": {
"email": [
"The email field is required."
],
"name": [
"The name field is required."
]
}
}
路由&请求
邮递员请求
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=XYZ@XYZ.FR' \
--data-urlencode 'name=test2'
在 Postman 术语中,这意味着不发送“Params”,发送 Authorization Bearer 令牌,发送一些 Headers 和一些 Body 的 x-www-form-urlencoded 数据。
API路线
在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
}
我尝试做的...或没有做
Whosebug 的一些答案是:发送 POST
请求并在正文中发送 _method=PUT
。我不想这样做。我真的更喜欢发送 PUT
请求。因为我正在开发一个API。这完全证明了我 必须 使用 PUT
请求而不是 PUT
请求这一事实。
Whosebug 的一些答案是:使用 x-www-form-urlencoded
而不是简单的 form
。它不能解决问题;而且已经是这样了。也许它可以帮助发送图像。 (注意我不想在这里发送任何图片)。
问题
为什么 Laravel 的 validate
找不到我请求的数据,如何解决?
您发送的请求是 "Content-type: application/json"
,但您发送的正文不是有效的 JSON。
您发送的是:email=XYZ@XYZ.FR&name=test2
你应该发送这个:
{"email":"XYZ@XYZ.FR", "name": "test2"}
一个有效的JSON对象
上下文
我正在 Laravel 8 中使用 PUT
请求实施用户信息更新。我使用 Postman 发送请求并查看结果。
预期行为
我的 PUT
请求到达控制器的功能,该功能被授权更新经过身份验证的用户。后者更新成功。所以validate
调用成功执行并找到请求中的数据。
实际行为
我的 PUT
请求到达控制器的功能,该功能被授权更新经过身份验证的用户。后者没有更新成功。事实上,validate
调用执行成功但未在请求中找到数据。
相反,数据验证说:
{ "message": "The given data was invalid.", "errors": { "email": [ "The email field is required." ], "name": [ "The name field is required." ] } }
路由&请求
邮递员请求
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=XYZ@XYZ.FR' \
--data-urlencode 'name=test2'
在 Postman 术语中,这意味着不发送“Params”,发送 Authorization Bearer 令牌,发送一些 Headers 和一些 Body 的 x-www-form-urlencoded 数据。
API路线
在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
}
我尝试做的...或没有做
Whosebug 的一些答案是:发送
POST
请求并在正文中发送_method=PUT
。我不想这样做。我真的更喜欢发送PUT
请求。因为我正在开发一个API。这完全证明了我 必须 使用PUT
请求而不是PUT
请求这一事实。Whosebug 的一些答案是:使用
x-www-form-urlencoded
而不是简单的form
。它不能解决问题;而且已经是这样了。也许它可以帮助发送图像。 (注意我不想在这里发送任何图片)。
问题
为什么 Laravel 的 validate
找不到我请求的数据,如何解决?
您发送的请求是 "Content-type: application/json"
,但您发送的正文不是有效的 JSON。
您发送的是:email=XYZ@XYZ.FR&name=test2
你应该发送这个:
{"email":"XYZ@XYZ.FR", "name": "test2"}
一个有效的JSON对象