首页 > 其他分享 >go-zero使用自定义模板实现统一格式的 body 响应

go-zero使用自定义模板实现统一格式的 body 响应

时间:2025-01-10 11:32:24浏览次数:3  
标签:body http 自定义 err resp zero go 模板

前提

go环境的配置、goctl的安装、go-zero的基本使用默认都会

需求

go-zero框架中,默认使用goctl命令生成的代码并没有统一响应格式,现在使用自定义模板的方式实现统一响应格式:

{
  "code": 0,
  "msg": "OK",
  "data": {}
}

步骤

1、下载模板

goctl template init

下载完成后会有提示edit on your risk,默认下载路径会在C盘
在这里插入图片描述
在这里插入图片描述

2、移动模板

将下载好的模板文件拷贝到项目目录中,以便后续操作,移动后的项目结构如下:
在这里插入图片描述

3、创建统一响应结构体

创建utils包、再创建统一响应结构体reponse.go
在这里插入图片描述

package utils

import (
	"net/http"

	"github.com/zeromicro/go-zero/rest/httpx"
)

type Body struct {
	Code int         `json:"code"`
	Msg  string      `json:"msg"`
	Data interface{} `json:"data,omitempty"`
}

func Response(w http.ResponseWriter, resp interface{}, err error) {
	var body Body
	if err != nil {
		body.Code = -1
		body.Msg = err.Error()
	} else {
		body.Msg = "OK"
		body.Data = resp
	}
	httpx.OkJson(w, body)
}

4、修改handler模板

将刚刚通过goctl template下载的模板中的handler.tpl替换成如下内容:
在这里插入图片描述

package {{.PkgName}}

import (
	"net/http"
    "gozero_gorm/utils"
	"github.com/zeromicro/go-zero/rest/httpx"
	{{.ImportPackages}}
)

func {{.HandlerName}}(svcCtx *svc.ServiceContext) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        {{if .HasRequest}}var req types.{{.RequestType}}
        if err := httpx.Parse(r, &req); err != nil {
            httpx.Error(w, err)
            return
        }{{end}}

        l := {{.LogicName}}.New{{.LogicType}}(r.Context(), svcCtx)
        {{if .HasResp}}resp, {{end}}err := l.{{.Call}}({{if .HasRequest}}&req{{end}})
        {{if .HasResp}}utils.Response(w, resp, err){{else}}response.Response(w, nil, err){{end}} // 换成自己的结构体路径

    }
}

如果你定义的统一相应结构体在其他路径下,只需修改最后一行代码即可

{{if .HasResp}}utils.Response(w, resp, err){{else}}response.Response(w, nil, err){{end}} // 换成自己的结构体路径

5、生成代码

goctl api go --api .\index.api --dir . --home ..\template\

相比普通的api生成该命令指定了使用的模板,也就是 --home ..\template\这一项,由于模板中的handler.tpl已经被修改,所以生成后的代码会返回统一的响应格式

测试

在这里插入图片描述
可以看到响应结果已经成功格式化

标签:body,http,自定义,err,resp,zero,go,模板
From: https://blog.csdn.net/qq_39354140/article/details/145047820

相关文章

  • Python Matplotlib 教程- Matplotlib 如何自定义样式
    PythonMatplotlib样式和自定义Matplotlib是一个强大的Python数据可视化库,提供丰富的绘图功能。在实际使用中,熟悉其样式和自定义技巧可以让你的图表更加专业和美观。本文将简要介绍Matplotlib样式和一些常用的自定义方法。1.设置全局样式Matplotlib提供了一些预设的样......
  • 拖动上传组件内部自定义组件,保留拖动上传
    遇到拖动上传组件内部自定义组件,保留拖动上传,其他上传方式取消(点击上传,有焦点回车上传)保留内容自定义组件1.这里举例vue2+antdesignvue1.x(上传组件)+elementui2.12.0(内部组件输入框)保留拖动上传,可支持输入。<a-upload-draggername="file":multiple="false"accept="imag......
  • 【JAVA编程】通过自定义注解与AOP防止接口重复提交实战
    引言在Web应用开发中,特别是在处理表单提交或API调用时,可能会遇到用户因网络延迟、按钮多次点击等原因导致的重复提交问题。为了解决这一问题,通常的做法是在前端禁用提交按钮,或者在后端使用唯一令牌(Token)机制来确保请求的唯一性。然而,这些方法往往需要针对每个可能的重复提交场景......
  • 全面解析 Keycloak 自定义主题:打造品牌化 OAuth 登录页面的终极指南
    言简意赅的讲解Keycloak主题解决的痛点之前给大家讲解了Keycloak一键登录后大家也解决了SSO登录的问题。这时候大家觉得Keycloak登录页太丑了,所以本篇文章讲讲如何让登录页好看。1.1提升品牌一致性在大型项目或企业环境中,登录页面是对外最直观的形象展现。Keycloak虽......
  • .NET 隐藏/显示、自定义windows系统光标
    本文介绍如何操作windows系统光标。正常我们设置/隐藏光标,只能改变当前窗体或者控件范围,无法全局操作windows光标。接到一个需求,想隐藏windows全局的鼠标光标显示,下面讲下如何操作 先了解下系统鼠标光标,在鼠标属性-自定义列表中可以看到一共有13种类型,对应13种工作状态:操作系......
  • Vue.js 自定义指令
    除了默认设置的核心指令(v-model和v-show),Vue也允许注册自定义指令。下面我们注册一个全局指令v-focus,该指令的功能是在页面加载时,元素获得焦点:<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>Vue测试实例</title><scriptsrc="https://cdn.stati......
  • 【源码】ByteToMessageDecoder对比自定义实现
    前言在上一篇随笔中,我们探讨了如何实现一套自定义通信协议,其中涉及到的粘包和拆包处理最初是完全自定义实现的,后来则改为了继承ByteToMessageDecoder来简化处理。本篇将重点讨论这两种实现方式在缓存管理上的主要区别,并深入分析其中的不同之处以及值得借鉴的经验和技巧。代码......
  • 使用自定义注解与反射实现多sheet表、多表头复杂Excel表解析,实现导入功能
    使用自定义注解与反射实现多sheet表、多表头复杂Excel解析一、分析Excel表多sheet表表头分析(以原料水检测表为例)表头特点:表头占用1-3行A、B列为日期、时间第2行一级表头为不同类别的废水第3行二级表表头为各类别废水中各个化学元素的浓度,特点是每个类别下的化学......
  • Effective C++读书笔记——item12(自定义拷贝构造函数和拷贝赋值运算符可能出现的问题
    1.拷贝函数相关背景及编译器行为在面向对象系统中,拷贝构造函数和拷贝赋值运算符统称为拷贝函数,若不自行声明,编译器会按需生成默认的拷贝函数,其会拷贝被拷贝对象的全部数据。但当自行声明拷贝函数后,编译器若发现实现存在错误,往往不会主动提示,比如在新增数据成员却未更新拷贝函......
  • 【Rust自学】11.3. 自定义错误信息
    喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)11.3.1.添加错误信息在11.2.断言(Assert)中我们学习了assert!、assert_eq!和assert_ne!这三个宏,而这篇文章讲的就是它的进阶用法。这三个宏是可以添加自定义错......