首页 > 其他分享 >webapi 注解调试工具swaggo 介绍和使用

webapi 注解调试工具swaggo 介绍和使用

时间:2023-10-31 11:56:07浏览次数:40  
标签:webapi swag http err ctx swaggo go 注解 main

swaggo 介绍和使用

介绍

  • Swag是一个开源项目,用于web框架下接口调试和文档管理,可以将代码中的接口注释转换为文档格式,并提供界面在线调试接口的功能。
  • 项目地址:https://github.com/swaggo/swag
  • 目前项目可以支持的web框架
    • gin,echo,buffalo,net/http,gorilla/mux,go-chi/chi,flamingo,fiber,atreugo,hertz
  • 在线界面调试和文档效果图

使用

  • 文档用的测试环境

    • go version go1.20.1 linux/amd64
    • swag version v1.16.2(测试时尽量更新到最新版本,旧版本有其他bug)
    • 更新操作 go get -u github.com/swaggo/swag/cmd/swag@latest
    • 示例用到的web框架为gin
  • 安装swag

    • go install github.com/swaggo/swag/cmd/swag@latest
  • 先实现一个简单的web api 计算俩个值的积

    • 目录结构 go mod init demo

      ├── go.mod
      ├── go.sum
      └── main.go

    • main.go

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    	"strconv"
    )
    
    // HTTPError example
    type HTTPError struct {
    	Code    int    `json:"code" example:"400"`
    	Message string `json:"message" example:"status bad request"`
    }
    
    func CalcExample(ctx *gin.Context) {
    	val1, err := strconv.Atoi(ctx.Query("val1"))
    	if err != nil {
    		er := HTTPError{
    			Code:    http.StatusBadRequest,
    			Message: err.Error(),
    		}
    		ctx.JSON(http.StatusBadRequest, er)
    		return
    	}
    	val2, err := strconv.Atoi(ctx.Query("val2"))
    	if err != nil {
    		er := HTTPError{
    			Code:    http.StatusBadRequest,
    			Message: err.Error(),
    		}
    		ctx.JSON(http.StatusBadRequest, er)
    		return
    	}
    	ans := val1 + val2
    	ctx.String(http.StatusOK, "%d", ans)
    }
    
    func main() {
    	r := gin.Default()
    
    	api := r.Group("/examples")
    	api.GET("calc", CalcExample)
    	r.Run(":8080")
    }
    
  • 对调用api进行注释

    //	@title			Swagger Example API
    //	@version		1.0
    //	@description	This is a sample swap server
    
    // CalcExample godoc
    //
    //	@Summary		calc example
    //	@Description	plus
    //	@Tags			example
    //	@Accept			json
    //	@Produce		plain
    //	@Param			val1	query		int		true	"used for calc"
    //	@Param			val2	query		int		true	"used for calc"
    //	@Success		200		{integer}	string	"answer"
    //	@Failure		400		{string}	string	"ok"
    //	@Failure		404		{string}	string	"ok"
    //	@Failure		500		{string}	string	"ok"
    //	@Router			/examples/calc [get]
    func CalcExample(ctx *gin.Context) {
    	val1, err := strconv.Atoi(ctx.Query("val1"))
    	if err != nil {
    		er := HTTPError{
    			Code:    http.StatusBadRequest,
    			Message: err.Error(),
    		}
    		ctx.JSON(http.StatusBadRequest, er)
    		return
    	}
    	val2, err := strconv.Atoi(ctx.Query("val2"))
    	if err != nil {
    		er := HTTPError{
    			Code:    http.StatusBadRequest,
    			Message: err.Error(),
    		}
    		ctx.JSON(http.StatusBadRequest, er)
    		return
    	}
    	ans := val1 + val2
    	ctx.String(http.StatusOK, "%d", ans)
    }
    
  • 生成文档目录

swag init -g main.go -o ./docs
# -g 指定main.go文件路径,默认当前路径下查找main.go文件
# -o 指定输出路径,默认为当前路径
  • 在项目根目录下执行执行会在当前目录生成docs目录以及目录下相关文件
    • ├── docs
      │ ├── docs.go
      │ ├── swagger.json
      │ └── swagger.yaml
      ├── go.mod
      ├── go.sum
      └── main.go
  • 在项目中配置gin-swagger插件和调用重定向代码
	import(
        _ "demo/docs" //swag init -g main.go 生成的目录模块
		swaggerFiles "github.com/swaggo/files"
		ginSwagger "github.com/swaggo/gin-swagger" //适配gin框架插件
    )

    func main() {
        r := gin.Default()

        api := r.Group("/examples")
        api.POST("calc", CalcExample)
        //重定向接口 usr = basePath + @Router 拼接而成
       	docs.SwaggerInfo.BasePath = "/"
        r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
        r.Run(":8080")
    }

