第六篇:Spring Boot集成Swagger2构建RESTful API文档

版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:https://blog.csdn.net/mr_chenjie_c。 https://blog.csdn.net/Mr_Chenjie_C/article/details/84891549

由于Spring Boot有快速开发、便捷部署等特性,所以很大一部分Spring Boot的用户会用来构建RESTfulAPI。而我们构建RESTfulAPI的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。

这样一来,我们的RESTfulAPI就有可能要面对多个开发人员或多个开发团队:ios开发、Android开发或是Web开发等。为了减少与其他团队开发期间的频繁沟通成本,传统做法我们会创建一份RESTfulAPI文档来记录所有接口细节,然而这样的做法有以下几个问题:

  • 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下游的抱怨声不绝于耳。
  • 随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。

为了解决上面这样的问题,本文将介绍RESTfulAPI的重磅好伙伴Swagger2,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大的RESTfulAPI文档。它在减少我们创建文档的工作量的同时,又将说明内容整合入代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个RESTfulAPI。

下面来具体介绍,如何在Spring Boot中使用Swagger2。

引入依赖

<dependency>
   <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.2.2</version>
</dependency>

写配置类

@Configuration
@EnableSwagger2
public class Swagger2 {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.chenjie.springboot.learn.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Spring Boot使用Swagger构建API文档")
                .description("简单优雅的RESTful风格,https://blog.csdn.net/Mr_Chenjie_C")
                .termsOfServiceUrl("https://blog.csdn.net/Mr_Chenjie_C")
                .version("1.0")
                .build();
    }
}

如上代码所示

  • @Configuration注解,表明它是一个配置类,让Spring来加载该类;
  • @EnableSwagger2注解来启用Swagger;
  • 通过createRestApi()创建Docket的Bean之后,apiInfo()用来创建该API的基本信息(这些基本信息会展现在文档页面中);
  • 再通过select()返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现;

本例采用指定扫描的包路径来定义,Swagger会扫描该包下所有Controller定义的API,并产生文档内容(除了被@ApiIgnore指定的请求)。

相关注解

swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。

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

添加文档内容

@RestController
@RequestMapping(value="/users")
public class UserController {

    static Map<Long, User> users = Collections.synchronizedMap(new HashMap<Long, User>());

    @ApiOperation(value="获取用户列表", notes="")
    @GetMapping(value={""})
    public List<User> getUserList() {
        return new ArrayList<User>(users.values());
    }

    @ApiOperation(value="创建用户", notes="根据User对象创建用户")
    @ApiImplicitParam(name = "user", value = "用户实体user", required = true, dataType = "User")
    @PostMapping(value="/add")
    public String postUser(@RequestBody User user) {
        try {
            users.put(user.getId(), user);
        } catch (Exception e) {
            e.printStackTrace();
            return "fail";
        }
        return "success";
    }

    @ApiOperation(value="获取用户详细信息", notes="根据url中的id来获取用户详细信息")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
    @GetMapping(value="/{id}")
    public User getUser(@PathVariable Long id) {
        return users.get(id);
    }

    @ApiOperation(value="更新用户", notes="根据url中的id来指定更新对象,并根据传过来的user来更新用户信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),
            @ApiImplicitParam(name = "user", value = "用户实体user", required = true, dataType = "User")
    })
    @PutMapping(value="/{id}")
    public String put(@PathVariable Long id, @RequestBody User user) {
        try {
            User u = users.get(id);
            u.setName(user.getName());
            u.setAge(user.getAge());
            users.put(id, u);
        } catch (Exception e) {
            e.printStackTrace();
            return "fail";
        }
        return "success";
    }

    @ApiOperation(value="删除用户", notes="根据url中的id来指定删除对象")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
    @DeleteMapping(value="/{id}")
    public String delete(@PathVariable Long id) {
        try {
            users.remove(id);
        } catch (Exception e) {
            e.printStackTrace();
            return "fail";
        }
        return "success";
    }

    @ApiIgnore//使用该注解忽略这个API
    @GetMapping(value = "/hello")
    public String ignore() {
        return "hello";
    }
}

API文档访问

完成上述代码添加上,启动Spring Boot程序,访问:localhost:8080/swagger-ui.html就能看到swagger的页面。我们可以再点开具体的API请求,以POST类型的/users/add请求为例,可找到上述代码中我们配置的Notes信息以及参数user的描述信息,如下图所示。
在这里插入图片描述

API文档访问调试

在上图请求的页面中,我们看到user的Value是个输入框,Swagger除了查看接口功能外,还提供了调试测试功能。我们可以点击上图中右侧的Model Schema(黄色区域:它指明了User的数据结构),此时Value中就有了user对象的模板,我们只需要稍作修改,点击下方“Try it out!”按钮,即完成了一次请求调用!
在这里插入图片描述
此时,你也可以通过几个GET请求来验证之前的POST请求是否正确。
在这里插入图片描述

总结

跟编写接口文档的工作相比,我们增加的配置内容是非常少而且精简的,对于原有代码的侵入也在忍受范围之内。因此,在构建RESTfulAPI的同时,加入swagger来对API文档进行管理,是个不错的选择。

源码下载:https://github.com/chenjary/SpringBoot

猜你喜欢

转载自blog.csdn.net/Mr_Chenjie_C/article/details/84891549