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:clearphp artisan route:cache.

【讨论】:

抱歉,我用问题回答了问题。

以上是关于Laravel validate() 捕获错误并使用 POST 方法返回奇怪的响应。使用 Postman 进行测试的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的 TypeError:“#login”.validate 不是函数

干货Laravel --Validate (表单验证) 使用实例

Laravel - 致命错误:未捕获的错误:找不到类'Auth'

VueJS、Axios、Laravel - 捕获错误

使用 Axios 从 laravel 控制器捕获错误

Laravel 5.4.36 - 发布路由问题