laravel api 未显示来自请求验证的消息
laravel api not showing message from request validation
我的后端错误处理程序有问题 laravel api,不显示来自验证的错误消息。
routes/api
<?php
Route::group([
'middleware' => 'api',
], function ($router) {
Route::post('access/sign-up', 'AuthenticationController@signUp');
});
身份验证控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\SignUpRequest;
use Illuminate\Http\Request;
use App\User;
class AuthenticationController extends Controller
{
/**
* Create a new AuthenticationController instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:api', ['except' => ['signUp']]);
}
/**
*
*
* @return \Illuminate\Http\JsonResponse
*/
public function signUp(SignUpRequest $request)
{
//User::create($request->all());
return response()->json([
'data' => 'Usuario creado correctamente.'
]);
}
}
注册请求
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class SignUpRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => 'required|email|unique:users',
'firstName' => 'required',
'password' => 'required',
];
}
}
问题是,当我通过邮递员发送空白密码或不发送邮件时,它会将我发送到主页,而不是像以前一样向我发送 json 和所有错误。我不知道该怎么办。
我尝试在 SignUpRequest 中使用自定义消息,但这不是问题,想想错误处理程序中的某种重定向。
只需将该代码添加到 SignUpRequest
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json($validator->errors(), 422));
}
使用表单请求;如果验证失败,将生成重定向响应以将用户发送回他们之前的位置。这就是为什么您要重定向回页面而不是响应 JSON.
Laravel 有一个受保护的方法 "failedValidation" 方法。在您的表单请求中覆盖此方法 class.
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
throw new \Illuminate\Validation\ValidationException(response()->json($validator->errors(), 422));
}
只需将该代码添加到 App\Exceptions\Handler
:
public function render($request, Exception $exception)
{
if ($exception instanceof ValidationException) {
return response()->json([
'status' => false,
'error' => [
'type' => 'form',
'code' => 400,
'description' => 'Bad request.',
'detail' => $exception->validator->errors()
]
], 422);
}
return parent::render($request, $exception);
}
简单地说,在您的 App\Exceptions\Handler 中,您必须在 register() 方法中注册您的自定义异常处理:
public function register() {
$this->renderable( function ( ValidationException $ex, $request ) {
$response = [
'ErrorCode' => 'my_error_code',
'ErrorMessage' => $ex->validator->errors()
];
return response()->json( $response );
} );
}
TL;DR 添加以下内容 header:Accept: application/json
正如这里的一些用户所提到的,默认情况下,当表单请求失败时,应用程序将尝试将用户重定向回他们之前的位置。这就是为什么您收到的是网页而不是 JSON 响应。
我们也可以覆盖“failedValidation”方法。但我建议在请求 Accept: application/json
.
上设置以下 header
Laravel 将 return 基于 Accept
header 的适当响应。对于 application/json
Laravel 将 return 一个带有表单错误的 JSON 响应。
您只需要检查一项设置,必须在 Postman
的 header 数据中添加 Accept Type
接受:application/json
这对我来说是可行的...
更新 laravel 8,ValidationException 中的第一个参数是验证器 class:
protected function failedValidation(Validator $validator)
{
throw new ValidationException($validator, response()->json($validator->errors(), 422));
}
将此方法添加到您的 formRequest class。它适用于 laravel 9
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
class PostRequest extends FormRequest
{
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json([
'success' => false,
'message' => 'Validation errors',
'data' => $validator->errors(),
]));
}
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
switch ($this->method()) {
case 'GET':
case 'DELETE':{
return [];
}
case 'POST':{
return [
'title' => 'string|unique:posts|required',
'body' => 'required',
'image' => 'string|nullable',
];
}
case 'PUT':{
return [
'title' => 'string|unique:posts|required',
'body' => 'required',
'image' => 'string|nullable',
];
}
}
}
}
我的后端错误处理程序有问题 laravel api,不显示来自验证的错误消息。
routes/api
<?php
Route::group([
'middleware' => 'api',
], function ($router) {
Route::post('access/sign-up', 'AuthenticationController@signUp');
});
身份验证控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\SignUpRequest;
use Illuminate\Http\Request;
use App\User;
class AuthenticationController extends Controller
{
/**
* Create a new AuthenticationController instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:api', ['except' => ['signUp']]);
}
/**
*
*
* @return \Illuminate\Http\JsonResponse
*/
public function signUp(SignUpRequest $request)
{
//User::create($request->all());
return response()->json([
'data' => 'Usuario creado correctamente.'
]);
}
}
注册请求
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class SignUpRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'email' => 'required|email|unique:users',
'firstName' => 'required',
'password' => 'required',
];
}
}
问题是,当我通过邮递员发送空白密码或不发送邮件时,它会将我发送到主页,而不是像以前一样向我发送 json 和所有错误。我不知道该怎么办。 我尝试在 SignUpRequest 中使用自定义消息,但这不是问题,想想错误处理程序中的某种重定向。
只需将该代码添加到 SignUpRequest
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json($validator->errors(), 422));
}
使用表单请求;如果验证失败,将生成重定向响应以将用户发送回他们之前的位置。这就是为什么您要重定向回页面而不是响应 JSON.
Laravel 有一个受保护的方法 "failedValidation" 方法。在您的表单请求中覆盖此方法 class.
protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{
throw new \Illuminate\Validation\ValidationException(response()->json($validator->errors(), 422));
}
只需将该代码添加到 App\Exceptions\Handler
:
public function render($request, Exception $exception)
{
if ($exception instanceof ValidationException) {
return response()->json([
'status' => false,
'error' => [
'type' => 'form',
'code' => 400,
'description' => 'Bad request.',
'detail' => $exception->validator->errors()
]
], 422);
}
return parent::render($request, $exception);
}
简单地说,在您的 App\Exceptions\Handler 中,您必须在 register() 方法中注册您的自定义异常处理:
public function register() {
$this->renderable( function ( ValidationException $ex, $request ) {
$response = [
'ErrorCode' => 'my_error_code',
'ErrorMessage' => $ex->validator->errors()
];
return response()->json( $response );
} );
}
TL;DR 添加以下内容 header:Accept: application/json
正如这里的一些用户所提到的,默认情况下,当表单请求失败时,应用程序将尝试将用户重定向回他们之前的位置。这就是为什么您收到的是网页而不是 JSON 响应。
我们也可以覆盖“failedValidation”方法。但我建议在请求 Accept: application/json
.
Laravel 将 return 基于 Accept
header 的适当响应。对于 application/json
Laravel 将 return 一个带有表单错误的 JSON 响应。
您只需要检查一项设置,必须在 Postman
的 header 数据中添加 Accept Type接受:application/json
这对我来说是可行的...
更新 laravel 8,ValidationException 中的第一个参数是验证器 class:
protected function failedValidation(Validator $validator)
{
throw new ValidationException($validator, response()->json($validator->errors(), 422));
}
将此方法添加到您的 formRequest class。它适用于 laravel 9
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
class PostRequest extends FormRequest
{
protected function failedValidation(Validator $validator)
{
throw new HttpResponseException(response()->json([
'success' => false,
'message' => 'Validation errors',
'data' => $validator->errors(),
]));
}
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
switch ($this->method()) {
case 'GET':
case 'DELETE':{
return [];
}
case 'POST':{
return [
'title' => 'string|unique:posts|required',
'body' => 'required',
'image' => 'string|nullable',
];
}
case 'PUT':{
return [
'title' => 'string|unique:posts|required',
'body' => 'required',
'image' => 'string|nullable',
];
}
}
}
}