laravel ApiResponse接口统一响应封装

news/2025/2/12 7:47:24/

一,新增接口返回码配置文件

在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
);

在这里插入图片描述


http://www.ppmy.cn/news/1371707.html

相关文章

本地nodejs和npm版本过高,无法正常使用npm下载低npm版本项目所需依赖,不降级解决办法

这里需要使用到cnpm&#xff1a; 1.导入下载好到的项目 2.安装cnpm&#xff1a; npm install cnpm -g 3.安装 node-sass&#xff1a; cnpm install node-sass 4.继续安装&#xff1a;cnpm i node-sass -D 5.删除项目中出现的 node_modules文件夹 6.根据package.json重新安…

深度学习GPU环境安装(WINDOWS安装NVIDIA)

1.检测是否支持GPU环境 1.1.打开设备管理器 winows下面搜索设备管理器&#xff08;或者从桌面"此电脑"——>右键点击——>"管理"打开&#xff09; 1.2.查看本地显卡 在"设备管理器"——"显示适配器"中&#xff0c;如果没有&…

LeetCode-第162题-寻找峰值

1.题目描述 峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums&#xff0c;找到峰值元素并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回 任何一个峰值 所在位置即可。 你可以假设 nums[-1] nums[n] -∞ 。 你必须实现时间…

【C语言】Leetcode 876. 链表的中间节点

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《Leetcode》 题目 通过题目的要求可以判断出有两种示例要解决&#xff0c;一种是偶数节点的链表&#xff0c;一种是奇数节点的链表&#xff0c;应对这两种情况我们需要使程序对二者都可以兼容。 解决思路 struct ListNode…

2张图2秒钟3D重建!这款AI工具火爆GitHub,网友:忘掉Sora

只需2张图片&#xff0c;无需测量任何额外数据—— 当当&#xff0c;一个完整的3D小熊就有了&#xff1a; 这个名为DUSt3R的新工具&#xff0c;火得一塌糊涂&#xff0c;才上线没多久就登上GitHub热榜第二。 ▲image 有网友实测&#xff0c;拍两张照片&#xff0c;真的就重建…

阿里巴巴淘口令API推动电商行业社交化营销创新

阿里巴巴淘口令API&#xff08;也称为“淘口令”或“淘宝客口令”&#xff09;是一种用于分享和推广商品或服务的短链接技术&#xff0c;它结合了阿里巴巴集团的电商生态和社交媒体功能&#xff0c;使得用户能够轻松地将商品信息分享到各种社交平台&#xff0c;从而推动电商行业…

将预测的分割结果可视化

一、Login | MaCVi 该网站下注册一个账号&#xff0c;登录进去 二、跑完infer的代码后&#xff0c;在output文件下面存储预测的分割结果mask&#xff0c;将其打包上传到macvi.org相同的赛道 打包tip: #压缩文件 zip -r test.zip file然后利用Xtfp从服务器传输到本地&#xff…

MySQL 学习记录 2

原文&#xff1a;https://blog.iyatt.com/?p13818 13 存储引擎 查看一下前面创建的一张表的创建语句&#xff0c;当时并没有显式指定引擎&#xff0c;MySQL 自动指定的 InnoDB&#xff0c;即默认引擎是这个。 创建表的时候要显式指定引擎可以参考这个语句 查看当前 MySQL …