一,新增接口返回码配置文件
在config中新增配置文件apicode.php
<?php
return [
'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
<?php
namespace 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格式的信息
<?php
namespace 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::class
App\Exceptions\ExceptionHandler::class
);