goframe框架规范限制(but it should be named with “Res“ suffix like “XxxRes“)
背景:
首页公司最近要启动一个项目,公司主要业务是用java开发的,但是目前这个方向的项目,公司要求部署在主机上,就是普通的一台电脑上,电脑配置不详,还有经常开关机,所以用java面临一些问题,内存占用过高,启动过慢;因此需要寻找解决方案,我这边目前根据情况,尝试用go语言,本身也想学学这块语言,花费了大概两周时间,基本上没啥大问题了,开始研究框架,也对比了很多go框架,发现国产的goframe框架各方面还不错,了解了一下,就开始搭建项目框架,遇到了一个很无语的问题,也就是goframe规范要求,controller 请求参数和返回参数必须要定义XxxReq 和XxxRes 结构体,然后才能运行通过,否则就会报:
其实对于req来说,我这边是可以接受的,因为参数用新的结构体接受是合理的,
但是返回必须要求Res 就有些强制性了,每个团队每个项目情况都不一致,强制返回会对客户端造成困扰,关键,这样的效果不好,大家看下:
对应客户端返回结果:
会发现,返回的包装体里面在包装一个字段,虽然这样也可以实现业务,但是过于麻烦,为什么不能直接用data接收呢?
{"code": 0,"message": "","data": true
}
返回这样多简单,方便。
针对上面的问题,该如何解决呢?
我这边排查了下返回包装体是,goframe有个中间件进行设置了:
ghttp.MiddlewareHandlerResponse
就是它,我们开始自定义中间件:
1、把
ghttp.MiddlewareHandlerResponse 拷贝出来自行定义一个出来,实现包装体那块稍微调整下即可:
// 返回值设置
func (s *sMiddleware) MiddlewareHandlerResponse(r *ghttp.Request) {r.Middleware.Next()// There's custom buffer content, it then exits current handler.if r.Response.BufferLength() > 0 {return}var (msg stringerr = r.GetError()res = r.GetHandlerResponse()code = gerror.Code(err))if err != nil {if code == gcode.CodeNil {code = gcode.CodeInternalError}msg = err.Error()} else {if r.Response.Status > 0 && r.Response.Status != http.StatusOK {msg = http.StatusText(r.Response.Status)switch r.Response.Status {case http.StatusNotFound:code = gcode.CodeNotFoundcase http.StatusForbidden:code = gcode.CodeNotAuthorizeddefault:code = gcode.CodeUnknown}// It creates error as it can be retrieved by other middlewares.err = gerror.NewCode(code, msg)r.SetError(err)} else {code = gcode.CodeOK}}//删除掉或注释掉/*r.Response.WriteJson(result.ResultRes{Code: code.Code(),Message: msg,Data: res,})*///code正常,直接写回结果到客户端if code == gcode.CodeOK {r.Response.WriteJson(res)} else {//非正常,重新组装结果数据,把系统相关code和错误信息一并返回客户端r.Response.WriteJson(result.ResultRes{Code: code.Code(),Message: msg,Data: nil,})}}
result.ResultRes是个什么玩意呢,我这边自己写的包装体,写发出来:
type ResultRes struct {Code int `json:"code" dc:"错误码:0成功,非0失败"`Message string `json:"message" dc:"异常信息"`Data interface{} `json:"data" dc:"结果信息"`
}func (r *ResultRes) SuccessAll(data interface{}, msg string) {if msg == "" {msg = "操作成功"}r.Code = gcode.CodeOK.Code()r.Message = msgr.Data = data
}func (r *ResultRes) Success(data interface{}) {r.SuccessAll(data, "")
}func (r *ResultRes) SuccessNo() {r.Success(nil)
}
func (r *ResultRes) SuccessMsg(msg string) {r.SuccessAll(nil, msg)
}
func (r *ResultRes) Fail(msg string) {if msg == "" {msg = "操作失败"}r.Code = gcode.CodeNil.Code()r.Message = msgr.Data = nil}func (r *ResultRes) FailNo() {r.Fail("操作失败")
}// 上面是给结构体定义的函数
// 下面是给包提定义的函数
func SuccessAll(data interface{}, msg string) *ResultRes {if msg == "" {msg = "操作成功"}return &ResultRes{gcode.CodeOK.Code(), msg, data}
}func Success(data interface{}) *ResultRes {return SuccessAll(data, "")
}func SuccessNo() *ResultRes {return Success(nil)
}
func SuccessMsg(msg string) *ResultRes {return SuccessAll(nil, msg)
}
func Fail(msg string) *ResultRes {if msg == "" {msg = "操作失败"}return &ResultRes{gcode.CodeNil.Code(), msg, nil}
}func FailNo() *ResultRes {return Fail("操作失败")
}
大家注意了我这个结构体的名称了吧,叫ResultRes ,是因为要符合goframe规范要求,否则无法运行的,就是上面报错信息,ok。
这块定义后就好了,我就拿登陆来给大家演示下:
req封装:
接口:接口返回值注意,要给我们刚才定义的结果集
controller实现:
结果:
这样就完成了。
总结:
1、重写框架自带的包装体中间件,建议重写,后期可能要进行扩展(重写了返回包装体那块,大家可以看看就能明白)
2、创建自定义包装体,注意包装体的名称必须以Res结尾,否则goframe无法运行会报错
3、所有接口都可以用自定义包装体进行返回就可以了
相关文章:

goframe框架规范限制(but it should be named with “Res“ suffix like “XxxRes“)
背景: 首页公司最近要启动一个项目,公司主要业务是用java开发的,但是目前这个方向的项目,公司要求部署在主机上,就是普通的一台电脑上,电脑配置不详,还有经常开关机,所以用java面临…...

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别
面对硬盘、U盘或移动硬盘的格式化决策,NTFS与exFAT作为主流的文件系统,用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT,格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…...

中国桥梁空间分布数据
2020年中国桥梁空间分布数据,共包含102000余条数据。 数据属性表包括:地级市名、区县名、桥梁名称和经纬度。有shp和EXCEl两种格式数据。目前暂没有广西、广东和台湾三个省份数据。...

14-15 为什么我们现在对阅读如此难以接受
写出来感觉很奇怪,但最近我感觉自己失去了阅读能力。长篇文本对我来说尤其具有挑战性。句子很难读完。更别提章节了。章节有很多段落,而段落又由许多句子组成。 啊。 即使在极少数情况下,我读完了一章,下一页上已经有另一章等着…...

经典的卷积神经网络模型 - ResNet
经典的卷积神经网络模型 - ResNet flyfish 2015年,何恺明(Kaiming He)等人在论文《Deep Residual Learning for Image Recognition》中提出了ResNet(Residual Network,残差网络)。在当时,随着…...

【Git 学习笔记】1.3 Git 的三个阶段
1.3 Git 的三个阶段 由于远程代码库后续存在新的提交,因此实操过程中的结果与书中并不完全一致。根据书中 HEAD 指向的 SHA-1:34acc370b4d6ae53f051255680feaefaf7f7850d,可通过以下命令切换到对应版本,并新建一个 newdemo 分支来…...

华为DCN之:SDN和NFV
1. SDN概述 1.1 SDN的起源 SDN(Software Defined Network)即软件定义网络。是由斯坦福大学Clean Slate研究组提出的一种新型网络创新架构。其核心理念通过将网络设备控制平面与数据平面分离,从而实现了网络控制平面的集中控制,为…...

黑马头条-数据管理平台
目录 项目准备 验证码登录 验证码登录-流程 token 的介绍 个人信息设置和 axios 请求拦截器 axios 响应拦截器和身份验证失败 优化-axios 响应结果 发布文章-富文本编辑器 项目准备 技术: • 基于 Bootstrap 搭建网站标签和样式 • 集成 wangEditor 插件…...

API Object设计模式
API测试面临的问题 API测试由于编写简单,以及较高的稳定性,许多公司都以不同工具和框架维护API自动化测试。我们基于seldom框架也积累了几千条自动化用例。 •简单的用例 import seldomclass TestRequest(seldom.TestCase):def test_post_method(self…...
Python 爬虫:多进程,多线程爬虫<提高爬取效率>
关于多进程,多线程的知识,请自行查询资料补充 ~~~~~~~~~~~ 使用多进程: 在python中,使用多进程需要先导包: from threding import Threaddef work(name):for i in range(1000):print(f"我是线程:{n…...

什么是上拉电阻器?上拉和下拉电阻的典型应用
什么是上拉电阻器? 上拉电阻是逻辑电路中使用的电阻,用于确保引脚在所有条件下具有明确定义的逻辑电平。提醒一下,数字逻辑电路有三种逻辑状态:高、低和浮动(或高阻抗)。当引脚未被拉至高或低逻辑电平&…...
centos7安装python3.10
文章目录 1. 安装依赖项2. 下载Python 3.10源码3. 解压源码并进入目录4. 配置安装选项5. 编译并安装Python6. 验证安装7.创建软连接8. 安装pip39. 换源 1. 安装依赖项 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel…...

QT事件处理及实例(鼠标事件、键盘事件、事件过滤)
这篇文章通过鼠标事件、键盘事件和事件过滤的三个实例介绍事件处理的实现。 鼠标事件及实例 鼠标事件包括鼠标的移动、按下、松开、单击和双击等。 创建一个MouseEvent项目,通过项目介绍如何获得和处理鼠标事件。程序效果如下图所示。 界面布局代码如下ÿ…...

职场新人必备待办工具 高效待办工作更省心
作为一名初入职场的菜鸟,我曾被繁琐的工作任务压得喘不过气。每天,邮件、会议、项目任务像潮水般涌来,我常常感到力不从心,生怕遗漏了什么重要事项。那种焦虑,就像站在人来人往的地铁站,却不知道自己该搭乘…...

【创作纪念日】我的CSDN1024创作纪念
机缘 注册CSDN是很长时间了,但是上学时因为专业是电气工程,与编程打交道比较少,一直都是寻求帮助,而非内容输出。直到考研后专业改变,成为了主要跟软件编程、计算机知识相关的研究后,才逐步开启自己的CSDN…...

在AvaotaA1全志T527开发板上使用 UART 连接开发板
连接开发板 AvaotaA1提供两种连接串口输出方式,因为AvaotaA1需要DC 12V/2A/5.5-2.1电源适配器才可以启动系统,请先确保电源已接通。 方式一: 使用配套的 TyepC-SUB 转接板 40Gbps雷电线标准TypeC数据线,就可以同步实现 USB 串口…...
【Asterinas】Asterinas 进程启动与切换
Asterinas 进程启动与切换 进程启动 进程创建: Rust pub fn spawn_user_process( executable_path: &str, argv: Vec, envp: Vec, ) -> Result<Arc> { // spawn user process should give an absolute path debug_assert!(executable_path.starts_with…...

CVE-2024-6387 分析
文章目录 1. 漏洞成因2. 漏洞利用前置知识2.1 相关 SSH 协议报文格式2.2 Glibc 内存分配相关规则 3. POC3.1 堆内存布局3.2 服务端解析数据时间测量3.3 条件竞争3.4 FSOP 4. 相关挑战 原文链接:个人博客 近几天,OpenSSH爆出了一个非常严重的安全漏洞&am…...

STM32 ADC精度提升方法
STM32 ADC精度提升方法 Fang XS.1452512966qq.com如果有错误,希望被指出,学习技术的路难免会磕磕绊绊量的积累引起质的变化 硬件方法 优化布局布线,尽量减小其他干扰增加电源、Vref去耦电容使用低通滤波器,或加磁珠使用DCDC时尽…...

Redis为什么设计多个数据库
关于Redis的知识前面已经介绍过很多了,但有个点没有讲,那就是一个Redis的实例并不是只有一个数据库,一般情况下,默认是Databases 0。 一 内部结构 设计如下: Redis 的源码中定义了 redisDb 结构体来表示单个数据库。这个结构有若干重要字段,比如: dict:该字段存储了…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

WinUI3开发_使用mica效果
简介 Mica(云母)是Windows10/11上的一种现代化效果,是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果,Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...
scan_mode设计原则
scan_mode设计原则 在进行mtp controller设计时,基本功能设计完成后,需要设计scan_mode设计。 1、在进行scan_mode设计时,需要保证mtp处于standby模式,不会有擦写、编程动作。 2、只需要固定mtp datasheet说明的接口即可…...
创客匠人:如何通过创始人IP打造实现知识变现与IP变现的长效增长?
在流量红利逐渐消退的当下,创始人IP的价值愈发凸显。它不仅能够帮助中小企业及个人创业者突破竞争壁垒,还能成为企业品牌影响力的核心资产。然而,市场上IP孵化机构鱼龙混杂,如何选择一家真正具备长期价值的合作伙伴?创…...

MySQL技术内幕1:内容介绍+MySQL编译使用介绍
文章目录 1.整体内容介绍2.下载编译流程2.1 安装编译工具和依赖库2.2 下载编译 3.配置MySQL3.1 数据库初始化3.2 编辑配置文件3.3 启动停止MySQL3.4 登录并修改密码 1.整体内容介绍 MySQL技术系列文章将从MySQL下载编译,使用到MySQL各组件使用原理源码分析…...