Laravel validate() 捕获错误并使用 POST 方法返回奇怪的响应。使用 Postman 进行测试
Posted
技术标签:
【中文标题】Laravel validate() 捕获错误并使用 POST 方法返回奇怪的响应。使用 Postman 进行测试【英文标题】:Laravel validate() catches error and weird response is returned with POST method. Testing with Postman 【发布时间】:2020-10-28 14:40:14 【问题描述】:我正在使用邮递员来测试将记录添加到数据库。 当所有数据都正确发送(使用 POST 方法)时,函数起作用。 当我尝试在其中一个字段中发送无效数据时,邮递员告诉我
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException:此路由不支持 POST 方法。支持的方法:GET、HEAD
这很奇怪,因为当数据正确并添加记录时,POST 肯定有效。 我正在寻找正确的错误消息,并可能对其进行自定义。
在阅读了类似问题的答案后,我添加了 get 方法,因为我理解错误消息使用 get 的相同路线?但即使定义了 get 方法,错误仍然存在。
这些是我的路线
Route::post('trip', 'TripController@addTrip');
Route::get('trip', 'TripController@errorTrip');
php artisan route:list
表明我有 GET 和 POST 路线用于“旅行”,错误仍然存在
这是我在 laravel 中的功能
public function addTrip(Request $request)
$validated = $request->validate([
'date' => ['required','regex:/^(2020-08-([0-2][0-9]|30))$/'],
'user_id'=> ['required','regex:/^[0-9]*$/'],
'train_id'=> ['required','regex:/^(1|2)$/'],
'train_route_id'=> ['required', 'regex:/^(1|2)$/'],
'stop_from'=> ['required','regex:/^[1-8]$/'],
'stop_to'=> ['required','regex:/^[1-8]$/'],
]);
$data = request()->post();
DB::table('trips')->insert([
[
'user_id' => $data['user_id'],
'train_id' => $data['train_id'],
'train_route_id' => $data['train_route_id'],
'stop_from' => $data['stop_from'],
'stop_to' => $data['stop_to'],
'date' => $data['date'],
'created_at' => Carbon::now(),
'updated_at' => Carbon::now()
],
]);
【问题讨论】:
可能是这个URL匹配了另一个路由,所以检查其他路由看看这个数据是否匹配。不是 laravel 人,所以不知道您是否可以显示它触发的路线。 只需尝试任何方法而不是发布并获取 如果您传入无效数据,我认为您的代码不会在 validate 方法之后执行,因为 laravel 的验证方法的工作方式是,如果验证失败,它将重定向到上一页。请参考link 了解如何防止这种行为。 laravel.com/docs/7.x/validation 提到验证失败会导致自动重定向。因此,您可能在这里被重定向到不同的 URL,其状态代码使客户端保持相同的请求方法(可能是 307 临时重定向),但第二个 URL 的 that 路由实际上并不为 POST 存在。 @Monika 我不认为这是个好主意 【参考方案1】:虽然验证也可以正常工作,但正如@CBroe 所述,验证失败可能会导致自动重定向。你可以试试其他方法。
public function addTrip(Request $request)
$validator = Validator::make($request->all(), [
'date' => ['required','regex:/^(2020-08-([0-2][0-9]|30))$/'],
'user_id'=> ['required','regex:/^[0-9]*$/'],
'train_id'=> ['required','regex:/^(1|2)$/'],
'train_route_id'=> ['required', 'regex:/^(1|2)$/'],
'stop_from'=> ['required','regex:/^[1-8]$/'],
'stop_to'=> ['required','regex:/^[1-8]$/'],
]);
if ($validator->fails())
return Redirect::back()->withErrors($validator);
$data = request()->post();
DB::table('trips')->insert([
['user_id' => $data['user_id'], 'train_id' => $data['train_id'], 'train_route_id' => $data['train_route_id'], 'stop_from' => $data['stop_from'], 'stop_to' => $data['stop_to'], 'date' => $data['date'], 'created_at' => Carbon::now(), 'updated_at' => Carbon::now()],
]);
作为建议,您还可以对 train_id、train_route_id 使用“in”验证。见here
【讨论】:
谢谢!制作自定义验证器似乎有效,当验证器失败时我可以重定向!【参考方案2】:验证失败时 Laravel 重定向。因此,您正在重定向到可能是 GET 路由的路由。当您从 Postman 尝试时,您可以在请求标头中发送一个键值对。
accept:application/json
Laravel 将发送一个带有如下验证错误的 json 响应,而不是重定向。
"message": "The given data was invalid.",
"errors":
"date": [
"The date does not match the format"
]
【讨论】:
【参考方案3】:检查你是否在该路由之上注册了另一个路由。
您可能还想尝试
php artisan cache:clear
或
php artisan route:cache
.
【讨论】:
抱歉,我用问题回答了问题。以上是关于Laravel validate() 捕获错误并使用 POST 方法返回奇怪的响应。使用 Postman 进行测试的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的 TypeError:“#login”.validate 不是函数
干货Laravel --Validate (表单验证) 使用实例