Swagger-go学习笔记

目录

    • Swagger的作用
      • 背景
      • Swagger介绍
    • Swagger的基本使用
      • 1. 使用步骤
      • 2. 添加注释
      • 3. 生成接口文档数据
      • 4. 引入gin-swagger
      • 5. 测试结果
      • 6. 使用Token
    • Swagger-go的中文文档
      • 通用API信息
      • API操作
      • MIME类型
      • 参数类型
      • 数据类型

Swagger的作用

背景

在传统的前后端分离的项目中,会使用接口文档来统一前后端的接口,一个接口应该包含以下信息:

  1. 接口的标题(如:用户登录)
  2. 接口的请求方法(如:post)
  3. 接口的描述(如:通过用户名和密码进行登录,登录成功后返回用户 id 和权限 token)
  4. 接口的请求参数(如:Query 参数:username string 登录用户名 必需 password string 登录密码 必需)
  5. 接口的返回响应(如:HTTP 状态码: 200。内容格式: JSON。数据结构<就是返回的参数规定,哪些参数,参数类型,参数是否必须,参数的含义>)
  6. 接口的路径(如:/douyin/user/login/)

其实接口文档除了要包含这些信息以外,可能还需要有一些代码示例以及参数的示例,毕竟有时候干巴巴的文字看起来很难懂。

Swagger介绍

在前后端分离的项目开发过程中,如果后端开发人员能够提供一份清晰明了的接口文档,那么就能极大地提高前后端开发人员的沟通效率和开发效率。可是编写接口文档历来都是令人头痛的,而且后续接口文档的维护也十分耗费精力。最好是有一种方案能够既满足我们输出文档的需要又能随代码的变更自动更新,而Swagger正是那种能帮我们解决接口文档问题的工具。

Swagger的基本使用

1. 使用步骤

以Gin框架为例,使用gin-swagger库,使用Swagger 2.0生成RESTful API文档。项目的demo代码地址:https://gitee.com/Free_Software/swagger-go。

使用gin-swagger一般需要下面三个步骤:

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

2. 添加注释

在程序入口main函数上以注释的方式写下项目相关介绍信息。

// @title blogWebsite
// @version 2.0
// @description 这是一个blogWebsite的demo项目,最初用来练习docker compose。目前项目中有很多接口还没有开发完成
// @termsOfService http://swagger.io/terms/// @contact.name 氷
// @contact.url http://www.swagger.io/support
// @contact.email abc.xyz@qq.com// @license.name Apache 2.0
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html// @host 127.0.0.1:8080
// @BasePath /

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

type responseUser struct {Msg stringId  uint64
}// AddUser
// @Summary 添加用户接口
// @Description 从前端获取用户名和密码用来添加一个用户
// @Tags 用户管理
// @Accept application/json
// @Produce application/json
// @Param username query string true "用户名"
// @Param password query string true "密码"
// Success 200 {object} responseUser
// @Router /addUser [post]
func AddUser(c *gin.Context) {username := c.Query("username")password := c.Query("password")//查询用户名和密码是否为空if username != "" && password != "" {//查询用户名是否重复result := service.SelectUserIfExist(username)if result == 1 {res := responseUser{Msg: "用户名已被使用",}c.JSON(http.StatusOK, res)} else {id := service.Register(username, password)res := responseUser{Msg: "用户注册成功",Id:  id,}c.JSON(http.StatusOK, res)}} else {res := responseUser{Msg: "用户名或密码不能为空",}c.JSON(http.StatusOK, res)}
}type responsePost struct {Msg stringId  uint64
}// AddPost
// @Summary 添加文章接口
// @Description 从前端获取文章标题,文章内容和用户ID用来添加文章
// @Tags 文章管理
// @Accept application/json
// @Produce application/json
// @Param title query string true "文章标题"
// @Param context query string true "文章内容"
// @Param userID query string true "用户ID"
// @Success 200 {object} responsePost
// @Router /addPost [post]
func AddPost(c *gin.Context) {title := c.Query("title")context := c.Query("context")userID := c.Query("userID")id, err := strconv.Atoi(userID) // 将字符串类型的id转换为int类型if err != nil {fmt.Println("Error:", err)return}if title != "" {result := service.AddPost(title, context, id)responsePost := responsePost{Msg: "添加文章成功",Id:  result.PostID,}c.JSON(http.StatusOK, responsePost)} else {responsePost := responsePost{Msg: "文章标题不能为空",}c.JSON(http.StatusOK, responsePost)}
}

