请问有没有 Laravel API 接口 统一返回格式和处理异常的最佳实践?

Laravel API 接口怎么返回统一格式和处理异常?

我们在开发中和前端的对接经常需要返回以下格式:

code: // 业务码
status: // 状态
message: // 消息
data: // 数据

但我看网上实现的方式五花八门,有的用 Trait 有的用 中间件,有的自定义 Response 响应类

我自己也是乱写,不知道规范的是什么样的,请问有没有相关的文章或代码能够分享参考下的,非常感谢。

悲观者永远正确,乐观者永远前行。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案

这个没强制要求,子类继承父类或者用Trait,用法都是$this->。一个是继承子父类,一个是用use没啥差别,怎么方便怎么来。使用中间件的应该是做了参数校验吧,其实本质上还是调用\Illuminate\Http\JsonResponse。我一般用继承,因为接口控制器(类)基本都是继承App\Controllers\Controller.php,所以干脆直接在里面写就好了。 可以参考一下我写的:

use Illuminate\Http\Response;
/**
     * 返回成功信息
     * @param array $data
     * @param string $message
     * @param int $code
     * @param bool $status
     * @return \Illuminate\Http\JsonResponse
     */
    public function success(array $data = [], string $message = "请求成功", int $code = Response::HTTP_OK, bool $status = true): \Illuminate\Http\JsonResponse
    {
        return response()->json(['status' => $status, 'code' => $code, 'message' => $message, 'data' => $data]);
    }

    /**
     * 返回失败信息
     * @param $code
     * @param $message
     * @param bool $status
     * @return \Illuminate\Http\JsonResponse
     */
    public function failed($code, $message, bool $status = false): \Illuminate\Http\JsonResponse
    {
        return response()->json(['status' => $status, 'code' => $code, 'message' => $message]);
    }
2年前 评论
MArtian (楼主) 2年前
她来听我的演唱会 (作者) 2年前
MArtian (楼主) 2年前
讨论数量: 6

有一个扩展包,你可以参考 Jiannei/laravel-response 源码

2年前 评论

这个没强制要求,子类继承父类或者用Trait,用法都是$this->。一个是继承子父类,一个是用use没啥差别,怎么方便怎么来。使用中间件的应该是做了参数校验吧,其实本质上还是调用\Illuminate\Http\JsonResponse。我一般用继承,因为接口控制器(类)基本都是继承App\Controllers\Controller.php,所以干脆直接在里面写就好了。 可以参考一下我写的:

use Illuminate\Http\Response;
/**
     * 返回成功信息
     * @param array $data
     * @param string $message
     * @param int $code
     * @param bool $status
     * @return \Illuminate\Http\JsonResponse
     */
    public function success(array $data = [], string $message = "请求成功", int $code = Response::HTTP_OK, bool $status = true): \Illuminate\Http\JsonResponse
    {
        return response()->json(['status' => $status, 'code' => $code, 'message' => $message, 'data' => $data]);
    }

    /**
     * 返回失败信息
     * @param $code
     * @param $message
     * @param bool $status
     * @return \Illuminate\Http\JsonResponse
     */
    public function failed($code, $message, bool $status = false): \Illuminate\Http\JsonResponse
    {
        return response()->json(['status' => $status, 'code' => $code, 'message' => $message]);
    }
2年前 评论
MArtian (楼主) 2年前
她来听我的演唱会 (作者) 2年前
MArtian (楼主) 2年前

RESTFul 里没有所谓的 code data msg ,出参就是对象,不是对象肯定异常了,这时候状态码不是200,message就会被返回,laravel默认就是这样,没必要画蛇添足,对于前端开发或者APP开发,很多开发者被误导,对返回值先判断2XX,再解析code,再解析一遍data,做了无用功,现在前端框架包括APP框架的httpclient 大部分都在请求拦截器和响应拦截器,对非2xx响应都能很好的通过拦截器处理,很多开发者,非得自己去解析data。不知道他们怎么想的。
向java里的 okhttp,出参可以直接就赋值到目标dao,完全没有必要包一层 code msg data,对于非2xx响应,比如表单错误,直接在拦截器里接 422 就行了,解析出来就是异常信息,如果你觉得非得加,不加不舒服,那么我要说,不要在2xx响应里加,一点意义没有,你在非2xx响应里加个 sub_code 我勉强还可以认为你是为了让前端去识别具体的业务异常,事实上你可以看看最新的微信支付V3接口,看看标准的RESTFul是如何响应的。

2年前 评论
MArtian (楼主) 2年前

可以参考一下这两篇文章。

链接一

链接二

2年前 评论
MArtian (楼主) 2年前
JeffreyBool

laravel 有默认的返回结构

2年前 评论

200正常 400 error=>错误 401 未登录  403 没权限 我们只有4个

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!