自定义接口错误响应格式

基础小知识
laravel 处理异常的位置在 app/Exceptions 这个目录,如果新建异常类,就在这个目录
这个目录中,最重要的是 Handler.php 这个文件,如何处理渲染异常,是这个类的 rander 方法。如果你需要自定义错误输出,其实就是重写这个 rander 方法。

1.在 app/Exceptions 下新建 ApiException

 1 <?php
 2 namespace App\Exceptions;
 3 
 4 use Exception;
 5 
 6 class ApiException extends Exception
 7 {
 8     const HTTP_OK = 200;
 9 
10     protected $data;
11 
12     protected $code;
13 
14     public function __construct($data, $code = self::HTTP_OK, array $meta = [])
15     {
16         // 第一个参数是data,是因为想兼容string和array两种数据结构
17         // 第二个参数默认取200,是因为公司前端框架限制,所以是status取200,错误码用code表示
18         // 如果第二个参数是任意httpStatus(如200,201,204,301,422,500),就只返回httpStatus,如果是自定义错误编码,(如600101,600102),就返回httpstatus为200,返回体中包含message和code。
19         // 第三个参数默认为空数组,如果在message和code之外,还需要返回数组,就传递第三个参数
20         $this->data = $data;
21         $this->code = $code;
22         $this->meta = $meta;
23 //        parent::__construct($data, $code);
24     }
25 
26     public function render()
27     {
28         $httpStatus = getHttpStatus();
29         $status  = in_array($this->code, $httpStatus) ? $this->code : self::HTTP_OK;
30         $content = [];
31         if (is_array($this->data)) {
32             $content = $this->data;
33         }
34         if (is_string($this->data)) {
35             $content = in_array($this->code, $httpStatus)
36                 ? [
37                     'message' => $this->data
38                 ]
39                 : [
40                     'message' => $this->data,
41                     'code'    => $this->code,
42                     //                    'timestamp' => time()
43                 ];
44         }
45 
46         if ($this->meta) {
47             $content = array_add($content, 'meta', $this->meta);
48         }
49 
50         return response($content, $status);
51     }
52 }

2.在\vendor\laravel\framework\src\Illuminate\Foundation\ helpers.php 中增加函数:(或者直接写在这个异常类中,私有调用)

该函数是获取 Symfony 定义的所有 Http 状态码。比如 200=HTTP_OK。

 1 /*
 2  * 获取 Symfony 定义的所有 Http 状态码
 3  * @auth jackie <2019.08.06>
 4  */
 5 function getHttpStatus()
 6 {
 7     $objClass = new \ReflectionClass(\Symfony\Component\HttpFoundation\Response::class);
 8     // 此处获取类中定义的全部常量 返回的是 [key=>value,...] 的数组,key是常量名,value是常量值
 9     return array_values($objClass->getConstants());
10 }

3.使用

ApiException($data, int $code=200, array $meta=[]);
第 1 个参数可以为 string 或 array.
第 2 个参数默认为 200,如果传的 code 是任意一个 httpStatus,表示返回的 http 状态码(如 404、500 等),
如果是自定义错误码(非任意一个 httpStatus,如 1001、1002),则 http 状态码返回 200,code 码在 json 内容中返回
第 3 个参数默认为空数组。如果传第 3 个参数,将一起返回。

1 use App\Exceptions\ApiException;
2 
3 
4 throw new ApiException(['msg' => '都是好孩子', 'code' => '123'], 403);

 自定义接口错误响应格式

 

上一篇:SSM整合步骤


下一篇:spring技术内幕学习笔记01