3. 生成接口文档数据

编写完注释后,使用以下命令下载和安装swagger的cmd命令:

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

在项目根目录执行以下命令,使用swag工具生成接口文档数据。

swag init

执行完上述命令后,如果你写的注释格式没问题,此时你的项目根目录下会多出一个docs文件夹。

./docs
├── docs.go
├── swagger.json
└── swagger.yaml

4. 引入gin-swagger

下载gin-swagger的相关包

go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

在项目代码中注册路由的地方按如下方式引入gin-swagger相关内容。

// 这是你的注册路由的文件
import (_ "docker_compose_blog/docs"  // 千万不要忘了导入把你上一步生成的docs文件夹的路径swaggerFiles "github.com/swaggo/files"gs "github.com/swaggo/gin-swagger"
)

注册swagger api相关路由

// 在你注册路由的文件中添加
r.GET("/swagger/*any", gs.WrapHandler(swaggerFiles.Handler))

把你的项目程序运行起来(重新go build,然后再运行),打开浏览器访问 http://localhost:8080/swagger/index.html 就能看到Swagger Api文档了。

需要注意的是:每次修改注释后都必须要重新swag init然后go build,修改才会生效。

5. 测试结果

这是main函数上面注释生成的项目描述信息。

image-20231010150731357

由于有两种Tags(文章管理和用户管理),相同的Tags会被分为一类。如下所示:

image-20231010154145489

先在用户管理中添加一个用户。点击Try it out就可以输入用户名和密码。

image-20231010154354826

点击Execute就可以提交请求,可能会遇到跨域问题,请自行解决。最后返回结果如下:

image-20231010155914780

现在测试文章管理的接口。测试结果如下:

image-20231010160249734

查询数据库,发现一切正常。

image-20231010160329438

6. 使用Token

如果前后端在交互过程中涉及到token的传递,那么会有以下几种情况。

  1. 如果前端将token作为query参数传递给后端,那么很简单,后端只需要把token当作query参数正常接收就可以了。
# 前端发送axios
axios.delete(`http://127.0.0.1:8080/admin/deleteBlog?title=${row.id}&token=${token}`)# 后端的注释
// @Param token query string true "Token"
  1. 前端将token放在请求头中,那么后端需要执行以下步骤。
