使用GO--Swagger生成文档

概述 

在前后端分离的项目中,后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包,用于处理Swagger 2.0(即OpenAPI 2.0)规范。它提供了丰富的工具集,帮助开发者在Go环境中解析、生成、验证和操作API描述文件。(OpenAPI 2.0 :用于生成、描述、调用和可视化RESTful Web服务。它允许你使用YAML或JSON格式定义API接口,包括路径、参数、请求方法、响应类型等信息。)

特点

  • 定制化支持: 具备强大的自定义能力,通过供应商扩展和可自定义模板,满足不同需求

  • 代码生成: 专注于产出语义正确、运行高效的Go代码,兼容golint, go vet等工具。

基本使用

安装

go install github.com/swaggo/swag/cmd/swag@latest

安装后,通过:swag -v  测试是否安装成功

 使用步骤

以gin框架为例:

1. 需要用到gin-swagger库:

go get -u github.com/swaggo/gin-swagger //gin-swagger中间件
go get -u github.com/swaggo/files //swagger嵌入文件

gin-swagger使用步骤:

  • 按照swagger要求给接口代码添加声明式注释,具体参照声明式注释格式。
  • 使用swag工具扫描代码自动生成API接口文档数据
  • 使用gin-swagger渲染在线接口文档页面

 2. 添加注释

项目添加注释:(在main函数下添加下面的注释)

// @可以修改的swagger文档的标题

// @version 版本

// @description  这里是swagger中整个项目的描述

// @termsOfService https://www.swagger.io/terms/

// @contact.name  维护者名字

// @contact.url 维护者联系网址

// @contact.email 维护者邮件

// @license.name Apache 2.0

// @license.url http://www.apache.org/licenses/LICENSE-2.0.html

// @host 127.0.0.1:8080

// @BasePath /api/v1

title:文档标题
version:版本
description,termsOfService,contact.name contact.url,contact.email都是一些声明,可不写。
license:是必须的
host,BasePath:如果你想直接swagger调试API,这两项需要填写正确。前者为服务文档的端口,ip。后者为基础路径,像我们这里就是"/api/v1"。
在原文档中还有securityDefinitions.basic , securityDefinitions.apikey等,这些都是
用来做认证的。其他的可以看官方文档

函数接口添加注释:(在代码中处理请求的接口函数(通常位于controller层),按如下方式注释。)

// @Summary 测试ping

    // @Description ping

    // @Tags 测试

    // @Accept json

    // @Success 200 {string} string "{"msg": "pong"}"

    // @Failure 400 {string} string "{"msg": "nonono"}"

    // @Router /ping [get]

 3. 下面直接使用命令,初始化我们的swagger文档:

swag init 

生成 docs文档:文档结构如下:

docs

        docs.go

        swagger.json

        swagger.yaml

注意:我们初始化的时候,一定是当前目录中有main.go的文件 ,不是有main函数的文件

4. 导入刚才的docs包(注意是匿名导入)

下面是所有方法的基本示例:

