Laravel & Lumen RESTFul API 扩展包:Dingo API(四) -- 错误和异常响应

php中文网
发布: 2016-06-23 13:11:12
原创
2006人浏览过

在构建api的时候处理错误是一件痛苦的事儿,在dingo api中,你不需要手动构建错误响应,只需要抛出一个继承自 symfony\component\httpkernel\exception\httpexception的异常,api会自动为你处理这个响应。

下面是Dingo API内置的Symfony异常:

异常 状态码
Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException 403
Symfony\Component\HttpKernel\Exception\BadRequestHttpException 400
Symfony\Component\HttpKernel\Exception\ConflictHttpException 409
Symfony\Component\HttpKernel\Exception\GoneHttpException 410
Symfony\Component\HttpKernel\Exception\HttpException 500
Symfony\Component\HttpKernel\Exception\LengthRequiredHttpException 411
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException 405
Symfony\Component\HttpKernel\Exception\NotAcceptableHttpException 406
Symfony\Component\HttpKernel\Exception\NotFoundHttpException 404
Symfony\Component\HttpKernel\Exception\PreconditionFailedHttpException 412
Symfony\Component\HttpKernel\Exception\PreconditionRequiredHttpException 428
Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException 503
Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException 429
Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException 401
Symfony\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异常的例子:

豆包爱学
豆包爱学

豆包旗下AI学习应用

豆包爱学 674
查看详情 豆包爱学
$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异常。

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号