Thinkphp封装统一响应

前言

我们平时开发新项目api接口的时候总是要先自定义自己的响应数据格式,但是每个人的风格习惯不同,导致开发人员封装的响应数据格式不统一,而且需要花时间去重复写。本篇文章主要是统一 API 开发过程中「成功」、「失败」以及「异常」情况下的响应数据格式。

封装响应

为了方便调整适合自己的响应格式,这里使用自定义trait来实现

我们新建文件application/common/traits/CustomResponse(基于tp5,其他版本类似),文件内容直接复制下面的代码然后保存,注意修改为你的命名空间:

<?phpnamespace app\common\traits;use think\exception\HttpResponseException;
use think\Response;trait CustomResponse{//默认输出类型,可选择json、jsonp、xml、html、view、redirect等//参考thinkphp文档https://doc.thinkphp.cn/v5_1/xiangyingshuchu.htmlprotected $type = 'json';/*** 操作成功返回的数据.** @param mixed  $data   要返回的数据* @param string $msg    提示信息* @param int    $code   错误码,默认为1* @param string $type   输出类型* @param array  $header 发送的 Header 信息*/protected function success($data = null, $msg = '请求成功', $code = 200, array $header = []){$this->result($msg, $data, $code, $header, 'success');}/*** 操作成功返回默认message** @param string $msg    提示信息*/protected function ok($msg = '请求成功'){$this->result($msg,null, 200);}/*** 操作失败返回的数据.** @param string $msg    提示信息* @param mixed  $data   要返回的数据* @param int    $code   错误码,默认为0* @param string $type   输出类型* @param array  $header 发送的 Header 信息*/protected function fail($msg = '请求失败', $data = null, $code = 500, array $header = []){$this->result($msg, $data, $code, $header, 'fail');}/*** 系统异常返回的数据.** @param string $msg    提示信息* @param mixed  $data   要返回的数据* @param int    $code   错误码,默认为0* @param string $type   输出类型* @param array  $header 发送的 Header 信息*/protected function error($msg = '系统异常', $data = null, $code = 500, array $header = []){$this->result($msg, $data, $code, $header, 'error');}/*** BadRequest**/protected function errorBadRequest(){$this->result('400 Bad Request',null, 400, [], 'error');}/*** Unauthorized**/protected function errorUnauthorized(){$this->result('Unauthorized',null, 401, [], 'error');}/*** Forbidden**/protected function errorForbidden(){$this->result('403 Forbidden',null, 403, [], 'error');}/*** 404 Not Found**/protected function errorNotFound(){$this->result('404 Not Found',null, 404, [], 'error');}/*** Method Not Allowed**/protected function errorMethodNotAllowed(){$this->result('Method Not Allowed',null, 405, [], 'error');}/*** 返回封装后的 API 数据到客户端.** @param mixed  $msg    提示信息* @param mixed  $data   要返回的数据* @param int    $code   错误码,默认为0* @param string $type   输出类型,支持json/xml/jsonp* @param array  $header 发送的 Header 信息** @throws HttpResponseException* @return void*/protected function result($msg, $data = null, $code = 200, array $header = [], $status = 'success'){$result = ['code' => $code,'status' => $status, // 状态有success、fail、error3种'msg'  => $msg,'data' => $data,];if (isset($header['statuscode'])) {$code = $header['statuscode'];unset($header['statuscode']);} else {//未设置状态码,根据code值判断$code = $code >= 1000 || $code < 200 ? 200 : $code;}$response = Response::create($result, $this->type, $code)->header($header);throw new HttpResponseException($response);}
}

引入trait

在基类控制器或者直接在需要的控制器中引入trait

<?phpnamespace app\index\controller;use app\common\traits\CustomResponse; # 引入trait的命名空间class Controller{use CustomResponse; # 引入trait}

注意事项:index模块继承的Controller默认use Jump,里面也有success、fail、error方法,所以同时使用的话会冲突,只能二选一

成功响应

<?phpnamespace app\index\controller;class Index extends Controller
{//testpublic function index(){$this->success();}
}

