Laravel 自定义验证器 returns 页面而不是 json
Laravel custom validator returns page instead of json
我做了一个控制器来存储任务,它看起来像:
public function store(StoreTaskRequest $request)
{
$validated = $request->validated();
return response()->json($request);
}
为了请求验证,我制作了一个自定义验证器,看起来像
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreTaskRequest 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 [
'project_id' => 'required',
'project_name' => 'required',
'task_id' => 'required',
'task_name' => 'required',
'startDate' => 'required',
'endDate' => 'required',
];
}
public function messages()
{
return [
'project_id.required' => 'required!',
'project_name.required' => 'required!',
'task_id.required' => 'required!',
'task_name.required' => 'required!',
'startDate.required' => 'required!',
'endDate.required' => 'required!',
];
}
}
当我用不正确的数据向那个控制器发出 post 请求时,它 returns 一个 html 页面但是当我 post 它用正确的数据 returns 请求为 json
顺便说一下,我的 post 请求是这样的:reqbin.com
Post request headers:
X-Csrf-Token: ....
Content-Type: application/json
Post Params:
{
"project_name": "Wiza",
"task_id": 1,
"task_name": "test 1",
"startDate": {
"week": 1,
"start" : 11,
"year": 2022
},
"endDate": {
"week": 1,
"start" : 11,
"year": 2022
}
}
有谁知道为什么它返回 html 页面而不是验证错误?
编辑:
api.php 为空
web.php
Route::post('api/v1/tasks/', [TaskController::class, 'store']);
//Also tried
Route::resource('api/v1/tasks/', TaskController::class);
我遇到了同样的问题,下面提到的方法对我有用。
Header调试
首先您需要验证 headers 列表是否存在于您的请求中。您可以按照控制器 store
方法中的以下代码执行此操作:
public function store(StoreTaskRequest $request)
{
dd($request->headers); //dump your headers exists in $request
$validated = $request->validated();
return response()->json($request);
}
这将向您显示类似的内容:
解决方案:
通过使用 middleware
添加那些 headers 的最佳方式和干净的方式,即
我创建了 ForceJsonResponse
中间件。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceJsonResponse
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}
之后,我在 app/Http/Kernel.php
中注册了该中间件,如屏幕截图所示。
然后附加 middleware
和 route
,如屏幕截图所示:
laravel doc reference for middleware attachement
最坏的情况
在您的自定义验证器中添加此代码。
/**
* Get the error messages for the defined validation rules.*
* @return array
*/
protected function failedValidation(ValidationValidator $validator)
{
throw new HttpResponseException(response()->json([
'message' => implode('', collect($validator->errors())->first()),
'status' => true
], 422));
}
我做了一个控制器来存储任务,它看起来像:
public function store(StoreTaskRequest $request)
{
$validated = $request->validated();
return response()->json($request);
}
为了请求验证,我制作了一个自定义验证器,看起来像
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreTaskRequest 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 [
'project_id' => 'required',
'project_name' => 'required',
'task_id' => 'required',
'task_name' => 'required',
'startDate' => 'required',
'endDate' => 'required',
];
}
public function messages()
{
return [
'project_id.required' => 'required!',
'project_name.required' => 'required!',
'task_id.required' => 'required!',
'task_name.required' => 'required!',
'startDate.required' => 'required!',
'endDate.required' => 'required!',
];
}
}
当我用不正确的数据向那个控制器发出 post 请求时,它 returns 一个 html 页面但是当我 post 它用正确的数据 returns 请求为 json
顺便说一下,我的 post 请求是这样的:reqbin.com
Post request headers:
X-Csrf-Token: ....
Content-Type: application/json
Post Params:
{
"project_name": "Wiza",
"task_id": 1,
"task_name": "test 1",
"startDate": {
"week": 1,
"start" : 11,
"year": 2022
},
"endDate": {
"week": 1,
"start" : 11,
"year": 2022
}
}
有谁知道为什么它返回 html 页面而不是验证错误?
编辑:
api.php 为空 web.php
Route::post('api/v1/tasks/', [TaskController::class, 'store']);
//Also tried
Route::resource('api/v1/tasks/', TaskController::class);
我遇到了同样的问题,下面提到的方法对我有用。
Header调试
首先您需要验证 headers 列表是否存在于您的请求中。您可以按照控制器 store
方法中的以下代码执行此操作:
public function store(StoreTaskRequest $request)
{
dd($request->headers); //dump your headers exists in $request
$validated = $request->validated();
return response()->json($request);
}
这将向您显示类似的内容:
解决方案:
通过使用 middleware
添加那些 headers 的最佳方式和干净的方式,即
我创建了 ForceJsonResponse
中间件。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceJsonResponse
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}
之后,我在 app/Http/Kernel.php
中注册了该中间件,如屏幕截图所示。
然后附加 middleware
和 route
,如屏幕截图所示:
laravel doc reference for middleware attachement
最坏的情况
在您的自定义验证器中添加此代码。
/**
* Get the error messages for the defined validation rules.*
* @return array
*/
protected function failedValidation(ValidationValidator $validator)
{
throw new HttpResponseException(response()->json([
'message' => implode('', collect($validator->errors())->first()),
'status' => true
], 422));
}