工作中后端是如何将API提供出去的?swaggo很不错

咱们上一次简单分享了 GO 权限管理之 Casbin ,他一般指根据系统设置的安全规则或者安全策略

  • 分享了权限管理是什么
  • Casbin 是什么
  • Casbin 的特性
  • Casbin 的应用案例

要是感兴趣的话,咱们以后可以多多深入的探讨和分享,欢迎查看文章 GO 权限管理之 Casbin

今天咱们来分享一下咱们在工作中,后端的小伙伴是如何将 API 高效的提供出去的呢?

API 由一组定义和协议组合而成,可用于构建和企业集成应用软件

API 就是 应用编程接口

相信有很多朋友喜欢写文档的,可能会使用markdown将接口写下来,相关负责人约定好一个固定的模板

有的会使用简单的文本文件,有的大兄弟可能连一点文档资料都不输出,这样在电视剧里面是活不过第二集的

那么测试的时候呢?

一般会使用postman工具,对照着接口进行参数的设置,进行自测,或者写脚本进行测试

可是,这样都太麻烦了,还要画太多的时间在书写接口上面,每次修改接口还要对应的修改文档,相当繁琐,有点反人性

那咱们来看看 GO swaggo工具 是如何解决上述问题的,都有哪些骚操作吧

swaggo 是什么?

是一个工具,专门用于将 golang 注解自动转换为Swagger 2.0文档

Swagger 又是个啥?

Swagger 是一个Web 服务

他是一个规范且完整的框架,可以生成、描述、调用和可视化 RESTful 风格的文档

那么他的优势是个啥?

大致有如下 2 个优势:

  • 支持 API 自动生成同步的在线文档

使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了

  • 提供了 Web 页面在线测试 API

Swagger 生成的文档还支持在线测试

参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口,用起来真的别提多香了

咱们如何使用 swaggo?

咱们来写一个最基本你的swaggo的案例使用,大致分为如下步骤:

  • 安装swag,用于自动生成文档
  go get -u github.com/swaggo/swag/cmd/swag
  • 需要使用到如下 2 个包, 可以先知悉一下,咱们还是默认是用go mod 的方式,写完代码之后 直接go build ,会将用到的包都拉下来

第一个是 gin-swagger , 咱们用gin 来玩 swagger 比较方便,之前也和大家分享过gin 的使用,感兴趣的可以查看文章 Gin实战演练

go get github.com/swaggo/gin-swagger

第二个是swagger 内置文件

go get github.com/swaggo/gin-swagger/swaggerFiles
  • 需要简单使用 gin 框架

咱们开始编码一个简单的小DEMO

package main

import (
"github.com/gin-gonic/gin"
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
"net/http"
_ "myswa/docs"
) // gin 的处理函数 Hello
func Hello(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"msg": "hello wrold xiaomotong" })
} func main() { r := gin.Default() r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // 路由分组, 第一个版本的api v1
v1 := r.Group("/api/v1")
{
v1.GET("/hello", Hello) } // 监听端口为 8888
r.Run(":8888")
}

上述代码大致分为这几步:

  • 使用 r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) 将 swaggerFiles.Handler 注册上
  • 写一个自定义的路由和对应的方法
  • 监听指定的地址和端口

上述代码编写完毕之后,咱们可以在和main.go 的同级目录中初始化一个 go 的模块,再go build咱们运行程序

go mod init myswa
go build

上述命令 go mod init myswa,初始化模块为 myswa ,以后导入咱们的本地包路径都需要是以myswa开头

执行上述命令后,会初始化一个myswa 的模块,执行 go build 后,会将用到的相关包拉下来,进行编译

编译成功后在浏览器中键入:

http://127.0.0.1:8888/swagger/index.html

若查看到如下错误打印消息,原因是没有安装swagdocs

此处可以检查一下,是否安装swag 成功

go get -u github.com/swaggo/swag/cmd/swag

安装成功后,可以使用 swag init 进行初始化,swag 会帮我们生成相应的docs,例如我的代码目录是这个样子的

这也就是为什么咱们导入的包中有一个是 _ "myswa/docs"

再次在浏览器中键入:

http://127.0.0.1:8888/swagger/index.html,可以查看到如下效果,则为成功

添加注释

咱们在main.go文件中,加入点注释,再看看效果,例如

package main

import (
"github.com/gin-gonic/gin"
ginSwagger "github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
"net/http"
_ "myswa/docs"
) // gin 的处理函数 Hello
func Hello(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"msg": "hello wrold xiaomotong" })
}
// @title Xiaomotong Swagger API
// @version 1.0
// @description 参加更文挑战第 26 天了,主题是 Swagger
// @termsOfService https://juejin.cn/user/3465271329953806 // @contact.name https://juejin.cn/user/3465271329953806
// @contact.url https://juejin.cn/user/3465271329953806
// @contact.email xxx@xxx.com.cn // @host 127.0.0.1:8888
// @BasePath /api/v1
func main() { r := gin.Default() r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // 路由分组, 第一个版本的api v1
v1 := r.Group("/api/v1")
{
v1.GET("/hello", Hello) } // 监听端口为 8888
r.Run(":8888")
}

