2017-01-17 107 views
1

我正在创建一个用于从移动应用上传文件的简单API。API - 验证Laravel中的请求

在我routes/api.php文件我有一个路线定义:

Route::post("/file", '[email protected]'); 

然后在我的控制器我验证请求:

public function upload(Request $request){ 

    $this->validate($request, [ 
      'name' => 'required', 
      'file' => 'file', 
      'type' => 'required|in:sign,photo', 
     ]); 

    // do something here.... 

} 

当请求是正确的(它通过验证)一切正常罚款和Laravel返回JSON响应。

但是,如果请求未通过验证,即缺少name字段,则Laravel返回302页并尝试将我重定向到登录页面。

当验证失败而不是302重定向页面时,如何使用JSON消息返回适当的40X/50X错误?

我使用Laravel 5.3和Insomnia来测试API调用。

回答

3

validate方法为普通请求返回重定向,为AJAX请求返回JSON。

验证方法接受传入的HTTP请求和一组验证规则。如果验证规则通过,您的代码将继续正常执行;但是,如果验证失败,则会抛出异常并将正确的错误响应自动发回给用户。在传统HTTP请求的情况下,将生成重定向响应,而AJAX请求将发送JSON响应。

所以,你有几种选择,这里有一对夫妇:

  • 可以设置成Laravel认为这是一个AJAX请求
  • 您可以创建您的验证,并在其上调用fails()X-Requested-With头并处理你的回应,你所希望的方式来:

$validator = Validator::make($input, $rules); 
if ($validator->fails()) { 
    // Custom Response 
} 

如果您只是制作一个API,您可能需要考虑使用Lumen,因为它可以针对特定目的进行更精细的调整。另外,它的验证defaults to returning a JSON response

+2

谢谢,X-Requested-与诀窍。但是,从Insomnia发出的请求没有被正确识别为AJAX请求,这有点奇怪。 – Gacek