注释规则

  • 主要常用注释关键字

    • @title 应用程序名(这里官方文档描述必填选项, 实测去掉也行)
    • @version api版本号(这里官方文档描述必填选项, 实测去掉也行)
    • @Summary 接口概述
    • @Description 接口的详细描述
    • @Tags 接口类型标记,用来管理界面显示接口,用来进行分类
    • @Param 参数说明格式: param name,param type,data type,is mandatory?,comment attribute(optional)
    • @Success 以空格分隔的成功响应。return code,{param type},data type,comment
    • @Router url请求地址 [get/post/或其他方法]
  • 更多的注释格式说明

标签:webapi,swag,http,err,ctx,swaggo,go,注解,main
From: https://www.cnblogs.com/chen-pi/p/17799930.html

相关文章

  • 使用【注解】加【拦截器】实现权限控制
    前面介绍了使用SpringSecurity进行权限控制,其中一个非常方便的特点就是:可以在类和方法上使用注解,从而实现对资源访问的权限控制。但是SpringSecurity具有一定的学习成本和复杂度,想要灵活驾驭并用好框架并非一件容易的事情,比如跟其它系统进行单点登录集成等等。本篇博客介绍......
  • @PostConstruct注解
    @PostConstruct注解,使用在方法上,它可以被用来标注一个非静态的void方法,这个方法会在该类被Spring容器初始化后被执行,实现数据初始化的操作。注:@PostConstruct只能用在方法上面,而不能用在属性或构造函数上。一个类中可以有多个使用@PostConstruct注解的方法,但执行顺序并......
  • SpringCloud复习:(2)@LoadBalanced注解的工作原理
    @LoadBalanced注解标记了一个RestTemplate或WebClientbean使用LoadBalancerClient来进行负载均衡。LoadBalancerAutoConfiguration类给带注解的@RestTemplate添加了拦截器:LoadBalancerInterceptor.具体流程如下:首先定义一个LoadBalancerInterceptor然后定义了一个RestTemplateC......
  • 注解
    1.注解1.1注释和注解的区别?(掌握)共同点:都可以对程序进行解释说明。不同点:注释,是给程序员看的。只在Java中有效。在class文件中不存在注释的。 当编译之后,会进行注释擦除。 注解,是给虚拟机看的。当虚拟机看到注解之后,就知道要做什么事情了。##1.2如何使用注解(掌握)在以前看过注......
  • sowft注解
    一、概念:为什么要使用注解?①.PHP是没有注解,所以只能用注释来模拟.②.借鉴了Javaspring的思想.③.一般框架会使用DoctrineAnnotations库:https://github.com/doctrine/annotations④.swoole是常驻内存的,使用IoC容器结合注解特别有意义.1.1反射实现注解原理:PHP中利用......
  • 为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?
    引言在使用Spring框架和JetBrainsIDEA集成开发环境(IDE)进行Java开发时,你可能经常会遇到@Autowired注解。@Autowired是Spring框架中用于实现依赖注入的核心注解之一。然而,近年来,Spring和IDEA都不再推荐使用@Autowired注解,并提出了更好的替代方案。本文将详细分析为什么Spring和IDE......
  • SpringBoot 自定义注解实现过程
    1、新建SpringBoot-Test 其中pom.xml文件如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schem......
  • C# Webapi Filter 过滤器 - 生命周期钩子函数 - Exception Filter 基础
    什么是Filter?1.切面编程机制,在ASP.NETCore特定的位置执行我们自定义的代码;2.ASP.NETCore中的Filter五种类型,Authorization,filter,resourcefilter,actionfilter,exceptionfitler,resultfilter;3.所有的筛选器都有异步和同步两种版本;eg:IActionFilter,IAsyncActionF......
  • 详解SpringBoot @Conditional相关条件注解
    Springboot条件注解是@ContionalXXX相关的注解,表示当特定条件有效时,被修饰的配置类或配置方法才会生效。条件注解可以用来修饰@Configuration类或@Bean方法等。主要有以下行为:当SpringBoot检测到类加载路径包含某个框架时,会自动配置该框架的基础Bean.只有当开发者没配置某......
  • @Resource注解
    @Resource注解是Java平台提供的注解,用于进行依赖注入。当你在类中的字段或属性上使用@Resource注解时,Java容器会自动为该字段或属性注入一个合适的Bean对象。@Resource注解可以标注在字段或属性的setter方法上。如果标注在字段上,则会自动注入与该字段类型相匹配的Bean对象。如果......