ajax(api route)上的Laravel 5.6验证器返回200而不是422

时间:2018-03-21 02:28:43

标签: php laravel validation laravel-validation laravel-5.6

我在Postman上发布我的api路径(在api.php中),当数据验证失败时,它会在200响应中返回错误:

enter image description here

以上回答是我尝试的时候:

{
    $valid = validator($request->only('email', 'password'), [
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6',
    ]);

    if ($valid->fails()) {
        $jsonError=response()->json($valid->errors()->all(), 400);
        return \Response::json($jsonError);
    }
}

然而,当我尝试下面documentation中的那个时,它会将我返回到视图(laravel欢迎页面),例如return back()

 $request->validate([
     'email' => 'required|string|email|max:255|unique:users',
     'password' => 'required|string|min:6',
 ]);

我发布的数据是:

email: ''
password: ''

// also tried with and without header
Content-Type: application/json

2 个答案:

答案 0 :(得分:4)

此代码存在问题。

$jsonError=response()->json($valid->errors()->all(), 400);
return \Response::json($jsonError);

$jsonError已经是一个JSONResponse对象,然后你再次将它封装在一个JSONReponse对象中。

json方法创建一个新的JSONResponse对象,这是底层代码。

public function json($data = [], $status = 200, array $headers = [], $options = 0)
{
    return new JsonResponse($data, $status, $headers, $options);
}

所以,当你在这里传递$jsonError时,它就是$data参数。现在,$status参数的默认值为200,但根据您的代码 DID NOT 传递任何值:

return \Response::json($jsonError);
//                               ^-- yeah, no $status argument here!

所以你有200回应是正确的。

要解决您的问题,只需返回您创建的第一个JSONResponse对象。

return response()->json($valid->errors()->all(), 400);

如果您仍想坚持使用当前代码,请执行此操作。但这毫无意义。

$jsonError=response()->json($valid->errors()->all(), 400);
return \Response::json($jsonError, 400);

此外,response()->json()Response::json()相同:)

答案 1 :(得分:0)

您是否具有Accept:application / json标头?

请在标题中添加接受:application / json