美文网首页
越写悦快乐之Spring Boot项目如何集成Swagger A

越写悦快乐之Spring Boot项目如何集成Swagger A

作者: 韬声依旧在路上 | 来源:发表于2019-07-28 12:30 被阅读0次
Swagger API - 图片来自简书App

今天的越写悦快乐系列文章为大家带来Spring Boot项目如何集成Swagger API文档,让我们可以更快地和前端同事约定接口的信息并构建合适的产品或服务。做过Java Web开发的小伙伴肯定对Spring Boot不陌生,那么我们基于Spring Boot的项目如何接入API文档呢,今天的文章为大家带来Spring Boot项目如何集成Swagger API文档的文章,希望大家喜欢。

开发环境

  • Window 10.0.17763
  • Java 8.0.191
  • IntelliJI IDEA 2018.3

Maven 版本

distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip

Build 版本

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.1.6.RELEASE</version>
</plugin>

构建步骤

添加依赖

对于Spring Boot的项目我们只需要在POM文件的parent标签中加入以下内容即可。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath/>
</parent>

随后,我们在dependencies中添加Swagger相关依赖,POM文件的完整内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>me.weitao.app</groupId>
    <artifactId>api-tour</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>api-tour</name>
    <description>An API Tour for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-bean-validators</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.3</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启用页面认证

我们在application.properties文件中添加以下配置

# port
server.port=8518
# devtools
spring.devtools.add-properties=false
# swagger
swagger.production=false
swagger.basic.enable=true
swagger.basic.username=seaguard
swagger.basic.password=guard

添加Swagger配置

我们在创建Swagger2Config文件并继承WebMvcConfigurer,其文件内容如下。

package me.weitao.app.api.config;

import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Watony Weng
 */

@Slf4j
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class Swagger2Config implements WebMvcConfigurer {

    /**
     * 资源过滤器
     *
     * @param registry 资源仓库
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
           .apis(RequestHandlerSelectors.basePackage("me.weitao.app.api.modules"))
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(setHeaderToken());
    }

    /**
     * 创建API
     *
     * @return apiInfo 信息
     */
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("SeaGuard Restful APIs")
                .description("Restful 风格接口")
                .version("1.0.0")
                .build();
    }

    /**
     * 设置认证头信息
     *
     * @return Header信息
     */
    private List<Parameter> setHeaderToken() {
        ParameterBuilder builder = new ParameterBuilder();
        List<Parameter> parameters = new ArrayList<>();
        builder.name("X-Access-Token").description("token").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
        parameters.add(builder.build());
        return parameters;
    }

}

添加控制器注解

配置完成后,我们就可以基于@Api@ApiOperation等描述接口的信息,比如接口名称、接口参数、接口返回值等,我们给出用户控制器的文件内容,供大家参考,当然要是有什么更好的意见或建议欢迎@我。

package me.weitao.app.api.modules.system.controller;

import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import me.weitao.app.api.common.vo.Result;
import me.weitao.app.api.modules.system.model.UserLoginModel;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Watony Weng
 */

@RestController
@RequestMapping("/user")
@Api(tags = "用户模块")
@Slf4j
public class UserController {

    /**
     * 用户登录
     *
     * @param userLoginModel 用户登录模型
     * @return result 响应结果
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    @ApiOperation("登录接口")
    public Result<Object> login(@RequestBody UserLoginModel userLoginModel) {
        Result<Object> result = new Result<Object>();
        result.setSuccess(true);
        return result;
    }

    /**
     * 退出登录
     *
     * @param request  页面请求
     * @param response 页面响应
     * @return result 响应结果
     */
    @RequestMapping(value = "/logout", method = RequestMethod.POST)
    @ApiOperation("退出接口")
    public Result<Object> logout(HttpServletRequest request, HttpServletResponse response) {
        Result<Object> result = new Result<Object>();
        result.setSuccess(true);
        return result;
    }

}

添加模块注解

对于页面的请求或响应参数,我们可以使用一个对象来定义,这样的话我们可以灵活控制页面的业务逻辑,下面给出用户登录对象的内容。

package me.weitao.app.api.modules.system.model;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;

/**
 * 登录表单
 *
 * @author Watony Weng
 */
@ApiModel(value = "用户登录对象", description = "用户登录对象")
@Getter
@Setter
public class UserLoginModel {

    @ApiModelProperty(value = "账号")
    private String username;

    @ApiModelProperty(value = "密码")
    private String password;

    @ApiModelProperty(value = "验证码")
    private String captcha;

}

API验证

梳理完以上的配置后,我们就可以期待下面,然后使用浏览器打开http://localhost:8518/swagger-ui.html这个页面,第一次打开页面时需要输入配置文件中配置的账号和密码,登录成功后,我们就可以看到API接口的定义了。

文档生成 - 图片来自简书App

参考

个人收获及感想

通过以上知识点的梳理,我们知道了如何在代码中通过注解来声明API并通过Web的方式查看API接口,通过API接口我们可以轻松地规范前后端的请求规范,更能在接口升级的过程中即时感知接口的变化,让接口相关人员能够快速地响应业务的需求变更,更能加快项目或者产品的开飞机进度,让我们在不断迭代升级的过程中享受工作的乐趣,减少工作负担,更能腾出时间去陪伴家人,我相信可以通过分组、打标签的形式更能分类不同业务的API文档,为我们项目或者产品的多人协作提供有力的保障,也为大家业务沟通和推进提供一种更加通用的语言,让我们不再受困于不同编程语言的差异,享受接口语言带给我们的极致快感。希望大家保持学习的热情,构建更加有价值的产品或服务,为我们的客户创造更大的价值。

相关文章

网友评论

      本文标题:越写悦快乐之Spring Boot项目如何集成Swagger A

      本文链接:https://www.haomeiwen.com/subject/kmburctx.html