【问题标题】:REST API in Laravel when validating the request验证请求时 Laravel 中的 REST API
【发布时间】:2014-06-03 11:09:15
【问题描述】:

我目前正在尝试如何使用 Laravel 构建一个 RESTful API,并且我目前正在创建一个新用户。这只是一个测试,我在尝试使用 Laravel 中的验证来验证请求时得到了一些结果;结果如下:

我一直在尝试通过这段代码创建一个新的:

public function store()
{

    $validation = Validator::make(Request::all(),[ 
        'username' => 'required|unique:users, username',
        'password' => 'required',
    ]);

    if($validation->fails()){


    } else{
            $createUser = User::create([
                'username' => Request::get('username'),
                'password' => Hash::make(Request::get('password')) 
            ]);
    }
}

但是我不知道如何在验证中返回错误。但是当我尝试使用validation->fails() 执行if 操作时,它不断给我图像中显示的HTML。有没有办法以 JSON 格式获取验证?

【问题讨论】:

    标签: php validation rest laravel-4


    【解决方案1】:

    您可能应该返回错误(这是Illuminate\Support\MessageBag 的一个实例)并对其进行编码。 MessageBag 实例允许您将其直接转换为其 JSON 表示形式。

    $errors = $validation->errors();
    
    return $errors->toJson();
    

    现在不要自吹自擂,但我最近为 Laravel 开发了一个 RESTful API 包,它可以为你完成所有这些工作,你需要做的只是抛出一个简单的异常。请参阅我的 dingo/api 包和 returning errors 上的 Wiki。基本上,您不会返回错误,而是抛出异常。

    throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create a new user.', $validation->errors());
    

    它将由以下 JSON 表示。

    {
        "message": "Could not create a new user.",
        "errors": {
            "username": ["The username is already in use."]
        }
    }
    

    【讨论】:

    • 在我完成这项工作后,我会试试你的包。问题是它在我的终端中将 if($validation->fails()){ } 返回到 html 中,因此您最终会返回一些 html 然后它不会读取下一行代码。我对它发生了什么的理论..
    • 找到它。我必须指定内容类型。我在这里找到了答案stackoverflow.com/questions/7172784/…
    • 你应该按喇叭。 Dingo 现在是一个非常流行的包。所以谢谢你!
    【解决方案2】:

    Laravel 提供了一个开箱即用的验证方法,您可以从控制器调用该方法。

    如果你检查 Laravel Controller 抽象类,你会发现它使用了一个名为 ValidatesRequests 的特征

       abstract class Controller extends BaseController
    {
        use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    }
    

    所以你可以使用方法$this->validate(Request $request, array $rules);,只要你的控制器类扩展了控制器

    完整的方法声明是

    public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
        {
            $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);
    
            if ($validator->fails()) {
                $this->formatValidationErrors($validator);
            }
        }
    

    如果 $validator 失败,该方法将根据请求类型抛出错误,如果是 ajax(在这种情况下,您应该在请求标头中包含 (Accept application/json),它将返回包含验证的 JSON 响应错误。

    【讨论】:

    • +1 这应该是公认的答案;重用控制器代码并自动格式化错误 AJAX 请求。
    【解决方案3】:

    这些代码会帮助你,为我工作。

    $response = array('response' => '', 'success'=>false);
    $validator = Validator::make($request->all(), $rules);
    
    if ($validator->fails()) {
      $response['response'] = $validator->messages();
    } else {
    //process the request
    }
    
    return $response;
    

    【讨论】:

    • 这个答案值得更多赞扬。我已经尝试了所有解决方案,而这个至少在 Laravel 5.2 中给了我正确的信息。
    • Laravel 为 XMLHttpRequest 开箱即用 - 对于 AJAX,我认为它也应该为 API 请求执行此操作,因为 Laravel 是面向 API 的。我想知道是否有可能找到一种方法来使 API 调用 XMLHttpRequest。会不会太奇怪了?
    • 如何使用 Laravel 请求类实现类似的实现?
    【解决方案4】:

    对于 laravel 5.5 及更高版本,请参阅文档:AJAX Requests & Validation

    TL;DR:验证失败时,将返回带有 422 的 json 响应以及验证错误消息。我花了一些时间在响应对象中找到那些验证错误,所以如果你使用 axios,要查看错误消息,请在浏览器控制台中尝试:

    axios.post('/api/your-route-here')
        .then(response => {
            console.log(response.data);
        }).catch(error => {
        console.log(error.response.data.errors)
    });
    

    【讨论】:

      【解决方案5】:

      首先获取验证器响应的方法有很多,即同时获取所有验证错误,即您将得到如下响应

       $validator = \Validator::make($request->all(), [
              'username' => 'required|unique:users, username',
              'password' => 'required',
             
          ]);
      
      if ($validator->fails()) {
              $responseArr = CustomHelper::returnRespArr("");
              $responseArr['message'] = $validator->errors();;
              $responseArr['token'] = '';
              return response()->json($responseArr, Response::HTTP_BAD_REQUEST);
          }
      

      您将得到的回应是:

      {
      "status": false,
      "data": [],
      "message": {
          "username": [
              "The username field is required."
          ],
          "password": [
              "The password field is required."
          ]
      },
      "is_valid": 0,
      "token": ""
      }
      

      获取验证响应的第二种方式。在这种情况下,您一次会收到一个验证器错误。

          if ($validator->fails()) {
              $responseArr = CustomHelper::returnRespArr("");
              $responseArr['message'] = $validator->messages()->first();;
              $responseArr['token'] = '';
              return response()->json($responseArr,Response::HTTP_BAD_REQUEST);
          }
      

      你会得到的回应

      {
      "status": false,
      "data": [],
      "message": "The username field is required.",
      "is_valid": 0,
      "token": ""
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-01
        • 2017-06-02
        • 1970-01-01
        • 2018-09-13
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        相关资源
        最近更新 更多