更多用法

  • 返回默认message

    $this->ok();//返回结果
    {"code": 200,"status": "success","msg": "请求成功","data": null
    }
    
  • 返回指定message

    $this->ok('提交成功');//返回结果
    {"code": 200,"status": "success","msg": "提交成功","data": null
    }
    
  • 仅返回data

    $data = ['id' => 1, 'name' => 'test'];
    $this->success($data);//返回结果
    {"code": 200,"status": "success","msg": "请求成功","data": {"id": 1,"name": "test"}
    }
    
  • 返回data和message

    $data = ['id' => 1, 'name' => 'test'];
    $this->success($data, '成功');//返回结果
    {"code": 200,"status": "success","msg": "成功","data": {"id": 1,"name": "test"}
    }
    
  • 返回data和message并指定状态码

    $data = ['id' => 1, 'name' => 'test'];
    $this->success($data, '成功', 201);//返回结果
    {"code": 201,"status": "success","msg": "成功","data": {"id": 1,"name": "test"}
    }
    
  • 添加header

    $data = ['id' => 1, 'name' => 'test'];
    $this->success($data, '成功', 201, ['Content-Type:application/json; charset=utf-8']);//返回结果
    {"code": 201,"status": "success","msg": "成功","data": {"id": 1,"name": "test"}
    }
    

失败响应

  • 返回默认message

    $this->fail();//返回结果
    {"code": 500,"status": "fail","msg": "请求失败","data": null
    }
    
  • 返回指定message

    $this->fail('提交失败');//返回结果
    {"code": 500,"status": "fail","msg": "提交失败","data": null
    }
    
  • data和message

    $data = ['name' => 'test'];
    $this->fail('提交失败', $data);//返回结果
    {"code": 500,"status": "fail","msg": "提交失败","data": {"name": "test"}
    }
    
  • 返回data和message并指定状态码

    $data = ['name' => 'test'];
    $this->fail('提交失败', $data, 501);//返回结果
    {"code": 501,"status": "fail","msg": "提交失败","data": {"name": "test"}
    }
    
  • 添加header

    $data = ['name' => 'test'];
    $this->fail('提交失败', $data, 501, ['Content-Type:application/json; charset=utf-8']);//返回结果
    {"code": 501,"status": "fail","msg": "提交失败","data": {"name": "test"}
    }
    

异常响应

  • 自定义异常

    $this->error('系统异常');//返回结果
    {"code": 500,"status": "error","msg": "系统异常","data": null
    }
    

    用法与失败响应相同,只是status字段有差别

  • Bad Request

    $this->errorBadRequest();//返回结果
    {"code": 400,"status": "error","msg": "400 Bad Request","data": null
    }
    
  • 未登录授权

    $this->errorUnauthorized();//返回结果
    {"code": 401,"status": "error","msg": "Unauthorized","data": null
    }
    
  • 403 Forbidden

    $this->errorForbidden();//返回结果
    {"code": 403,"status": "error","msg": "Forbidden","data": null
    }
    
  • 404 Not Found

    $this->errorNotFound();//返回结果
    {"code": 404,"status": "error","msg": "404 Not Found","data": null
    }
    
  • Method Not Allowed

    $this->errorMethodNotAllowed();//返回结果
    {"code": 405,"status": "error","msg": "Method Not Allowed","data": null
    }
    

内置的方法不是很多,但是应该够用了,如果需要自定义可以在trait中添加自己需要的方法或字段,同样的,封装代码中的提示信息你也可以随便修改。

参考文章:

laravel-response: 🤖 Provide a standardized and unified response data format for Laravel and Lumen API projects. - 为 Laravel 和 Lumen API 项目提供一个规范统一的响应数据格式。 - Gitee.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSR是个什么寄存器

MSR 这种寄存器专门用于调试、程序执行跟踪、计算机性能监控、简化软件编程、电源控制等等各种实验性功能。 什么是 MSR MSR 的概念是不易理解&#xff0c;所以这一节只说一些 MSR 的外在&#xff0c;比如形容和指令等&#xff0c;然后展开说说&#xff0c;看完整篇文章你应该…

计算机视觉 CV 八股分享 [自用](更新中......)

目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…

【uniapp】 合成海报组件

之前公司的同事写过一个微信小程序用的 合成海报的组件 非常十分好用 最近的项目是uni的 把组件改造一下也可以用 记录一下 <template><view><canvas type"2d" class"_mycanvas" id"my-canvas" canvas-id"my-canvas" …

RT-Thread电源管理组件

电源管理组件 嵌入式系统低功耗管理的目的在于满足用户对性能需求的前提下&#xff0c;尽可能降低系统能耗以延长设备待机时间。 高性能与有限的电池能量在嵌入式系统中矛盾最为突出&#xff0c;硬件低功耗设计与软件低功耗管理的联合应用成为解决矛盾的有效手段。 现在的各种…

UniApp 中的路由魔法:玩转页面导航与跳转

