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

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

工作中后端是如何将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

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

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

相关文章
|
4月前
|
JSON 缓存 测试技术
构建高效RESTful API的后端实践指南####
本文将深入探讨如何设计并实现一个高效、可扩展且易于维护的RESTful API。不同于传统的摘要概述,本节将直接以行动指南的形式,列出构建RESTful API时必须遵循的核心原则与最佳实践,旨在为开发者提供一套直接可行的实施框架,快速提升API设计与开发能力。 ####
|
4月前
|
JSON API 数据格式
探索后端开发:从零构建简易RESTful API
在数字时代的浪潮中,后端开发如同搭建一座桥梁,连接着用户界面与数据世界。本文将引导读者步入后端开发的殿堂,通过构建一个简易的RESTful API,揭示其背后的逻辑与魅力。我们将从基础概念出发,逐步深入到实际操作,不仅分享代码示例,更探讨如何思考和解决问题,让每一位读者都能在后端开发的道路上迈出坚实的一步。
|
4月前
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
4月前
|
缓存 API 开发者
构建高效后端服务:RESTful API设计原则与实践
【10月更文挑战第43天】在数字化时代的浪潮中,后端服务的稳定性和效率成为企业竞争力的关键。本文将深入探讨如何构建高效的后端服务,重点介绍RESTful API的设计原则和实践技巧,帮助开发者提升服务的可用性、可扩展性和安全性。通过实际代码示例,我们将展示如何将这些原则应用到日常开发工作中,以确保后端服务能够支撑起现代Web和移动应用的需求。
|
4月前
|
存储 JSON 测试技术
构建高效后端API:实践和原则
【10月更文挑战第43天】本文深入探讨了如何设计和实现高效、可维护的后端API,强调了设计哲学、最佳实践和常见陷阱。通过具体示例,我们展示了如何运用这些原则来提高API的性能和可用性。
|
4月前
|
JSON API 开发者
构建高效API:后端开发中的RESTful最佳实践####
在数字化时代,API作为不同系统间通信的桥梁,其重要性日益凸显。本文将深入探讨RESTful API的设计原则与最佳实践,通过实际案例分析,揭示如何构建高效、可维护且易于使用的API接口,助力后端开发者提升项目质量与用户体验。 ####
|
4月前
|
安全 测试技术 API
构建高效RESTful API:后端开发的艺术与实践####
在现代软件开发的浩瀚星空中,RESTful API如同一座桥梁,连接着前端世界的绚丽多彩与后端逻辑的深邃复杂。本文旨在探讨如何精心打造一款既高效又易于维护的RESTful API,通过深入浅出的方式,剖析其设计原则、实现技巧及最佳实践,为后端开发者提供一份实用的指南。我们不深入晦涩的理论,只聚焦于那些能够即刻提升API品质与开发效率的关键点,让你的API在众多服务中脱颖而出。 ####
51 0
|
19天前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
17天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
49 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
16天前
|
监控 供应链 搜索推荐
亚马逊商品详情接口(亚马逊 API 系列)
亚马逊作为全球最大的电商平台之一,提供了丰富的商品资源。开发者和电商从业者可通过亚马逊商品详情接口获取商品的描述、价格、评论、排名等数据,对市场分析、竞品研究、价格监控及业务优化具有重要价值。接口基于MWS服务,支持HTTP/HTTPS协议,需注册并获得API权限。Python示例展示了如何使用mws库调用接口获取商品详情。应用场景包括价格监控、市场调研、智能选品、用户推荐和库存管理等,助力电商运营和决策。
80 23

热门文章

最新文章