注解定义
/**
* 直接返回数组,默认成功方式
* @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 = true
let KEY = "{$api_key}";
{else/}
let API_ENCODE = false
let 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已经存在"
}