正文&#xff1a; 路由在移动应用开发中是一个至关重要的概念&#xff0c;它决定了用户在应用中导航的方式&#xff0c;以及页面之间的跳转和传参方式。在 UniApp 中&#xff0c;路由配置也有其独特的特点和用法。本文将深入探讨 UniApp 中的路由配置&#xff0c;带你领略其中…

排序算法之桶排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性桶排序O(nk )O(nk)O(n^2)O(nk)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…

NIO之非阻塞模式

NIO支持非阻塞模式&#xff0c;以网络连接和网络数据传输为例。如果使用阻塞模式&#xff0c;ServerSocketChannel在调用accept等待客户端建立连接是阻塞的&#xff0c;没有连接就一直阻塞。从Channel中读取客户端传送的数据也是阻塞的&#xff0c;没有数据就一直阻塞。当我们开…

Kotlin语法快速入门--条件控制和循环语句(2)

Kotlin语法入门–条件控制和循环语句&#xff08;2&#xff09; 文章目录 Kotlin语法入门--条件控制和循环语句&#xff08;2&#xff09;二、条件控制和循环语句1、if...else2、when2.1、常规用法2.2、特殊用法--并列&#xff1a;2.3、特殊用法--类型判断&#xff1a;2.4、特殊…

C语言进阶课程学习记录-第48课 - 函数设计原则

C语言进阶课程学习记录 - 函数设计原则 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录

无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

无人驾驶 百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用…

Linux i2c-tool工具基础使用

一.i2cdetect i2cdetect 是一个用户空间程序&#xff0c;用于扫描 I2C 总线上的设备。它输出一个表格&#xff0c;其中包含指定总线上检测到的设备列表。以下是 i2cdetect 的使用方法&#xff1a; 运行扫描&#xff1a; 要执行 I2C 扫描&#xff0c;请使用以下命令&#xff1…

解决Java Heap Space问题的排查与优化方法

引言&#xff1a; 在 Java 开发中&#xff0c;经常会遇到 “java heap space” 错误&#xff0c;这意味着程序需要更多的堆内存来执行所需的操作。本文将介绍如何排查和解决这个问题&#xff0c;并提供一些优化方法&#xff0c;以避免类似的错误发生。 1. 确认错误信息 当遇到…

端口被占用的解决方案汇总

端口被占用的解决方案汇总 【一】windows系统端口被占用【二】Linux系统端口被占用【三】Linux的ps命令查找&#xff08;1&#xff09;ps命令常用的方式有三种&#xff08;2&#xff09;ps -ef |grep 8080 【一】windows系统端口被占用 &#xff08;1&#xff09;键盘上按住Wi…

【LeetCode刷题记录】21. 合并两个有序链表

21 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 …

# MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

密码学系列4-选择密文安全,同态加密安全性

本章将介绍Cramer-Shoup加密方案,并证明其安全性。最后讨论了同态加密方案的安全性证明 一、Cramer-Shoup加密 密钥生成 1.定义群 G G G,群的阶为 q q q,选取群的生成元

调试 WebSocket API 技巧分享

WebSocket 是一种在单个 TCP 连接上实现全双工通信的先进 API 技术。与传统的 HTTP 请求相比&#xff0c;WebSocket 提供了更低的延迟和更高的通信效率&#xff0c;使其成为在线游戏、实时聊天等应用的理想选择。 开始使用 Apifox 的 WebSocket 功能 首先&#xff0c;在项目界…

node和go的列表转树形, 执行速度测试对比

保证数据一致性&#xff0c;先生成4000条json数据到本地&#xff0c;然后分别读取文本执行处理 node代码 node是用midway框架 forNum1:number 0forNum2:number 0//执行测试async index(){// 生成菜单列表// const menuList await this.generateMenuList([], 4000);const men…

密码学系列5-BLS短签名和存在不可伪造性(EUF-CMA)

本章将给出BLS短签名方案和方案的安全性证明。这个方案是很多签名方案的基础方案,学会这一个方案,也就学会了这一系列方案的安全性证明。 注:签名方案:私钥签名,公钥验证;加密方案:公钥加密,私钥解密。 论文名:Short signatures from the Weil pairing 一、BLS短签名 …

双周总结#008 - AIGC

本周参与了公司同事对 AIGC 的分享会&#xff0c;分享了 AIGC 在实际项目中的实践经验&#xff0c;以及如何进行 AIGC 的落地。内容分几项内容&#xff1a; 什么是 AIGCAIGC 能做什么AIGC 工具 以年终总结为例&#xff0c;分享了哪些过程应用了 AIGC&#xff0c;以及 AIGC 落地…