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',
],
我正在 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',
],