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

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

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

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

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

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

悲观者永远正确,乐观者永远前行。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

这个没强制要求,子类继承父类或者用 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]);
    }
3年前 评论
MArtian (楼主) 3年前
她来听我的演唱会 (作者) 3年前
MArtian (楼主) 3年前
讨论数量: 6

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

3年前 评论

这个没强制要求,子类继承父类或者用 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]);
    }
3年前 评论
MArtian (楼主) 3年前
她来听我的演唱会 (作者) 3年前
MArtian (楼主) 3年前

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 是如何响应的。

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

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

链接一

链接二

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

laravel 有默认的返回结构

3年前 评论

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

3年前 评论