Laravel 中的 REST API 验证请求时

问题描述 投票:0回答:7

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

enter image description here

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

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
7个回答
53
投票

这些代码将为您提供帮助,为我工作。

$response = array('response' => '', 'success'=>false);
$validator = Validator::make($request->all(), $rules);

if ($validator->fails()) {
  $response['response'] = $validator->messages();
} else {
//process the request
}

return $response;

31
投票

您可能应该返回错误(这是

Illuminate\Support\MessageBag
的一个实例)并对其进行编码。
MessageBag
实例允许您将其直接转换为其 JSON 表示形式。

$errors = $validation->errors();

return $errors->toJson();

现在不是自吹自擂,但我最近为 Laravel 开发了一个 RESTful API 包,它可以为您完成所有这些工作,您所需要做的就是抛出一个简单的异常。请参阅我的 dingo/api 包和 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."]
    }
}

10
投票

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 响应。


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": ""
}

3
投票

对于 laravel 5.5 及更高版本,请参阅文档:AJAX 请求和验证

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)
});

1
投票

我正在使用 Laravel 9.x,并发现了一种非常简单的方法来使用 REST API 验证错误:

public function store(Request $request)
{
    $input = $request->all();
    $validator = Validator::make($input, [
        'title' => 'required|string|max:50'
    ]);

    // Will return an error, if validation fails.
    // https://laravel.com/api/9.x/Illuminate/Foundation/Validation/ValidatesRequests.html#method_validateWith
    $this->validateWith($validator, $request);

    // Only use the properties that were validated.
    $input = $validator->validated();

    // Create a new event model, with the data provided.
    $event = Event::create($input);
    return new EventResource($event);
}

为了返回 json 错误消息,请确保将客户端的

Accept
标头设置为
application/json
。我犯了一个错误,没有在调试客户端中设置它,所以我只看到了 html/xml 消息。

您还可以强制输出为 json


0
投票
    $validator = Validator::make($request->all(), [
        'code'    => 'required',
        'user_id' => $request->user_id,
    ]);

    if ($validator->fails()) {
        $errorMessage = $validator->errors()->first();
        $response = [
            'status'  => false,
            'message' => $errorMessage,
        ];
        return response()->json($response, 401);
    }
© www.soinside.com 2019 - 2024. All rights reserved.