# 前端发送axios
const token = localStorage.getItem('token');
const response = await axios.get('http://127.0.0.1:8080/admin/getPubTimeData', {headers: {Authorization: `Bearer ${token}`,}
# 后端在接口注释中要添加以下内容
@Security ApiKeyAuth# 接下来需要在swagger.yaml文件中写入以下内容(里面的ApiKeyAuth这个名字需要和@Security注释后面的内容保持一致)
securityDefinitions:ApiKeyAuth:type: apiKeyin: headername: Authorization

Swagger-go的中文文档

以上就完成了swagger的基本使用。其实关于Swagger还有很多东西,这是一个中文文档:SwaggerGo中文文档。下面是一些官方文档中比较常见注释的解释。

通用API信息

注释描述
AcceptAccept字段仅适用于带有request body的请求,例如POST、PUT和PATCH。只有使用这些请求方法的接口才需要定义接收的 MIME 类型列表。
Produce定义接口返回的 MIME 类型列表。

API操作

注释描述
@Summary接口功能的简要概述。
@Description接口的详细说明。
@Tags接口的标签列表,可以有多个标签,每个标签用英文的逗号分隔。这样接口会按照标签进行分类。
@Param接口接收的数据,参数用空格分隔。参数分别是:“参数名” “参数类型” “数据类型” “是否必须” “参数的描述”。
@Success接口的成功响应语法格式:“响应的状态码” “数据类型” “返回对象模型” “描述信息”。
@Failure接口的故障响应语法格式:“响应的状态码” “数据类型” “返回对象模型” “描述信息”。
@Response与@Success和@Failure的作用相同。
@Router接口的路由定义,用空格隔开路径和请求方法。 path [httpMethod]
@Security定义接口的安全性

MIME类型

别名MIME Type
jsonapplication/json
xmltext/xml
plaintext/plain
htmltext/html
mpfdmultipart/form-data
x-www-form-urlencodedapplication/x-www-form-urlencoded
json-apiapplication/vnd.api+json
json-streamapplication/x-json-stream
octet-streamapplication/octet-stream
pngimage/png
jpegimage/jpeg
gifimage/gif

参数类型

  • query
  • path
  • header
  • body
  • formData

数据类型

  • string (string)
  • integer (int, uint, uint32, uint64)
  • number (float32)
  • boolean (bool)
  • object (struct)

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

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

相关文章

vue3组件的通信方式

一、vue3组件通信方式 通信仓库地址:vue3_communication: 当前仓库为贾成豪老师使用组件通信案例 不管是vue2还是vue3,组件通信方式很重要,不管是项目还是面试都是经常用到的知识点。 比如:vue2组件通信方式 props:可以实现父子组件、子父组件、甚至兄弟组件通信 自定义事件:可…

C语言自定义类型_枚举联合(3)

目录 枚举 什么是枚举类型&#xff1f; 枚举的声明 枚举的定义 枚举的优点 枚举的使用 联合&#xff08;共用体&#xff09; 什么是联合呢&#xff1f; 联合类型的定义 联合的特点 联合使用 联合大小的计算 联合的应用 今天接着我们来结束自定义类型。&#x1f19…

Flink之Watermark源码解析

1. WaterMark源码分析 在Flink官网中介绍watermark和数据是异步处理的,通过分析源码得知这个说法不够准确或者说不够详细,这个异步处理要分为两种情况: watermark源头watermark下游 这两种情况的处理方式并不相同,在watermark的源头确实是异步处理的,但是在下游只是做的判断,这…

TensorFlow学习:在web前端如何使用Keras 模型

前言 在上篇文章 TensorFlow学习&#xff1a;使用官方模型进行图像分类、使用自己的数据对模型进行微调中我们学习了如何使用官方模型&#xff0c;以及使用自己的数据微调模型。 但是吧&#xff0c;代码一直是跑在Python里&#xff0c;而我本身是做前端开发的。我是很想让它在…

es elasticsearch 基础

es https://www.elastic.co/guide/en/elasticsearch/reference/6.8/getting-started.html 倒排索引&#xff1a; 正排–>从目录到文章内容 倒排–>内容到目录文章标题 if we dont need full text search ,we dont need to create 倒排 using text type 分词&#xff1a…

C语言-贪吃蛇 1.输入控制ncurse

一、为什么要用nurse C语言中的gets()、scanf()、getchar()等函数是在用户输入后需要按下Enter键才能执行代码&#xff0c;而贪吃蛇要求按下按键后立即对蛇的方向进行操作&#xff0c;所以根据贪吃蛇功能的需求引入ncurse&#xff0c;让用户输入后就能让蛇进行对应的行动。 二、…

10.本项目的简单介绍及所用工具

本项目的简单介绍及所用工具 本项目的层次架构适合初学者或者有一些基础的同学&#xff0c;项目整体简单明了&#xff0c;有着非常严谨的逻辑思维&#xff0c;并且在前面文章中也讲了一些项目中所需要的软件安装配置以及一些前置的在本项目中所需要的java基础知识。 项目名称 …

8路高速光栅尺磁栅尺编码器4倍频计数转Modbus TCP网络模块 YL99-RJ45

特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 高速光栅尺磁栅尺4倍频计数&#xff0c;频率可达5MHz ● 模块可以输出5V的电源给光栅尺或传感器供电 ● 支持8个光栅尺同时计数&#xff0c;可识别正反转 ● 可以设置作为16路独立DI高速计数器 ● 可网…

智慧办公数据可视化大屏设计(数据可视化)、大数据、数据大屏、办公数据大屏、办公数据

本次分享的作品是用软件Axure8.0&#xff08;兼容9和10&#xff09;制作的智慧办公数据进行的可视化大屏设计&#xff0c;主要是针对办公的综合数据、工位数据、会议室数据、访客数据、能耗数据以及设备智控数据进行可视化数据分析。 1、综合分析:对办公室的整体数据、空气质量…

JVM第一讲:JVM相关知识体系详解+面试(P6熟练 P7精通)

JVM相关知识体系详解面试(P6熟练 P7精通) 面试时常常被面试官问到JVM相关的问题。本系列将给大家构建JVM核心知识点全局知识体系&#xff0c;本文是JVM第一讲&#xff0c;JVM相关知识体系详解和相关面试题梳理。 文章目录 JVM相关知识体系详解面试(P6熟练 P7精通)1、JVM学习建议…

设计模式 - 行为型考点模式:责任链模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 1.1、责任链模式 1.1.1、概述 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 1.1、责任链模式 1.1.1、概述 为了避免请求发送者和多个请求处理者耦合在一起&#xff0c;就将所有请求处理者通过前一个对象记住下一个对象的引用的方…

联邦学习综述二

联邦学习漫画 联邦学习漫画链接: https://federated.withgoogle.com/ Federated Analytics: Collaborative Data Science without Data Collection 博客链接: https://blog.research.google/2020/05/federated-analytics-collaborative-data.html 本篇博客介绍了联邦分析&a…

Filebeat、metricbeat、kafka

kibana机子上安装filebeat&#xff08;因为有nginx&#xff09; 上传filebrat包 在es概览查看 上传metricbeat 排错 tailf !$ Kibana-Vlsualize查看 kafka(卡夫卡) kafka是一个分布式的消息发布—订阅系统&#xff08;kafka其实是消息队列&#xff09;消息队列中间件 Kafka的…

Pycharm远程debug代码,一直进入remote_sources

最近debug发现代码一直跳转到 AppData\Local\JetBrains\PyCharm2022.2\remote_sources\xxx这样的目录下&#xff0c;查找百度也没有找到解决的方法。 最后发现&#xff0c;在Run的配置这&#xff0c;有一个Path mappings是空的&#xff0c;把这里的映射填成本地项目和远程项目…

HDR-ISP_unpack_depwl_01_20231002

https://github.com/JokerEyeAdas/HDR-ISP/tree/main 1.unpack&#xff1a;解析raw图 (1)unpack&#xff1a;2个字节1个像素 (2)mipi10&#xff1a;5个字节4个像素 [p1 9:2][p2 9:2][p3 9:2][p4 9:2][(p1 1:0)(p2 1:0)(p3 1:0)(p4 1:0)] (3)mipi12&#xff1a;3个字节2个像…

vscode安装svn扩展(windows)

一、安装 1.1 环境说明 操作系统 windows 10 1.2 安装过程 1. 安装svn 双击安装程序 点击next 继续next 继续next 点击Install 在弹出框中点击 是 开始安装进度&#xff0c;一会将安装成功 安装结束 右键菜单栏中已经有svn选项&#xff0c;并且能正常拉取以…

vue3+elementui实现表格样式可配置

后端接口传回的数据格式如下图 需要依靠后端传回的数据控制表格样式 实现代码 <!-- 可视化配置-表格 --> <template><div class"tabulation_main" ref"myDiv"><!-- 尝试过在mounted中使用this.$refs.myDiv.offsetHeight,获取父元素…

[NPUCTF2020]ezinclude 文件包含两大 getshell方式

PHP LFI 利用临时文件 Getshell 姿势 | 码农家园 说一下我的思路吧 robots没有 扫描发现存在 dir.php 然后404.html 报错 apache 2.18 ubuntu 这个又正好存在漏洞 所以前面全去看这个了 结果根本不是这样做。。。 正确的思路是这样 发现变量 认为是 name和 pass传递参数…

Jetson Orin NX 开发指南(6): VINS-Fusion-gpu 的编译和运行

一、前言 由于 Jetson 系列的开发板 CPU 性能不是很好&#xff0c;因此在处理图像数据时往往需要 GPU 加速&#xff0c;而 VINS-Fusion 是针对同步定位与建图&#xff08;SLAM&#xff09;问题中十分出色的视觉算法&#xff0c;但是其在图像处理过程中资源消耗较大&#xff0c…

HTML 笔记:初识 HTML(HTML文本标签、文本列表、嵌入图片、背景色、网页链接)

1 何为HTML 用来描述网页的一种语言超文本标记语言(Hyper Text Markup Language)不是一种编程语言&#xff0c;而是一种标记语言 (markup language) 2 HTML标签 HTML 标签是由尖括号包围的关键词&#xff0c;比如 <html> 作用是为了“标记”页面中的内容&#xff0c;使…