注解定义

  1. /**
  2. * 直接返回数组,默认成功方式
  3. * @Api()
  4. * @GetMapping(path="lists")
  5. */
  6. public function lists()
  7. {
  8. return [];
  9. }
  10. /**
  11. * 返回成功json
  12. * @Api()
  13. * @GetMapping(path="lists")
  14. */
  15. public function lists()
  16. {
  17. return $this->returnSuccessJson();
  18. }

返回

成功返回

  • returnSuccessJson
    • data 返回数据 默认array ,这里是数组,不要直接将数据库的model返回
    • msg 返回结果信息,成功默认请求成功或操作成功
    • code 成功默认是200
    • status 成功就是true
  • 直接返回数组会将数组作为 data 直接返回

    1. public function process(ProceedingJoinPoint $proceedingJoinPoint)
    2. {
    3. try {
    4. $res = $proceedingJoinPoint->process();
    5. //如果api接口返回数组,直接默认是成功返回格式
    6. return is_array($res) ? $this->response->json($this->api_service->encryptData([
    7. 'data' => $res,
    8. 'code' => 200,
    9. 'status' => true,
    10. 'msg' => $this->request->isMethod('GET') ? '请求成功' : '操作成功'
    11. ])) : $res;
    12. } catch (\Throwable $exception) {
    13. throw new ApiErrorException($exception->getMessage(), (int)$exception->getCode(),
    14. $exception->getPrevious());
    15. }
    16. }

    失败返回

  • returnErrorJson

    • msg 返回结果消息,只要是错误这些第一个必填的信息
    • code 默认错误是500
    • data 错误更多数据信息
    • status 错误默认是false

      数据加密

      配置

      通过配置文件api.php配置是否开启api数据加密,默认是根据项目环境判定。 ```php <?php declare(strict_types=1);

return [ ‘encode_data’ => env(‘APP_ENV’) !== ‘dev’ ];

  1. <a name="MxiQ3"></a>
  2. ### ApiService
  3. `ApiService` 是为获取API加密配置,生成key和加密数据的类型。
  4. - getEncodeData():bool 获取是否加密api数据配置
  5. - getApiKey():string 获取加密数据使用的key,类实例化的时候通过项目version生成
  6. - encryptData(array $data=[]):string 加密需要返回的数据数组
  7. <a name="tBcIo"></a>
  8. ### 前端解密
  9. ```javascript
  10. <script>
  11. {if $api_encode}
  12. let API_ENCODE = true
  13. let KEY = "{$api_key}";
  14. {else/}
  15. let API_ENCODE = false
  16. let KEY = "";
  17. {/if}
  18. </script>
       decryptRes: function (res) {
            if (API_ENCODE) {
                //开启了api加密,就需要解密处理
                let {data = ''} = res
                let key = CryptoJS.enc.Utf8.parse(KEY);
                let decrypted = CryptoJS.AES.decrypt(data, key, {
                    mode: CryptoJS.mode.ECB,
                    padding: CryptoJS.pad.Pkcs7
                }).toString(CryptoJS.enc.Utf8);
                res = JSON.parse(decrypted)
            }
            return res
        },

系统统一对 httpGethttpPost返回的数据统一进过解密处理。

异常处理

api的异常都会通过 ApiAspect的处理转成 ApiErrorException异常抛出。对于 ApiErrorException 系统也有统一的异常处理类 ApiErrorExceptionHandler进行处理。

dev环境

项目处于开发环境的状态下,异常处理过返回会带有异常详细信息。

{
  "status": false,
  "code": 500,
  "data": {
    "location": "用户名c1-lisi已经存在[58] in \/Applications\/MAMP\/htdocs\/hcms\/runtime\/container\/proxy\/App_Aspect_ApiAspect.proxy.php",
    "content": [
      {
        "file": "\/Applications\/MAMP\/htdocs\/hcms\/vendor\/hyperf\/di\/src\/Aop\/Pipeline.php",
        "line": 30,
        "function": "process",
        "class": "App\\Aspect\\ApiAspect",
        "type": "->",
        "args": [
          {
            "className": "App\\Application\\Admin\\Controller\\UserController",
            "methodName": "submitEdit",
            "arguments": {
              "keys": [],
              "order": []
            },
            "result": null,
            "originalMethod": {},
            "pipe": null
          }
        ]
      }
    ]
  },
  "msg": "用户名c1-lisi已经存在"
}