当前位置: 首页 > news >正文

使用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中,有些函数可以出现,有些没有出现

一定要注意参数格式!

一定要注意参数格式!

一定要注意参数格式!

相关文章:

使用GO--Swagger生成文档

概述 在前后端分离的项目中&#xff0c;后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包&#xff0c;用于处理Swagger 2.0&#xff08;即OpenAPI 2.0&#xff09;规范。它提供了丰富的工具集&#x…...

Pac4j 学习笔记

随着互联网技术的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;企业信息安全与身份认证系统变得越来越重要&#xff0c;而且安全认证集成方案作为保障网络安全的重要一环&#xff0c;其研究与应用也至关重要。在这种背景下&#xff0c;Pac4j 作为一种流行的身份验证库…...

什么?RayLink远程控制软件支持企业IT应用!

在当今企业IT管理中&#xff0c;远程控制工具扮演着不可或缺的角色。设想一下&#xff0c;你的团队成员分散在全球各地&#xff0c;或者员工正在远程工作&#xff0c;这时电脑突然出现问题。如果IT支持团队能够利用远程控制软件&#xff0c;比如RayLink&#xff0c;迅速远程接入…...

LeetCode Hot100 51~60

图论51. 岛屿问题52. 腐烂的橘子53. 课程表54. 前缀树55. 全排列56. 子集57. 电话号码58. 组合总和59. 括号生成60. 单词搜索 图论 51. 岛屿问题 经典洪水问题算法 class Solution { public:int numIslands(vector<vector<char>>& grid) {int nr grid.size…...

docker 启动 redis 同时设置密码,关机后会自动重启

以下是使用Docker启动Redis并设置密码&#xff0c;并配置容器自动重启的命令&#xff1a; docker run -d \--name redis \--restartalways \-p 6379:6379 \redis:latest \redis-server --requirepass "your_strong_password"详细解释&#xff1a; docker run -d&am…...

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1.模型训练 训练流程&#xff1a;train.py中的training函数 这段代码实现了一个 3D 高斯模型的训练循环&#xff0c;旨在通过逐步优化模型参数&#xff0c;使其能够精确地渲染特定场景。以下是代码的详细解析&#xff1a; def training(dataset, opt, pipe, testing_iteratio…...

docker部署RustDesk自建服务器

客户端&#xff1a; Releases rustdesk/rustdesk GitHub 服务端&#xff1a; 项目官方地址&#xff1a;GitHub - rustdesk/rustdesk-server: RustDesk Server Program 1、拉取RustDesk库 docker pull rustdesk/rustdesk-server:latest 阿里云库&#xff1a; docker pu…...

工作实战总结与实现-mybatis-plus更新策略部分字段不更新问题

文章目录 案例场景存在问题解决方案一解决方案二继续延伸 案例场景 很简单的工作场景&#xff0c;需要将数据库某个表的字段设置为null或者空字符串&#xff0c;使用mybatis-plus的update语句&#xff0c;如下&#xff1a; order.setPassCode(null);reservationOrderManger.up…...

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…...

Midjourney Describe API 的对接和使用

Midjourney Describe API 的对接和使用 Midjourney Describe API 的主要功能是通过上传图片&#xff0c;获取对图片的描述。使用该 API&#xff0c;只需要传递图片文件地址&#xff0c;API 会返回图片的详细描述。无需繁琐的参数设置&#xff0c;即可获得高质量的图片描述。 …...

《单片机原理及接口技术》(C51编程)(第三版)------张毅刚主编

1.整体框架&#xff1a;1-22题&#xff08;17-20为编程题分别源自数中的P98,P162,P177页&#xff09; 2.简答题部分&#xff1a; 3.计算题...

Qt入门9——绘图

基本概念 虽然Qt已经内置了很多的控件,但是不能保证现有控件就可以应对所有场景. 很多时候我们需要更强的"DIY"能力&#xff1b; Qt 提供了画图相关的API,可以允许我们在窗口上绘制任意的图形形状,来完成更复杂的界面设计。 绘图api核心类&#xff1a; 类说明QPaint…...

FreeRTOS之ARM CR5栈结构操作示意图

FreeRTOS之ARM CR5栈结构操作示意图 1 FreeRTOS源码下载地址2 ARM CR5栈结构操作宏和接口2.1 portSAVE_CONTEXT宏2.1.1 portSAVE_CONTEXT源码2.1.2 portSAVE_CONTEXT宏操作栈结构变化示意图 2.2 portRESTORE_CONTEXT宏2.2.1 portRESTORE_CONTEXT源码2.2.2 portRESTORE_CONTEXT宏…...

Java线程的interrupt中断、wait-notify/all(源码级分析)

实例方法&#xff1a; interrupt()方法是设置结束阻塞(sleep、)&#xff0c;并且设置中断标记true isInterrupted()判断当前是否中断 静态方法&#xff1a; Thread.interrupted():调用这个方法的线程中断标记位还原为false 那么好&#xff0c;既然上面的方法作用是清晰的&…...

计网408考点讲解

IPv4...

当linux可执行文件缺少或者不兼容so库时候,如何查看版本以及缺少那些库

解决方法&#xff1a; ldd 命令来验证程序是否加载了正确的库&#xff1a; 如检查linear_elasticity可执行文件缺少的库&#xff0c;用下面命令&#xff1a; ldd linear_elasticity 可以发现下面not found就是缺少的库&#xff0c;还有对应的库的位置已经版本 $ ldd lin…...

文件下载的几种方式

1、使用window.open方法 url: 可以为文件存放的地址 function downloadFile(url) {window.open(url); }2、使用<a>标签进行文件下载 <a href"/多因素登录说明文档.pdf" class"link-text">说明文档</a> 3、使用fetch和Blob对象 这种…...

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...

访问http网页强制跳转到了https的解决办法

目录 解决浏览器自动从 HTTP 重定向到 HTTPS 的问题问题原因&#xff1a;HSTS&#xff08;HTTP Strict Transport Security&#xff09;什么是 HSTS&#xff1f;HSTS 的工作原理 如何解决&#xff1f;1. 清除浏览器的 HSTS 信息在 Chrome 中清除 HSTS 信息&#xff1a;在 Firef…...

3D 生成重建016-SA3D从nerf中分割一切

3D 生成重建016-SA3D从nerf中分割一切 文章目录 0 论文工作1 方法介绍2 实验结果 0 论文工作 1 SAM的背景和目标&#xff1a; SAM 是一种强大的二维视觉基础模型&#xff0c;能够在 2D 图像中进行任意物体的分割。传统上&#xff0c;SAM 在二维空间表现出色&#xff0c;但其无…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...