添加完注释后执行如下 3 步:

  • 删除掉 之前生成的 docs 目录
  • 再次在main.go同级目录下执行 swag init 生成最新的文档
  • 执行 go run main.go , 浏览器访问http://127.0.0.1:8888/swagger/index.html咱们就可以看到如下效果

此时查看咱们生成的docs目录下看看具体文件内容都有个啥?

这些都是自动生成的

my_swa/docs/swagger.json 如下

{
"swagger": "2.0",
"info": {
"description": "参加更文挑战第 26 天了,主题是 Swagger",
"title": "Xiaomotong Swagger API",
"termsOfService": "https://juejin.cn/user/3465271329953806",
"contact": {
"name": "https://juejin.cn/user/3465271329953806",
"url": "https://juejin.cn/user/3465271329953806",
"email": "xxx@xxx.com.cn"
},
"version": "1.0"
},
"host": "127.0.0.1:8888",
"basePath": "/api/v1",
"paths": {}
}

my_swa/docs/swagger.yaml如下:

basePath: /api/v1
host: 127.0.0.1:8888
info:
contact:
email: xxx@xxx.com.cn
name: https://juejin.cn/user/3465271329953806
url: https://juejin.cn/user/3465271329953806
description: 参加更文挑战第 26 天了,主题是 Swagger
termsOfService: https://juejin.cn/user/3465271329953806
title: Xiaomotong Swagger API
version: "1.0"
paths: {}
swagger: "2.0"

实际UI显示的数据来源于上述 两个文件

对于上述注释中的关键字,咱们列一个表格瞅瞅

tag 说明
titile 文档标题
version 版本
description 描述,可写可不写
host 服务文档的端口
BasePath 基础路径
Summary 总结
Description 描述
Tags 用来给API分组
Accept 接收的参数类型,支持表单(mpfd) 和 JSON(json)
Param 参数,具体的写法如下:
@Param 参数名 参数类型 参数数据类型 是否必须 参数描述 其他属性
参数的类型
- path 这个类型的值可以直接拼接到 URL上面
@Param name path string true "具体名字"- query 这个类型值 一般是 和 URL 进行组合

- query 这个类型值 一般是 和 URL 进行组合
@Param name query string true "具体名字"

- formData 这个类型的值 一般是用于 POST 方法,或者 PUT方法
@Param name formData string true "具体名字" default(root)

参数的数据类型有如下几种
string(string) , integer (int, uint, uint32, uint64) , number (float32) , boolean (bool) , file 用于上传文件

其他属性支持**:
- 枚举
- 值的添加范围
- 设置默认值
Success 响应成功的情况如何处理
@Success HTTP响应码 {响应参数类型} 响应数据类型 其他描述
Failure 响应失败的情况如何处理
@FailureHTTP响应码 {响应参数类型} 响应数据类型 其他描述
Router 路由 , 不加基础路径的
@Router /hello [get]

我们给函数添加上对应的注释,看看效果

// @Summary hello world
// @Description 对谁说 hello wrold
// @Tags 挑战测试
// @Accept json
// @Param name query string true "具体名字"
// @Success 200 {string} string "{"msg": "hello xxx"}"
// @Failure 400 {string} string "{"msg": "NO name"}"
// @Router /hello [get]
// gin 的处理函数 Hello
func Hello(c *gin.Context) {
name := c.Query("name")
c.JSON(http.StatusOK, gin.H{"msg": "hello wrold" + name})
}

添加完注释后执行如下 3 步:

  • 删除掉 之前生成的 docs 目录
  • 再次在main.go同级目录下执行 swag init 生成最新的文档
  • 执行 go run main.go , 浏览器访问http://127.0.0.1:8888/swagger/index.html咱们就可以看到如下效果

咱们在页面上做一下基本测试,填入name ,执行,看看效果

呐,测试成功

如果将这样的文档给出去,对于前端来说就非常的友好了,并且对于我们的工作量没有什么增加,写代码的时候,顺便把注释写上去

发布

开发完毕后,发布版本的时候,不可能还要带上自己的api文档吧,这是不应该的

因此,咱们可以通过 build tag 的方式来控制是否编译文档,这里留个悬念,感兴趣的朋友可以尝试一下

感兴趣的朋友,可以将上述代码贴到本地,安装对应的库,执行一下,看看效果,确实非常好用,希望能帮助到你

总结

  • swaggo 是什么
  • swagger 是什么
  • 如何使用 swaggo
  • 如何测试 swaggo

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

好了,本次就到这里,下一次 GO 的定时器 timer 和定时任务cron

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是小魔童哪吒,欢迎点赞关注收藏,下次见~

