laravel 验证 Content-Type: application/json 请求

Posted

技术标签:

【中文标题】laravel 验证 Content-Type: application/json 请求【英文标题】:laravel validate Content-Type: application/json request 【发布时间】:2015-10-20 08:55:48 【问题描述】:

在 laravel 5 中,我提出了一个名为 ApiRequest 的新请求。

class ApiRequest extends Request

    public function authorize() 
      return $this->isJson();
    
    public function rules()
    
     return [
            //
            ];
    

如您所见,我只接受 json 数据。我正在像这样在控制器中接收 json

public function postDoitApi(ApiRequest $payload) 
        $inputJson = json_decode($payload->getContent()); 
        $name = $inputJson->name;

哪个工作正常。我在$name 中获取数据。但现在我需要验证输入 json。 我需要像这样在ApiRequest 中为name 键设置验证规则

public function rules()

     return [
            'name' => 'required|min:6'
            ];

帮我做这件事。谢谢。

【问题讨论】:

【参考方案1】:

验证任何标题都可以通过两步干净的方式完成:

第1步:准备header数据以在prepareForValidation方法中请求数据。
public function prepareForValidation()

    $this->merge([
        "content_type" => $this->headers->get("Content-type"),
    ]);

第 2 步:申请您想要的任何验证规则,(在这里,您希望您的数据完全是application/json。所以
public function rules(): array

    return [
        "content_type" => "required|in:application/json",
    ];

完整示例如下:

/**
 * Class LoginRequest
 *
 * @package App\Requests
 */
class LoginRequest extends FormRequest

    public function prepareForValidation()
    
        $this->merge([
            "content_type" => $this->headers->get("Content-type"),
        ]);
    

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(): array
    
        return [
            "content_type" => "required|in:application/json",
        ];
    

【讨论】:

【参考方案2】:

Laravel 以同样的方式验证 AJAX 请求。只需确保您在请求中设置了以下请求标头之一:

'Accept': 'application/json'

'X-Requested-With': 'XMLHttpRequest'

【讨论】:

【参考方案3】:

您可以使用验证器方法而不是规则方法:

class ApiRequest extends Request

    public function authorize() 
      return $this->isJson();
    

    public function validator()

        //$data = \Request::instance()->getContent();

        $data = json_decode($this->instance()->getContent());

        return \Validator::make($data, [
           'name' => 'required|min:6'
        ], $this->messages(), $this->attributes());
    

    //what happens if validation fails
    public function validate()

        $instance = $this->getValidatorInstance();

        if($this->passesAuthorization())
             $this->failedAuthorization();
        elseif(!$instance->passes())
              $this->failedValidation($instance);
        elseif( $instance->passes())

        if($this->ajax())
        throw new HttpResponseException(response()->json(['success' =>          true]));

        

   

【讨论】:

是的,它确实有效,但问题是如果验证失败,它会重定向到主页 url,而不是显示错误消息。我将 ['name.required' => 'name is required'] 传递给 $this->messages() 但没有用。 请帮我显示错误信息。位数限制 好的,伙计。请给我几分钟。正在努力。想在我的项目中创建它 您是否尝试在 AJAX 调用中获取错误消息? 我不确定你为什么被引导回主页,我更新了我的答案。【参考方案4】:

您可以在ApiRequest 表单请求中添加以下功能。

public function validator()

    return \Validator::make(json_decode($this->getContent(),true), $this->rules(), $this->messages(), $this->attributes());    


【讨论】:

在 AuthController.php 第 17 行出现此 ErrorException:Packr\Http\Controllers\Auth\AuthController::validate() 的声明应该与 Packr\Http\Controllers\Controller::validate(Illuminate \Http\Request $request, 数组 $rules, 数组 $messages = 数组, 数组 $customAttributes = Array) @SudiptaDhara 您可以尝试在第一个函数参数中将Request 替换为\Illuminate\Http\Request 吗?你确定你使用与上面相同的代码而不以任何方式改变可见性或参数吗?【参考方案5】:
    return $inputJson->toArray();   

然后传递给验证器

    $name = ['name'=>'er'];
    $rules = array('name' => 'required|min:4');
    $validation = Validator::make($name,$rules);

【讨论】:

以上是关于laravel 验证 Content-Type: application/json 请求的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

怎么把laravel的表单验证信息改成中文

Laravel + React,使用 Laravel 身份验证的 api

使用 Laravel 验证验证布尔值

Laravel 4 验证器 - 验证两个字段之一

Laravel登录验证碰到的坑 哈希验证匹配问题