Laravel & Lumen RESTFul API 扩展包:Dingo API(四) —— 错误和异常响应
来源:互联网 发布:虚拟机linux ip地址 编辑:程序博客网 时间:2024/06/05 15:18
在构建API的时候处理错误是一件痛苦的事儿,在Dingo API中,你不需要手动构建错误响应,只需要抛出一个继承自Symfony\Component\HttpKernel\Exception\HttpException
的异常,API会自动为你处理这个响应。
下面是Dingo API内置的Symfony异常:
异常状态码Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
403Symfony\Component\HttpKernel\Exception\BadRequestHttpException
400Symfony\Component\HttpKernel\Exception\ConflictHttpException
409Symfony\Component\HttpKernel\Exception\GoneHttpException
410Symfony\Component\HttpKernel\Exception\HttpException
500Symfony\Component\HttpKernel\Exception\LengthRequiredHttpException
411Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
405Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException
406Symfony\Component\HttpKernel\Exception\NotFoundHttpException
404Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException
412Symfony\Component\HttpKernel\Exception\PreconditionRequiredHttpException
428Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException
503Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException
429Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
401Symfony\Component\HttpKernel\Exception\UnsupportedMediaTypeHttpException
415下面是一个示例,当我们尝试更新一条已经被别人更新过的记录时抛出一个ConflictHttpException
异常:
$api->version('v1', function ($api) { $api->put('user/{id}', function ($id) { $user = User::find($id); if ($user->updated_at > app('request')->get('last_updated')) { throw new Symfony\Component\HttpKernel\Exception\ConflictHttpException('User was updated prior to your request.'); } // No error, we can continue to update the user as per usual. });});
Dingo API会自动捕获抛出的异常并将其转化为JSON格式,响应的HTTP状态码也会相应更改以匹配这个异常,ConflictHttpException
对应的HTTP状态码是409
,默认的JSON格式错误信息如下:
{ "message": "User was updated prior to your request.", "status_code": 409}
1、资源异常
以下是资源异常,每个异常都会返回422
状态码:
Dingo\Api\Exception\DeleteResourceFailedExceptionDingo\Api\Exception\ResourceExceptionDingo\Api\Exception\StoreResourceFailedExceptionDingo\Api\Exception\UpdateResourceFailedException
这些异常特殊之处在于你可以将创建、更新或者删除资源时遇到的验证错误传递到这些异常中。
下面我们就来看一个创建新用户验证失败抛出StoreResourceFailedException
异常的例子:
$api->version('v1', function ($api) { $api->post('users', function () { $rules = [ 'username' => ['required', 'alpha'], 'password' => ['required', 'min:7'] ]; $payload = app('request')->only('username', 'password'); $validator = app('validator')->make($payload, $rules); if ($validator->fails()) { throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create new user.', $validator->errors()); } // Create user as per usual. });});
Dingo API会自动捕获抛出的异常并将其转化为JSON格式,响应的HTTP状态码也会更改为与异常相匹配的值,资源异常会返回422
状态码以及如下JSON格式错误信息:
{ "message": "Could not create new user.", "status_code": 422, "errors": { "username": [ "The username field is required." ], "password": [ "The password field is required." ] }}
2、自定义HTTP异常
你可以创建自定义的HTTP异常,前提是它们继承自Symfony\Component\HttpKernel\Exception\HttpException
或者实现了Symfony\Component\HttpKernel\Exception\HttpExceptionInterface
接口。
3、自定义异常响应
如果你需要自定义异常返回的响应可以注册一个异常处理器:
app('Dingo\Api\Exception\Handler')->register(function (Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException $exception) { return Response::make(['error' => 'Hey, what do you think you are doing!?'], 401);});
现在如果认证失败我们会显示如下JSON格式信息:
{ "error": "Hey, what do you think you are doing!?"}
4、表单请求
如果你使用表单请求,那么需要继承API表单请求基类或者实现自己的类。API请求基类会检查输入请求是否是请求API,如果是的话当验证失败会抛出Dingo\Api\Exception\ValidationHttpException
异常。这个异常会被Dingo API渲染并返回错误响应。
如果你想要实现自己的表单请求,则必须重载failedValidation
和failedAuthorization
方法,这些方法必须抛出上述其中一种异常而不是Laravel抛出的HTTP异常。
- Laravel & Lumen RESTFul API 扩展包:Dingo API(四) —— 错误和异常响应
- Laravel & Lumen RESTFul API 扩展包:Dingo API(三) —— Response(响应)
- Laravel & Lumen RESTFul API 扩展包:Dingo API(五) —— 转化器(Transformer)
- Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Laravel & Lumen RESTFul API 扩展包:Dingo API(二) —— 创建 API Endpoint(路由)
- Laravel & Lumen RESTFul API 扩展包:Dingo API(二) —— 创建 API Endpoint(路由)
- 转--dingo/api扩展包
- Lumen 配合使用Dingo/Api的问题。
- Laravel-dingo/api获取路由
- Laravel 5 开发API(Dingo Api + JWT)
- laravel dingo/api 安装与配置
- laravel 5.4 JWT + Dingo 构建API 攻略
- laravel dingo API返回自定义错误信息
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- Laravel & Lumen RESTFul API 扩展包:Dingo API(三) —— Response(响应)
- SpringBoot-从入门到放弃(四) 配置文件的更多玩法
- oracle卸载
- POJ 1061青蛙的约会(扩展欧几里得)
- kingov-php设计模式
- Laravel & Lumen RESTFul API 扩展包:Dingo API(四) —— 错误和异常响应
- 声明与定义的区别
- POJ 3176-Cow Bowling [dp] 《挑战程序设计竞赛》2.3
- 记录一些工作上的事情
- HDOJ 1247 Hat’s Words(strncpy函数的运用)
- 结果集元数据的使用
- apply,by,eapply,lapply,mapply,rapply,tapply
- 判断一个有环链表的入口节点
- Hive 解锁操作