Laravel 5.6 ajax 上的验证器(api 路线)returns 200 而不是 422

Laravel 5.6 validator on ajax (api route) returns 200 instead of 422

我正在 post 将 Postman 发送到我的 api 路线(在 api.php 中),当数据验证失败时,它 returns 给我 200 中的错误在此回复:

上面的响应是我尝试时的:

{
    $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 中的那个时,它 returns 我进入了视图(laravel 欢迎页面),类似于 return back()

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

而我post的数据是:

email: ''
password: ''

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

这段代码有问题。

$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,但是根据您的代码,您 没有 传递任何值:

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

所以你得到 200 响应是正确的。

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

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

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

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

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

你有接受吗:application/json header ?

请添加接受:application/json在你header.

这种行为还有另一个原因

在您的验证规则中,您可以为任何输入键使用数组而不是“|”分隔符

如果它发生在数组和“|”之间分隔符您将始终获得状态代码 200 而不是 422

错误代码示例:

'first_name' => [
    'bail',
    'required|string', // this should be replaced by 'required', 'string'
    'min:3',
    'max:15',
],