工作中后端是如何将API提供出去的?swaggo很不错的更多相关文章

  1. 【开源】【前后端分离】【优雅编码】分享我工作中的一款MVC+EF+IoC+Layui前后端分离的框架——【NO.1】框架概述

    写博客之前总想说点什么,但写的时候又忘了想说点什么,算了,不说了,还是来送福利吧. 今天是来分享我在平时工作中搭建的一套前后端分离的框架. 平时工作大多时候都是在做管理类型的软件开发,无非就是增.删. ...

  2. SpringBoot中使用springfox+swagger2书写API文档

    随着前后端的分离,借口文档变的尤其重要,springfox是通过注解的形式自动生成API文档,利用它,可以很方便的书写restful API,swagger主要用于展示springfox生成的API文 ...

  3. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查

    AngularJS中的$resource服务相比$http服务更适合与RESTful服务进行交互.本篇后端使用ASP.NET Web API, 前端使用$resource,实现增删改查. 本系列包括: ...

  4. OC中并发编程的相关API和面临的挑战

    OC中并发编程的相关API和面临的挑战(1) 小引 http://www.objc.io/站点主要以杂志的形式,深入挖掘在OC中的最佳编程实践和高级技术,每个月探讨一个主题,每个主题都会有几篇相关的文 ...

  5. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现分页、过滤

    在上一篇中实现了增删改查,本篇实现分页和过滤. 本系列包括: 1.前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查2.前端使用AngularJS的$re ...

  6. 工作中,ES6 可能掌握这些就足够了

    刚开始用vue或者react,很多时候我们都会把ES6这个大兄弟加入我们的技术栈中.但是ES6那么多那么多特性,我们需要全部都掌握吗?秉着二八原则,掌握好常用的,有用的这个可以让我们快速起飞. 接下来 ...

  7. 怎样在 Azure 应用服务中生成和部署 Java API 应用

    先决条件 Java 开发人员工具包 8(或更高版本) 已在开发计算机上安装 Maven 已在开发计算机上安装 Git Azure 订阅付费版或试用版 HTTP 测试应用程序,如 Postman 使用 ...

  8. [水煮 ASP.NET Web API2 方法论](1-1)在MVC 应用程序中添加 ASP.NET Web API

    问题 怎么样将 Asp.Net Web Api 加入到现有的 Asp.Net MVC 项目中 解决方案 在 Visual Studio 2012 中就已经把 Asp.Net Web Api 自动地整合 ...

  9. 详解 UWP (通用 Windows 平台) 中的两种 HttpClient API

    UWP (通用 Windows 平台) 应用开发者在构建通过 HTTP 与 Web 服务或服务器断点交互的应用时,有多种 API 可以选择.要在一个托管 UWP 应用中实现 HTTP 客户端角色,最常 ...

随机推荐

  1. gitlab 设置分支保护功能及取消分支保护

      使用gitlab管理员账户登录gitlab系统 进入需要分支保护的项目 进行分支保护设置 保护开发分支策略配置 保护RC送测库分支策略配置 调整分支保护策略 效果展示 取消分支保护 效果展示

  2. hdu 1394 线段树计算逆序数

    线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...

  3. CentOS7-磁盘扩容(LVM-非空目录拓展卷空间大小)

    查看存储情况 $ df -kh 查看磁盘情况 $ fdisk -l 创建分区(注:可操作存储上限2TB) $ fdisk /dev/sdb 根据提示,依次输入"n","p ...

  4. Mybatis:Mybatis 逆向工程 generator配置

    一.使用Maven方式引入Mybatis依赖Jar包(版本号自己改或定义)

  5. 使用过redis做异步队列么,你是怎么用的?有什么缺点?

    Redis设计主要是用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列. 它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列: 另外,做消息队列的其他特性例如FIF ...

  6. php-高级计算器

    HTML代码: <!doctype html><html lang="en"><head> <meta charset="UTF ...

  7. hdu 2092 整数解(一元二次方程解)

    题目: 思路: 1.两个整数的和和积容易联想到一元二次方程的两个根,只要证明有两个解,并都是整数就打印出Yes,否则打印出No 2.最后判断那步,为什么只需要判断一个整数存在就够了,因为和是整数,一个 ...

  8. Java 内存泄漏知多少?

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 面试的时候内存管理是不是很多面 ...

  9. Spring boot中相关的注解

    一.相关类中使用的注解 @RestController:REST风格的控制器 @RequestMapping:配置URL和方法之间的映射 @SpringBootApplication:应用程序入口类 ...

  10. 自动化运维必须要学的Shell脚本之——循环语句(for、while和until循环)

    1. 循环前先了解echo的使用 1.1 echo -n 表示不换行输出 1.2 echo -e 输出转义字符,将转义后的内容输出到屏幕上 常见的转义字符有: 1.2.1 \b 相当于退格键 转义后相 ...