goframe框架规范限制(but it should be named with “Res“ suffix like “XxxRes“)

news2024/10/6 5:56:52

背景:

首页公司最近要启动一个项目,公司主要业务是用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  string
		err  = 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.CodeNotFound
			case http.StatusForbidden:
				code = gcode.CodeNotAuthorized
			default:
				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 = msg
	r.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 = msg
	r.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、所有接口都可以用自定义包装体进行返回就可以了

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

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

相关文章

Python实现万花筒效果:创造炫目的动态图案

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义绘制万花筒图案的函数主循环 完整代码 引言 万花筒效果通过反射和旋转图案创造出美丽的对称图案。在这篇博客中,我们将使用Python来实现一个动态的万花筒效果。通过利用Pygame库&#xf…

WebStorm配置路径别名(jsconfig.json)

项目是 ViteVueTs 新建一个 jsconfig.json文件 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dist"] }然后在 vite.confi…

LLM-Transformer:经典与前沿方法详解

LLM-Transformer:经典与前沿方法详解 前言 大规模语言模型(LLM)是当前自然语言处理(NLP)领域的核心技术,而Transformer架构作为LLM的基础,极大地推动了这一领域的发展。本文将详细介绍LLM-Tra…

网页计算器的实现

简介 该项目实现了一个功能完备、交互友好的网页计算器应用。只使用了 HTML、CSS 和 JavaScript ,用于检验web前端基础水平。 开发环境:Visual Studio Code开发工具:HTML5、CSS3、JavaScript实现效果 功能设计和模块划分 显示模块&#…

ASP.NETMVC-简单例子-数据库查询+razor使用+项目发布

环境: win10,SQL Server 2008 R2 参考: asp.net mvc框架之EF的使用 - black娃 - 博客园 https://www.cnblogs.com/fjiqiang/p/11131365.html 目录 数据库查询要求思路操作 razor使用项目发布要求实现 数据库查询 要求 从服务器的数据库中查…

独家专访|格行随身WiFi创始人——刘永先 格行随身wifi如何成为行业的领跑品牌?

随着移动互联网的普及和消费者对网络依赖性的增强,随身WiFi市场迎来了前所未有的发展机遇。然而,这一市场的迅速扩张也伴随着一系列问题,其中最为显著的就是市场乱象丛生。近日,有幸邀请到行业领跑品牌格行随身WiFi的刘总&#xf…

uboot 编译时传递参数实现条件编译

KCFLAGS make ARCHarm KCFLAGS-DENV_DEBUG CROSS_COMPILEaarch64-linux-gnu-env/sf.c env_sf_save 加入调试信息 # saveenv Saving Environment to SPI Flash... env_sf_save (1) spi_flash_erase (2) spi_flash_write is40000 Erasing SPI flash...Writing to SPI flash.…

JavaScript高级程序设计(第四版)--学习记录之对象、类和面向对象编程(中)

创建对象方式 工厂模式:用于抽象创建特定对象的过程。可以解决创建多个类似对象的问题,但没有解决对象标识问题。(即新创建的对象是什么类型) function createPerson(name, age, job) { let o new Object(); o.name name; o.age…

DSSAT作物模建模实践方法

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。Decisi…

msvcp140_ATOMIC_WAIT.dll丢失的多种解决方法分享,实测有效

在日常使用电脑的过程中,我们可能会遇到一些错误提示,其中之一就是“msvcp140_ATOMIC_WAIT.dll丢失”。那么,msvcp140_ATOMIC_WAIT.dll丢失是怎么回事呢?本文将从msvcp140_ATOMIC_WAIT.dll丢失的原因分析、对电脑的影响以及解决方…

linux 环境报错:Peer reports incompatible or unsupported protocol version

出现问题的原因: curl 不兼容或不支持的协议版本。 解决方案: yum update -y nss curl libcurl如此继续之前的操作即可。

【瞎折腾日常】服务器的cpu飙高到1000%了怎么破

一、故障起因 起因是用户反馈系统很卡,我登录普罗米修斯一看,发现docker部署得集群下的一个java应用服务器cpu爆了,直接冲到了1000%以上了,接着就是各种接口超时报警等,赶紧打开对应的服务器查看进程情况,这会使用jstack和top命令定位哪个线程占用的cpu比较大,定位代码问…

Python+Pytest+Allure+Yaml+Pymysql+Jenkins+GitLab接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人:CesareCheung 更新时间:2024.06.20 一、技术栈 PythonPytestAllureYamlJenkinsGitLab 版本要求:Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 安装python3.7&…

BMA530 运动传感器

型号简介 BMA530是博世(bosch-sensortec)的一款运动传感器。时尚简约的可穿戴设备为功能强大的组件提供了很小的空间。具有先进功能集的下一代加速度计是世界上最小的加速度传感器(1.2 x 0.8 x 0.55 mm)。它专为紧凑型设备而设计&…

突发!Runway的Gen-3向所有人开放,媲美Sora!

7月2日凌晨,著名生成式AI平台Runway在官网宣布,其文生视频模型Gen-3 Alpha向所有用户开放使用。 上周日Runway只向部分用户提供了Gen-3的使用权限,「AIGC开放社区」也为大家解读了10个非常有代表性的视频案例。(点击查看&#xf…

UE4_材质_使用彩色半透明阴影

学习笔记,不喜勿喷!侵权立删,祝愿大美临沂生活越来越好! 本教程将介绍如何配置虚幻引擎来投射彩色半透明阴影。 此功能在许多应用中都很有用,常见例子就是透过彩色玻璃窗的彩色光。 一、半透明阴影颜色 阴影在穿过半…

2024.7.2作业

1. 梳理笔记(原创&#xff01;&#xff01;&#xff01;) 2.解析代码&#xff1a;分析每一步变量的取值 #include <stdio.h> int main(int argc, char *argv[]) { int a 10; //a10 int b a--; //b10 int c a b 2; //a9 b10 c21 int d (b--…

Python语言接入关键词搜索商品api疑点解析

接入关键词搜索商品API通常需要以下步骤&#xff1a; 了解API文档&#xff1a;首先&#xff0c;你需要阅读API的文档&#xff0c;了解API的基本功能、请求方式&#xff08;GET、POST等&#xff09;、请求参数、返回数据格式等信息。 安装必要的库&#xff1a;根据API的要求&am…

RS232、RS485与RS422初步学习

目录 电平 传输方式 共模和差模干扰 ps&#xff1a;双绞线 485总线结构 ps&#xff1a;终端电阻 RS232接口&#xff08;DB9&#xff09; 优缺点 RS232优缺点 RS485较RS232的优点 为什么RS232还在使用&#xff1f; 电平 RS232、RS485与RS422的电平 区间逻辑备注RS232…

vue3中获取Excel和csv文件中的内容

1.效果 2.安装 npm install xlsxyarn add xlsx 3.引入使用 <el-upload ref"uploadRef" :on-change"changeFile" :show-file-list"false" class"mr10" accept".csv, .xlsx, .xls"action"#" :auto-upload&quo…