laravel - Laravel API:验证不访问我的 API 中的 PUT 请求数据
问题描述
语境
我正在使用PUT
Laravel 8 中的请求实现用户信息更新。我使用 Postman 发送请求并查看结果。
预期行为
我的PUT
请求到达了控制器的功能,该功能被许可更新经过身份验证的用户。后者更新成功。因此validate
调用成功执行并在请求中找到数据。
实际行为
我的PUT
请求到达了控制器的功能,该功能被许可更新经过身份验证的用户。后者没有成功更新。实际上,validate
调用成功执行了,但没有在请求中找到数据。
相反,数据验证说:
{ "message": "给定的数据无效。", "errors": { "email": [ "email field is required." ], "name": [ "名称字段为必填项。" ] } }
路线和请求
邮递员请求
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
}
我试图做的……或不做的事
Stackoverflow 的一些答案是:发送
POST
请求并在正文中发送_method=PUT
。我不想这样做。我真的更喜欢发送PUT
请求。因为我正在开发一个 API。这完全证明了我必须使用PUT
请求而不是请求这一事实PUT
。Stackoverflow 的一些答案是:
x-www-form-urlencoded
不要使用简单的form
. 它不能解决问题;而且已经是这样了。也许它可以帮助发送图像。(注意我不想在这里发送任何图像)。
问题
为什么 Laravelvalidate
找不到我请求的数据以及如何解决?
解决方案
您将请求发送为"Content-type: application/json"
,但您没有将正文作为有效 JSON 发送。
你发送这个:email=XYZ@XYZ.FR&name=test2
你应该发送这个:
{"email":"XYZ@XYZ.FR", "name": "test2"}
一个有效的 JSON 对象
推荐阅读
- python - Python:如何将一个列表的排序(按最大值)应用于另一个列表的元素索引排序
- sql-server-2012 - 从一台服务器批量复制到另一台服务器
- javascript - 无需重启js即可访问php
- google-drive-api - 我可以创建本地测试环境来集成谷歌驱动器和我的网络应用程序吗
- angular - Inject Parent 组件和在 Angular 中使用 @Input() 之间的区别
- azure - 字符串值到日期格式的液体转换
- android - android片段到片段通信:通过接口更新ReceiverFragment的recyclerView
- linux - 当我尝试运行从 Windows 系统编写的 Linux 脚本时出现“没有这样的文件或目录”错误
- powershell - 尝试使用 sendkey
- azure - 我们可以根据位置限制 Azure ARM 模板中的可见性 GUI 元素吗?