package mainimport ("github.com/gin-gonic/gin"swaggerFiles "github.com/swaggo/files"ginSwagger "github.com/swaggo/gin-swagger"_ "component/swagger/docs")// @可以修改的swagger文档的标题
// @version 版本(默认1.0)
// @description  这里是swagger中整个项目的描述
// @termsOfService https://www.swagger.io/terms/// @contact.name  维护者名字
// @contact.url http://www.swagger.io/support
// @contact.email 维护者邮件// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html// @host 127.0.0.1:8080
// @BasePath /api/v1
func main() {r := gin.Default()//在代码中处理请求的接口函数(通常位于controller层),按如下方式注释。//注册swagger api相关路由r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))// 设置路由组/api/v1g := r.Group("/api/v1"){g.GET("/ping",PingHandler)g.POST("/login",LoginHandler)}r.Run("127.0.0.1:8080")
}// 模型(model)
type User struct{Username string    `json:"username" example:"张三"`Password string    `json:"password" example:"123456"`
}// 响应参数模型(model)
type ResponseParam struct {Code int `json:"code"`Message string `json:"message"`Data *User  `json:"data"` 
}// 接收参数模型(model)
type RequestParam struct {Username string    `json:"username" example:"李四"`Password string    `json:"password" example:"123456"`
}// 接收参数模型2(model)
type RequestParam2 struct {Username string    `json:"username" example:"李四"`Password string    `json:"password" example:"123456"`UpdateUsername string `json:"updateusername" example:"张三"`UpdatePassword string `json:"updatepassword" example:"789100"`
}// @Summary 测试ping// @Description ping// @Tags 测试1// @Accept application/json// @Success 200 {string} string "{"msg": "pong"}"// @Failure 400 {string} string "{"msg": "nonono"}"// @Router /ping [get]
func PingHandler(ctx *gin.Context){ctx.JSON(200,gin.H{"code": 1000,"msg": "pong",})
}// @Summary 测试login// @Description login// @Tags 测试2// @Accept application/json// @Produce application/json// @Param Object body RequestParam true "用户信息"// @Success 200 {object} ResponseParam// @Failure 400 {string} string "{"msg": "failed"}"// @Router /login [post]
func LoginHandler(c *gin.Context){user := new(User)err := c.ShouldBindJSON(user)if err != nil{c.JSON(200,gin.H{"code": 5000,"msg": user,})}c.JSON(200,gin.H{"code": 2000,"msg": user,})
}// @Summary 删除用户// @Description deleteuser// @Tags 测试3// @Accept application/json// @Produce application/json// @Param id path int true "用户id"// Success 200 {string} string "{"msg": "该id="{{id}}"用户已经被注销"}"// Failure 400 {string} string "{"msg": "该id不存在"}"// @Router /user [delete]
func DeleteUser(c *gin.Context){// 传来待删除用户的id(路径参数)id := c.Param("id")ok := (id == "1")if ok {c.JSON(200,gin.H{"code": 5000,"msg": ("该id="+id+"用户不存在"),})}c.JSON(200,gin.H{"code": 2000,"msg": ("该id="+id+"用户已经被注销"),})}//@Summary 更新用户信息// @Description update// @Tags 测试4// @Accept application/json// @Produce application/json// @Param Object body RequestParam2 true "用户更新后信息"// @Success 200 {object} ResponseParam// @Failure 400 {string} string "{"msg": "failed"}"// @Router /update [put]
func UpdateUser(c *gin.Context){}

注意:在每次更新接口和注释信息后,要重新进行swag init初始化文档

服务启动后,访问:(每个人的端口可能不一样,我这里是8080)Swagger UIicon-default.png?t=O83Ahttp://127.0.0.1:8080/swagger/index.html#/

 在文档中还可以直接进行调试,进行接收请求和响应。

在编写声明式注释时,需要知道以下东西

  1. 常见的声明式注释格式及选项(以 Swagger 为例)

    • @Summary
      • 格式@Summary <简短描述>
      • 用途:用于提供一个简洁的、对 API 接口功能的总结性描述。这个描述应该能够让使用者快速了解接口主要是做什么的。例如,@Summary 获取用户信息 或者 @Summary 删除指定订单
    • @Description
      • 格式@Description <详细描述>
      • 用途:提供比 @Summary 更详细的关于接口的信息,包括接口的业务逻辑、操作细节、特殊情况等内容。比如,@Description 根据用户ID从数据库中查询用户的详细信息,包括姓名、年龄、联系方式等
    • @Tags
      • 格式@Tags <标签列表>,其中标签列表可以是一个或多个用逗号隔开的标签。
      • 用途:用于对接口进行分类,方便在 API 文档中通过标签来组织和查找接口。例如,@Tags 用户管理,权限管理,这样可以将与用户管理相关的接口和权限管理相关的接口通过不同的标签区分开来,便于文档管理和查看。
    • @Accept
      • 格式@Accept <媒体类型列表>,媒体类型之间可以用逗号隔开。
      • 用途:指定接口能够接受的请求内容类型。如 @Accept application/json,text/plain,表明该接口可以接受 JSON 格式和纯文本格式的请求内容。
    • @Produce
      • 格式@Produce <媒体类型列表>
      • 用途:用于说明接口会产生(返回)的内容类型。例如,@Produce application/json,意味着这个接口返回的数据格式是 JSON。
    • @Param
      • 格式@Param <参数名> <参数位置> <参数类型> <是否必填> <参数描述>
      • 参数位置常见类型
        • path:表示参数是在路径中传递的,如 /users/{user_id} 中的 user_id
        • query:参数是在查询字符串中,例如 /products?category=electronics 中的 category
        • body:参数在请求体中,一般用于传递较为复杂的数据结构,像创建用户时,用户信息以 JSON 等格式放在请求体中。
      • 用途:用于详细描述接口接受的参数,包括参数的名称、位置、类型、是否必填以及参数的具体含义等信息。例如,@Param user_id path int true "用户ID,用于唯一标识用户"
    • @Success
      • 格式@Success <状态码> <返回类型> <返回描述>
      • 用途:描述接口成功响应时的情况,包括返回的状态码、数据类型以及返回内容的简单描述。例如,@Success 200 {object} UserInfo "成功返回用户的详细信息",这里表示接口成功时返回状态码为 200,数据类型是一个对象({object},具体类型可能是自定义的结构体等,这里假设是 UserInfo),并且说明了返回的是用户详细信息。
    • @Failure
      • 格式@Failure <状态码> <返回类型> <返回描述>
      • 用途:和 @Success 相对应,用于描述接口失败时的情况,包括可能出现的错误状态码、返回的数据类型(如果有返回内容的话)以及错误内容的简单描述。例如,@Failure 404 {string} "用户不存在",说明当出现 404 状态码时,返回的数据类型可能是一个字符串,并且内容是提示用户不存在。
    • @Router
      • 格式@Router <路径> [<方法>]
      • 用途:用于指定接口对应的路由路径和请求方法。例如,@Router /users/{user_id} [GET],表明这个接口对应的路径是 /users/{user_id},请求方法是 GET,用于获取特定用户的信息。

 然后,需要注意的是:为什么你的swagger中,有些函数可以出现,有些没有出现

一定要注意参数格式!

一定要注意参数格式!

一定要注意参数格式!

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

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

相关文章

pushgateway HA高可用方案

未经本人同意不得转载&#xff0c;若引用请附上原文链接。 项目使用flink来处理kafka中的无界流数据&#xff0c;采用的是flink on yarn的模式部署flink任务。最近做flink任务的监控过程中&#xff0c;踩了一些坑。下面是过程&#xff0c;只想看最终方案的直接拉到最后。 先说…

01-Chromedriver下载与配置(mac)

下载地址&#xff1a; 这里我用的最后一个&#xff0c;根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址&#xff1a;https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址&#xff1a;https://googlechromelabs.git…

使用docker-compose安装Milvus向量数据库及Attu可视化连接工具

首先确保系统已经安装上了docker 然后去https://github.com/docker/compose/releases/下载安装docker-compose 跟随自己下系统和服务器情况下载 上传到服务器 mv docker-compose-linux-aarch64 docker-compose chmod x docker-compose2.dockr-compose命令 docker-compose …

Conda + JuiceFS :增强 AI 开发环境共享能力

Conda 是当前 AI 应用开发领域中非常流行的环境和包管理系统&#xff0c;因其能够简单便捷地创建与系统资源相隔离的虚拟环境广受欢迎。 Conda 支持在不同的操作系统上重建相同的工作环境&#xff0c;但在环境共享复用方面仍存在一些挑战。比如&#xff0c;在不同机器上复用相…

【SpringBoot】31 Session + Redis 实战

Gitee https://gitee.com/Lin_DH/system 介绍 【SpringBoot】30 Cookie、Session、Token https://blog.csdn.net/weixin_44088274/article/details/144241595 背景 Spring Session 是 Spring 的一个子项目&#xff0c;它提供了一种管理用户会话信息的方法&#xff0c;无论…

关于网站的权重和百度蜘蛛爬虫的关系

网站的权重和百度蜘蛛爬虫的关系是密切关联的。 网站权重是一个衡量网站在搜索引擎中重要性的概念&#xff0c;它反映了网站在搜索引擎算法中的相对重要程度。而百度蜘蛛爬虫则是百度搜索引擎用来抓取网页内容的工具&#xff0c;通过分析网页的URL、内容、链接等因素来评估网站…

游戏引擎学习第35天

开场介绍 今天的任务是继续改进一个虚拟的瓦片地图系统&#xff0c;使其适合处理更大的世界。我们希望这个系统能管理大范围的游戏世界&#xff0c;其中包含按需存储的小区域。昨天&#xff0c;我们介绍了“内存区域”的概念&#xff0c;用于管理持久性存储。我们计划今天继续…

Leetcode经典题5--轮转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 输入输出示例 &#xff1a; 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右…

【JS】简单CSS简单JS写的上传进度条

纯JS写的&#xff0c;简单的上传进度条&#xff0c;当上传的文件较大&#xff0c;加一个动态画面&#xff0c;就不会让人觉得出错了或网络卡了 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别

2023 年“泰迪杯”数据分析技能赛B 题企业财务数据分析与造假识别 一、背景 财务数据是指企业经营活动和财务结果的数据记录&#xff0c;反映了企业的财务状况与经营成果。对行业、企业的财务数据进行分析&#xff0c;就是要评价其过去的经营业绩、衡量现在的财务状况、预测未…

perl Window安装教程

perl Window安装教程 下载地址 https://platform.activestate.com/tangxing806/ActivePerl-5.28/distributions 运行state-remote-installer.exe 按下图截图步骤 检查perl版本 参考文献&#xff1a; perl安装教程

知识图谱9:知识图谱的展示

1、知识图谱的展示有很多工具 Neo4j Browser - - - - 浏览器版本 Neo4j Desktop - - - - 桌面版本 graphX - - - - 可以集成到Neo4j Desktop Neo4j 提供的 Neo4j Bloom 是用户友好的可视化工具&#xff0c;适合非技术用户直观地浏览图数据。Cypher 是其核心查询语言&#x…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据&#xff0c;原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

HBU深度学习实验15-循环神经网络(2)

LSTM的记忆能力实验 飞桨AI Studio星河社区-人工智能学习与实训社区 (baidu.com) 长短期记忆网络&#xff08;Long Short-Term Memory Network&#xff0c;LSTM&#xff09;是一种可以有效缓解长程依赖问题的循环神经网络&#xff0e;LSTM 的特点是引入了一个新的内部状态&am…

使用windows的包管理工具chocolatey

开发人员&#xff0c;在windows环境下&#xff0c;最头疼的是安装和配置各种环境变量&#xff0c;现在chocolatey 可以一键安装&#xff0c;不需要再去配置环境变量了。比如你安装一个java的环境&#xff0c;仅仅需要你敲几个命令&#xff0c;都能帮你搞定。 我自己已经使用这…

VTK知识学习(21)- 数据的读写

1、前言 对于应用程序而言&#xff0c;都需要处理特定的数据&#xff0c;VTK应用程序也不例外。 VTK应用程序所需的数据可以通过两种途径获取: 第一种是生成模型&#xff0c;然后处理这些模型数据(如由类 vtkCylinderSource 生成的多边形数据); 第二种是从外部存储介质里导…

QT 中 QString 转换为 Unicode 和 ASCII 的方法

目录 ​编辑 前言 一、QString转换成 Unicode编码 二、QString转换成ASCII编码 三、Unicode编码转换成QString汉字 四、ASCII编码转成QString 五、注意事项 六、总结 前言 在 Qt 开发中&#xff0c;经常会遇到需要将QString中的字符转换为特定编码格式的需求。本文将介…

基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0095 1. 主要功能&#xff1a; 基于51单片机的病床呼叫系统proteus仿…

【OpenDRIVE_Python】使用python脚本更新OpenDRIVE数据中路口Junction名称

示例代码说明&#xff1a; 遍历OpenDRIVE数据中每个路口JunctionID,读取需要变更的路口ID和路口名称的TXT文件,若JunctionID与TXT文件中的ID一致&#xff0c;则将TXT对应的点位名称更新到OpenDRIVE数据中Junction name字段。补充&#xff1a;需要保持TXT和OpenDRIVE数据文件编…

java+ssm+mysql商品管理系统

项目介绍&#xff1a; 使用javassmmysql开发的商品库存管理系统&#xff0c;系统包含管理员&#xff0c;员工角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;员工管理&#xff1b;供应商管理&#xff1b;客户管理&#xff1b;商品管理&#xff1b;商品进货&#xf…