注解定义
/*** 直接返回数组,默认成功方式* @Api()* @GetMapping(path="lists")*/public function lists(){return [];}/*** 返回成功json* @Api()* @GetMapping(path="lists")*/public function lists(){return $this->returnSuccessJson();}
返回
成功返回
- returnSuccessJson
- data 返回数据 默认array ,这里是数组,不要直接将数据库的model返回
- msg 返回结果信息,成功默认请求成功或操作成功
- code 成功默认是200
- status 成功就是true
直接返回数组会将数组作为 data 直接返回
public function process(ProceedingJoinPoint $proceedingJoinPoint){try {$res = $proceedingJoinPoint->process();//如果api接口返回数组,直接默认是成功返回格式return is_array($res) ? $this->response->json($this->api_service->encryptData(['data' => $res,'code' => 200,'status' => true,'msg' => $this->request->isMethod('GET') ? '请求成功' : '操作成功'])) : $res;} catch (\Throwable $exception) {throw new ApiErrorException($exception->getMessage(), (int)$exception->getCode(),$exception->getPrevious());}}
失败返回
returnErrorJson
return [ ‘encode_data’ => env(‘APP_ENV’) !== ‘dev’ ];
<a name="MxiQ3"></a>### ApiService`ApiService` 是为获取API加密配置,生成key和加密数据的类型。- getEncodeData():bool 获取是否加密api数据配置- getApiKey():string 获取加密数据使用的key,类实例化的时候通过项目version生成- encryptData(array $data=[]):string 加密需要返回的数据数组<a name="tBcIo"></a>### 前端解密```javascript<script>{if $api_encode}let API_ENCODE = truelet KEY = "{$api_key}";{else/}let API_ENCODE = falselet KEY = "";{/if}</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
},
系统统一对 httpGet 和 httpPost返回的数据统一进过解密处理。
异常处理
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已经存在"
}
