@dptms API请求成功后返回的是你在 transformer 中定义的变量,你可以在其中自定义返回的 message。除了这些你还可以在对应的 controller 中通过 setMeta()
和 setStatusCode()
函数来携带你想要的 Code 以及教程中所提到的信息。
@dptms 如果你要改变 HTTP 请求的状态码, 2*
的可以用 setStatusCode() 设置,4*
、5*
的需要在抛出的异常中自定义错误码,建议从 vendor/tymon/src/JWT.php
看起,JWT 封装了不同的异常,都对应着不同的 code 码。
@zssen 谢谢哥对我耐心的解释,我现在的需求是,我用的这个 api 教程的方法,在 transformer
方法
return $this->response->item($user, new UserTransformer());
返回的格式如下
{
data:{
"id":1,
"nickname":"dp~",
"avatar":"https://wx.qlogo.cn/mmopen/vi_32/u5",
"sex":"1",
"birthday":"未填写",
"live_place":"未填写",
"sign":"未填写",
"created_at":"2018-04-18 10:47:57",
"updated_at":"2018-04-18 10:48:23"
}
}
我想加上 自己的业务 code
如 code:20001
, message:成功
这样子的跟 data
平级。
你其实是想在不消除 data
这个 key 的时候,加入自定义的 code,保持跟 data
同级。但目前来说好像并没有很好的办法解决。教程中有讲到通过 composer liyu/dingo-serializer-switch
这个插件使响应结果更好看,也就没 data
这个 key 了, 然后你再把你要的 code 和 message 加到 transformer 中,也能保持你想要自定义的 code 是最顶级。其他的办法目前想不到了。就会是这种形式
{
"id":1,
"nickname":"dp~",
"avatar":"https://wx.qlogo.cn/mmopen/vi_32/u5",
"sex":"1",
"birthday":"未填写",
"live_place":"未填写",
"sign":"未填写",
"created_at":"2018-04-18 10:47:57",
"updated_at":"2018-04-18 10:48:23",
"code":2001,
"message":"成功"
}
我的做法是用中间件实现
try {
$response = $next($request);
if ($response instanceof Response) {
if ($response->exception instanceof Exception) {
throw $response->exception;
}
$content = $response->getOriginalContent();
if (is_array($content)) {
if (!array_has($content, 'code')) {
$content['code'] = $response->getStatusCode() * 100;
}
if (!array_has($content, 'message')) {
$content['message'] = '成功!';
}
$response->setContent($content);
}
}
return $response;
} catch (Exception $exception) {
$code = ($exception instanceof HttpExceptionInterface) ? $exception->getStatusCode() : 500;
$message = $exception->getMessage();
Log::error('dafy.error', compact('message'));
if (str_contains($message, 'SQLSTATE')) {
$message = '服务器内部错误';
}
return new JsonResponse([
'data' => [
'message' => $message,
],
'message' => $message,
'code' => (int)($code * 100),
]);
}
推荐文章: