微服务接口工具Swagger2

这篇具有很好参考价值的文章主要介绍了微服务接口工具Swagger2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

##1、什么是Swagger?

# 官网
https://swagger.io/

微服务接口工具Swagger2,springcloud,spring boot,后端

核心功能

  • 生成接口说明文档
  • 生成接口测试工具

2、SpringBoot集成Swagger2

1)、添加依赖

        <!-- swagger2 -->
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

2)、增加Swagger配置类

package com.mazong.serverbloguser.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    //api接口包扫描路径
    public static final String SWAGGER_SCAN_BASE_PACKAGE = "com.mazong.serverbloguser";
    public static final String VERSION = "1.0.0";

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
                .paths(PathSelectors.any()) // 可以根据url路径设置哪些请求加入文档,忽略哪些请求
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("神码宗") //设置文档的标题
                .description("用户 API 接口文档") // 设置文档的描述
                .version(VERSION) // 设置文档的版本信息-> 1.0.0 Version information
                .termsOfServiceUrl("http://www.shenmazong.com") // 设置文档的License信息->1.3 License information
                .build();
    }
}

如上代码所示,通过 @Configuration 注解,让 Spring 加载该配置类。再通过 @EnableSwagger2 注解来启用Swagger2。成员方法 createRestApi 函数创建 Docket 的Bean之后,apiInfo() 用来创建该 Api 的基本信息(这些基本信息会展现在文档页面中)。select() 函数返回一个 ApiSelectorBuilder实例用来控制哪些接口暴露给 Swagger 来展现,本例采用指定扫描的包路径来定义,Swagger 会扫描该包下所有 Controller 定义的 API,并产生文档内容(除了被 @ApiIgnore 指定的请求)。

3)、API 接口编写

在完成了上述配置后,其实已经可以产生文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。

@Controller
@RequestMapping("/")
@Api(description = "用户API接口")
public class UserController {

    @ApiOperation(value="获取用户信息", notes="根据用户ID获取用户信息", produces="application/json")
    @ApiImplicitParam(name = "id", value = "用户id", paramType = "query", required = true, dataType = "Integer")
    @RequestMapping(value = "/getUser")
    @ResponseBody
    public Object getUser(@RequestParam("id") Integer id) {
        // ...
    }

    @ApiOperation(value="获取令牌", notes="随机获取用户令牌", produces="application/json")
    @RequestMapping(value = "/getToken")
    @ResponseBody
    public Object getToken() {
        // ...
    }
}

本接口示例了 @ApiOperation 和 @ApiImplicitParam 两个注解的使用。其实swagger的注解有很多,下面简单的介绍一下:

  • @ApiParam:单个参数描述
  • @ApiModel:用对象来接收参数
  • @ApiProperty:用对象接收参数时,描述对象的一个字段
  • @ApiResponse:HTTP响应其中1个描述
  • @ApiResponses:HTTP响应整体描述
  • @ApiIgnore:使用该注解忽略这个API
  • @ApiError :发生错误返回的信息
  • @ApiImplicitParam:描述一个请求参数,可以配置参数的中文含义,还可以给参数设置默认值
  • @ApiImplicitParams:描述由多个 @ApiImplicitParam 注解的参数组成的请求参数列表

4)、运行效果

项目运行后,通过如下地址来打开swagger文档页面:

http://localhost:8000/swagger-ui.html

微服务接口工具Swagger2,springcloud,spring boot,后端

5)、优化文档

(1)设定请求方法、参数定义、返回值定义
    @GetMapping(value = "/addUser")
    @ResponseBody
    @ApiOperation(value = "增加用户", notes="执行增加用户操作")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "name", value = "用户名", required = true, paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "age", value = "年龄", required = true, paramType = "query", dataType = "int")
    })
    @ApiResponses({
            @ApiResponse(code=4001,message="请求参数没填好"),
            @ApiResponse(code=4002,message="请求路径没有或页面跳转路径不对")
    })
    public String addUser(@RequestParam("name") String name, @RequestParam("age") int age) {

        // http://localhost:8000/addUser
        TbUser user = new TbUser();
        user.setUserName(name);
        user.setAge(age);
        int id = iUserDbMapper.addUser(user);
        System.out.println("addUser="+user.getId());

        return user.toString();
    }
(2)运行效果

微服务接口工具Swagger2,springcloud,spring boot,后端

(3)测试接口

微服务接口工具Swagger2,springcloud,spring boot,后端

3、Swagger2的注解

1)、常用注解

  • @Api:修饰整个类,描述 Controller 的作用
  • @ApiOperation:描述一个类的一个方法,或者说一个接口
  • @ApiParam:单个参数描述
  • @ApiModel:用对象来接收参数
  • @ApiProperty:用对象接收参数时,描述对象的一个字段
  • @ApiResponse:HTTP 响应其中 1 个描述
  • @ApiResponses:HTTP 响应整体描述
  • @ApiIgnore:使用该注解忽略这个API
  • @ApiError:发生错误返回的信息
  • @ApiImplicitParam:一个请求参数
  • @ApiImplicitParams:多个请求参数

2)、@Api

说明:用在请求的类上,表示对类的说明

常用参数
tags=“说明该类的作用,非空时将覆盖 value 的值”
value=“描述类的作用”

其他参数
description 对 api 资源的描述,在 1.5 版本后不再支持
basePath 基本路径可以不配置,在 1.5 版本后不再支持
position 如果配置多个 Api 想改变显示的顺序位置,在 1.5 版本后不再支持
produces 设置 MIME 类型列表(output),例:“application/json, application/xml”,默认为空
consumes 设置 MIME 类型列表(input),例:“application/json, application/xml”,默认为空
protocols 设置特定协议,例:http, https, ws, wss
authorizations 获取授权列表(安全声明),如果未设置,则返回一个空的授权值。
hidden 默认为 false,配置为 true 将在文档中隐藏

@Api(tags="登录请求")
@Controller
public class LoginController {

}

3)、@ApiOperation

说明:用在请求的方法上,说明方法的用途、作用

常用参数
value=“说明方法的用途、作用”
notes=“方法的备注说明”

其他参数
tags 操作标签,非空时将覆盖value的值
response 响应类型(即返回对象)
responseContainer 声明包装的响应容器(返回对象类型)。有效值为 “List”, “Set” or “Map”。
responseReference 指定对响应类型的引用。将覆盖任何指定的response()类
httpMethod 指定HTTP方法,“GET”, “HEAD”, “POST”, “PUT”, “DELETE”, “OPTIONS” and “PATCH”
position 如果配置多个Api 想改变显示的顺序位置,在1.5版本后不再支持
nickname 第三方工具唯一标识,默认为空
produces 设置MIME类型列表(output),例:“application/json, application/xml”,默认为空
consumes 设置MIME类型列表(input),例:“application/json, application/xml”,默认为空
protocols 设置特定协议,例:http, https, ws, wss。
authorizations 获取授权列表(安全声明),如果未设置,则返回一个空的授权值。
hidden 默认为false, 配置为true 将在文档中隐藏
responseHeaders 响应头列表
code 响应的HTTP状态代码。默认 200
extensions 扩展属性列表数组

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登录检测", notes="根据用户名、密码判断该用户是否存在")
public UserModel login(@RequestParam(value = "name", required = false) String account,
                       @RequestParam(value = "pass", required = false) String password){

}

4)、@ApiImplicitParams

说明:用在请求的方法上,表示一组参数说明;@ApiImplicitParam:用在 @ApiImplicitParams 注解中,指定一个请求参数的各个方面

常用参数
name:参数名,参数名称可以覆盖方法参数名称,路径参数必须与方法参数一致
value:参数的汉字说明、解释
required:参数是否必须传,默认为 false (路径参数必填)
paramType:参数放在哪个地方
header 请求参数的获取:@RequestHeader
query 请求参数的获取:@RequestParam
path(用于 restful 接口)–> 请求参数的获取:@PathVariable
body(不常用)
form(不常用)
dataType:参数类型,默认 String,其它值 dataType=“Integer”
defaultValue:参数的默认值

其他参数(@ApiImplicitParam):

allowableValues 限制参数的可接受值。1.以逗号分隔的列表 2.范围值 3.设置最小值/最大值
access 允许从API文档中过滤参数。
allowMultiple 指定参数是否可以通过具有多个事件接受多个值,默认为 false
example 单个示例
examples 参数示例。仅适用于 BodyParameters

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登录检测", notes="根据用户名、密码判断该用户是否存在")
@ApiImplicitParams({
    @ApiImplicitParam(name = "name", value = "用户名", required = false, paramType = "query", dataType = "String"),
    @ApiImplicitParam(name = "pass", value = "密码", required = false, paramType = "query", dataType = "String")
})
public UserModel login(@RequestParam(value = "name", required = false) String account,
@RequestParam(value = "pass", required = false) String password){}

5)、@ApiModel

说明:用于响应类上,表示一个返回响应数据的信息(这种一般用在 POST 创建的时候,使用 @RequestBody 这样的场景,请求参数无法使用 @ApiImplicitParam 注解进行描述的时候);@ApiModelProperty:用在属性上,描述响应类的属性

其他参数(@ApiModelProperty):
value 此属性的简要说明。
name 允许覆盖属性名称
allowableValues 限制参数的可接受值。1.以逗号分隔的列表 2.范围值 3.设置最小值/最大值
access 允许从 API 文档中过滤属性。
notes 目前尚未使用。
dataType 参数的数据类型。可以是类名或者参数名,会覆盖类的属性名称。
required 参数是否必传,默认为 false
position 允许在类中对属性进行排序。默认为 0
hidden 允许在 Swagger 模型定义中隐藏该属性。
example 属性的示例。
readOnly 将属性设定为只读。
reference 指定对相应类型定义的引用,覆盖指定的任何参数值

@ApiModel(value="用户登录信息", description="用于判断用户是否存在")
public class UserModel implements Serializable{

   private static final long serialVersionUID = 1L;

   /**
    * 用户名
    */
   @ApiModelProperty(value="用户名")
   private String account;

   /**
     * 密码
     */
    @ApiModelProperty(value="密码")
   private String password;
}
@ApiModel
public class User {

    @ApiModelProperty(value = "用户id")
    private Integer id;

    @ApiModelProperty(value = "用户名")
    private String username;

    @ApiModelProperty(value = "用户地址")
    private String address;

    //getter/setter
}

6)、@ApiResponses

说明:用在请求的方法上,表示一组响应;@ApiResponse:用在 @ApiResponses 中,一般用于表达一个错误的响应信息

常用参数
code:数字,例如 400
message:信息,例如 “请求参数没填好”
response:抛出异常的类

@ResponseBody
@PostMapping(value="/update/{id}")
@ApiOperation(value = "修改用户信息",notes = "打开页面并修改指定用户信息")
@ApiResponses({
    @ApiResponse(code=400,message="请求参数没填好"),
    @ApiResponse(code=404,message="请求路径没有或页面跳转路径不对")
})
public JsonResult update(@PathVariable String id, UserModel model){

}

7)、@ApiParam

说明:用在请求方法中,描述参数信息

常用参数
name:参数名称,参数名称可以覆盖方法参数名称,路径参数必须与方法参数一致
value:参数的简要说明。
defaultValue:参数默认值
required:属性是否必填,默认为 false (路径参数必须填)

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登录检测", notes="根据用户名、密码判断该用户是否存在")
public UserModel login(@ApiParam(name = "model", value = "用户信息Model") UserModel model){

}

其他参数
allowableValues 限制参数的可接受值。1.以逗号分隔的列表 2.范围值 3.设置最小值/最大值
access 允许从 API 文档中过滤参数。
allowMultiple 指定参数是否可以通过具有多个事件接受多个值,默认为 false
hidden 隐藏参数列表中的参数。
example 单个示例
examples 参数示例。仅适用于 BodyParameters

@ResponseBody
@PostMapping(value="/login")
@ApiOperation(value = "登录检测", notes="根据用户名、密码判断该用户是否存在")
public UserModel login(@ApiParam(name = "name", value = "用户名", required = false) @RequestParam(value = "name", required = false) String account,
    @ApiParam(name = "pass", value = "密码", required = false) @RequestParam(value = "pass", required = false) String password){}

4、注解及参数总结

1)、相关注解

关于其中@Api和@ApiOperation等的详细解释如下:

作用范围 API 使用位置
对象属性 @ApiModelProperty 用于出入参数对象的字段上
协议集描述 @Api 用于Controller类上
协议描述 @ApiOperation 用在Controller的方法上
Response集 @ApiResponses 用在controller的方法上
Response @ApiResponse 用在 @ApiResponses里边
非对象参数集 @ApiImplicitParams 用在controller的方法上
非对象参数描述 @ApiImplicitParam 用在@ApiImplicitParams的方法里边
描述返回对象的意义 @ApiModel 用在返回对象类上

2)、相关参数

关于参数的详细解释

属性 取值 作用
paramType 查询参数类型
path 以地址的形式提交数据
query 直接跟参数完成自动映射赋值
body 以流的形式提交 仅支持POST
header 参数在request headers 里边提交
form 以form表单的形式提交 仅支持POST
dataType 参数的数据类型 只作为标志说明,并没有实际验证
int
Long
String
name 接收参数名(必须与方法中参数名一致)
value 接收参数的意义描述(描述信息)
required 参数是否必填
true 必填
false 非必填
defaultValue 默认值

5、默认错误的处理

在刷新swagger页面时,一般情况会有下面的错误出现:

java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_05]
	at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_05]
	at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_05]
	at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_05]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_05]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_05]
	at java.lang.reflect.Method.invoke(Method.java:483) ~[na:1.8.0_05]
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:689) [jackson-databind-2.11.4.jar:2.11.4]
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) 

这实际上是swagger的swagger-models中有一个错误导致的,可以通过升级swagger-models的版本来实现,具体的方法就是使用下面的依赖来替换原来的依赖:

		<!--	swagger-->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
				<exclusions>
					<exclusion>
						<groupId>io.swagger</groupId>
						<artifactId>swagger-models</artifactId>
					</exclusion>
				</exclusions>
		</dependency>
		<!-- https://mvnrepository.com/artifact/io.swagger/swagger-models -->
		<dependency>
			<groupId>io.swagger</groupId>
			<artifactId>swagger-models</artifactId>
			<version>1.5.22</version>
		</dependency>

		<dependency>
			<groupId>com.github.xiaoymin</groupId>
			<artifactId>swagger-bootstrap-ui</artifactId>
			<version>1.9.6</version>
		</dependency>

通过以上设置以后,就再也不会出现以上错误了,而且老的界面springfox-swagger-ui也升级为了swagger-bootstrap-ui的新的前端界面库,让swagger的页面更漂亮了。由于使用新的界面,所以访问swagger的地址也改变了,地址如下:

http://localhost:8080/doc.html

新界面的swagger截图如下:

微服务接口工具Swagger2,springcloud,spring boot,后端

 点赞 0  收藏 0  送礼 0

参码踪 2022 津ICP备20001223号-1文章来源地址https://www.toymoban.com/news/detail-796211.html

到了这里,关于微服务接口工具Swagger2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot——Swagger2 接口规范

    优质博文:IT-BLOG-CN 如今, REST 和微服务已经有了很大的发展势头。但是, REST 规范中并没有提供一种规范来编写我们的对外 REST 接口 API 文档。每个人都在用自己的方式记录 api 文档,因此没有一种标准规范能够让我们很容易的理解和使用该接口。我们需要一个共同的规范和

    2024年02月04日
    浏览(34)
  • Java技术-接口文档-Swagger2&Swagger3&接口文档UI整合

    目录 一、Swagger2完整用法 1.POM依赖 2.接口类 3.实现类 4.托管静态资源 5.接口文档配置 6.生产环境关闭接口文档 7.Swagger3页面效果 二、Swagger3完整用法 三、Swagger整合Knife4jUi 1.POM依赖 2.接口类 3.实现类 4.托管静态资源 5.接口文档配置 6.生产环境关闭接口文档 四、注释和参数讲解

    2024年02月16日
    浏览(36)
  • SpringBoot使用Swagger2生成接口文档

            通过一下配置,将Swagger2自动配置进SpringBoot中             通过@Api注解和@ApiOperation注解说明模块作用及接口说明。         通过访问路径http://localhost:8088/doc.html,说明一下8088是我SpringBoot的端口号,你们填你们自己的,不同版本的Swagger访问的路径是不一样的。

    2024年01月25日
    浏览(35)
  • Spring Boot入门(16):Spring Boot 整合 Swagger-UI 实现在线API接口文档 | 超级详细,建议收藏

            在现代化的软件开发中,API接口文档的编写和管理是非常重要的一环。而Swagger-UI作为一款优秀的API文档生成工具,可以帮助开发者轻松地生成并管理API接口文档,提高开发效率和代码质量。在本文中,我们将介绍如何使用Spring Boot框架和Swagger-UI工具实现在线API接

    2024年02月16日
    浏览(42)
  • 记录spring boot项目中新增模块在swagger中不显示新增接口的问题

    1、先排查新增接口是否添加了对应的@RequestMapping和@Controller注解 ; 2、若第一步所需注解均已添加,则排查新增模块的父级模块pom中是否新增了对应新加的模块;【红框中为新增的子模块】 3、排查 父级模块的父级模块的pom文件中是否添加了新增的模块依赖。 4、排查启动类

    2024年02月05日
    浏览(46)
  • 【Spring Boot】SpringBoot 2.6.6 集成 SpringDoc 1.6.9 生成swagger接口文档

    之前常用的SpringFox在2020年停止更新了,新项目集成SpringFox出来一堆问题,所以打算使用更活跃的SpringDoc,这里简单介绍一下我这边SpringBoot2.6.6集成SpringDoc1.6.9的demo。 官网链接 maven为例: 代码如下(示例): 默认路径: UI界面 http://localhost:9527/swagger-ui/index.html json界面 http:/

    2024年02月09日
    浏览(29)
  • SpringBoot - 集成Swagger2、Knife4j接口文档/升级版swagger-bootstrap-ui配置以及账号密码登录

    请注意@Configuration和@EnableSwagger2注解。这两个注解分别表示这是一个配置类,以及启用了Swagger 2。只有在这两个注解都存在的情况下,Swagger才会被正确启用。 如果您的项目使用的是Swagger 3(即OpenAPI 3),则配置文件可能如下所示: 访问 http://localhost:8080/swagger-ui.html (假设项

    2024年02月08日
    浏览(32)
  • Spring Cloud Gateway集成Swagger实现微服务接口文档统一管理及登录访问

    本文将介绍如何在 Spring Cloud 微服务中使用 Swagger 网关来统一管理所有微服务的接口文档,并通过 Spring Security 实现登录后才能访问 Swagger 文档,以确保接口数据的安全访问。 在开始之前,需要假设你已经完成了 Spring Cloud Gateway 的相关配置,并且已经了解了基本的网关配置知

    2024年02月05日
    浏览(33)
  • Swagger2基本使用

    前言 接口文档对于前后端开发人员都十分重要。尤其近几年流行前后端分离后接口文档又变成重中之重。接口文档固然重要,但是由于项目周期等原因后端人员经常出现无法及时更新导致前端人员抱怨接口文档和实际情况不一致。 很多人员会抱怨别人写的接口文档不规范,

    2024年02月07日
    浏览(28)
  • Springboot+swagger2

    1.swagger配置 2.请求路径  http://localhost:8006/swagger2/swagger-ui.html 3.Swagger2 注解整理  4.代码示例          

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包