一,新增接口返回码配置文件
在config中新增配置文件apicode.php
<?phpreturn [
'apicodes'=>[/*** @Message("OK")* 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上*/'HTTP_OK' => 200,/*** @Message("Created")* 对创建新资源的 POST 操作进行响应。应该带着指向新资源地址的 Location 头*/'CREATED' => 201,/*** @Message("Accepted")* 服务器接受了请求,但是还未处理,响应中应该包含相应的指示信息,告诉客户端该去哪里查询关于本次请求的信息*/'ACCEPTED' => 202,/*** @Message("No Content")* 对不会返回响应体的成功请求进行响应(比如 DELETE 请求)*/'NO_CONTENT' => 203,/*** @Message("Not Modified")* HTTP缓存header生效的时候用*/'NOT_MODIFIED' => 304,/*** @Message("Temporary Redirect")* 对应当前请求的响应可以在另一个 URI 上被找到,客户端应该保持原有的请求方法进行请求*/'TEMPORARY_REDIRECT' => 307,/*** @Message("Bad Request")* 请求异常,比如请求中的body无法解析*/'BAD_REQUEST' => 400,/*** @Message("Unauthorized")* 没有进行认证或者认证非法*/'UNAUTHORIZED' => 401,/*** @Message("Forbidden")* 服务器已经理解请求,但是拒绝执行它*/'FORBIDDEN' => 403,/*** @Message("Not Found")* 请求一个不存在的资源*/'NOT_FOUND' => 404,/*** @Message("Method Not Allowed")* 所请求的 HTTP 方法不允许当前认证用户访问*/'METHOD_NOT_ALLOWED' => 405,/*** @Message("Gone")* 表示当前请求的资源不再可用。当调用老版本 API 的时候很有用*/'GONE' => 410,/*** @Message("Unsupported Media Type")* 如果请求中的内容类型是错误的*/'UNSUPPORTED_MEDIA_TYPE' => 415,/*** @Message("Unprocessable Entity")* 用来表示校验错误*/'UNPROCESSABLE_ENTITY' => 422,/*** @Message("Too Many Requests")* 由于请求频次达到上限而被拒绝访问*/'TOO_MANY_REQUESTS' => 429,/*** @Message("Internal Server Error")* 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理*/'SERVER_ERROR' => 500,/*** @Message("Bad Gateway")* 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应*/'BAD_GATEWAY' => 502,/*** @Message("Service Unavailable")* 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After* 头用以标明这个延迟时间(内容可以为数字,单位为秒;或者是一个 HTTP 协议指定的时间格式)。如果没有给出这个 Retry-After 信息,那么客户端应当以处理 500 响应的方式处理它*/'SERVICE_UNAVAILABLE' => 50,/*** @Message("Gateway Timeout")*/'GATEWAY_TIMEOUT' => 504,/*** @Message("HTTP Version Not Supported")*/'HTTP_VERSION_NOT_SUPPORTED' => 505]
];
二,新增接口统一响应封装trait
<?phpnamespace App\traits;use Illuminate\Support\Facades\Response;trait ApiResponse
{/*** @var int*/protected $statusCode = 200;/*** @return mixed*/public function getStatusCode(){return $this->statusCode;}/*** @param $statusCode* @return $this*/public function setStatusCode($statusCode){$this->statusCode = $statusCode;return $this;}/*** @param $data* @param array $header* @return mixed*/public function respond($data, $header = []){return Response::json($data, $this->getStatusCode(), $header);}/*** @param $status* @param array $data* @param null $code* @return mixed*/public function status($status, array $data, $code = null){if ($code) {$this->setStatusCode($code);}$status = ['status' => $status,'code' => $this->statusCode];$data = array_merge($status, $data);return $this->respond($data);}/*** @param $message* @param int $code* @param string $status* @return mixed*/public function error($message, $code = 'BAD_REQUEST'){return $this->status('error', ['message' => $message,'code' => config('apicode.apicodes.'.$code)],config('apicode.apicodes.'.$code));}/*** @param $message* @param string $status* @return mixed*/public function message($message, $status = "success"){return $this->status($status, ['message' => $message]);}/*** @param $data* @param string $status* @return mixed*/public function success($data, $status = "success"){return $this->status($status, compact('data'));}
}
三,使用
先 use ApiResponse;
use ApiResponse;
public function login(Request $request){$input = $request->only('account', 'password');//此处可以自己查数据库,判断是否用户名和密码正确$user = User::query()->where(['account' => $input['account']])->firstOrFail();//生成token两种方式//$token = Auth::guard('api')->fromUser($user);$token = JWTAuth::fromUser($user);//dd($token);die;$data['token']="bearer ".$token;$data['user']=$user;return $this->success($data);}
四,接管系统异常返回
首先我们在app/Exceptions目录新建一个ExceptionHandler.php继承自同目录下的Handler.php代码如下
在render方法里,我们根据.env文件中的APP_DEBUG来判断,如果是调试模式,我们还是按照默认方式来渲染错误,如果是非调试模式,我们就返回JSON格式的信息
<?phpnamespace App\Exceptions;
use App\traits\ApiResponse;
class ExceptionHandler extends Handler
{use ApiResponse;public function render($request, \Throwable $exception){if (env('APP_DEBUG')) {return parent::render($request, $exception);}return $this->error($exception->getMessage(),'UNAUTHORIZED');}
}
然后我们在bootstrap/app.php中,使用我们自定义的异常处理类ExceptionHandler替换掉默认的Handler类
$app->singleton(Illuminate\Contracts\Debug\ExceptionHandler::class,//App\Exceptions\Handler::classApp\Exceptions\ExceptionHandler::class
);