今天的越写悦快乐系列文章为大家带来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 版本
org.springframework.boot
spring-boot-maven-plugin
2.1.6.RELEASE
构建步骤
添加依赖
对于Spring Boot的项目我们只需要在POM文件的parent
标签中加入以下内容即可。
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
随后,我们在dependencies
中添加Swagger相关依赖,POM文件的完整内容如下:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
me.weitao.app
api-tour
0.0.1-SNAPSHOT
api-tour
An API Tour for Spring Boot
1.8
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
io.springfox
springfox-swagger2
2.9.2
io.springfox
springfox-swagger-ui
2.9.2
io.springfox
springfox-bean-validators
2.9.2
com.github.xiaoymin
swagger-bootstrap-ui
1.9.3
com.alibaba
fastjson
1.2.58
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
启用页面认证
我们在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 setHeaderToken() {
ParameterBuilder builder = new ParameterBuilder();
List 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
添加模块注解
对于页面的请求或响应参数,我们可以使用一个对象来定义,这样的话我们可以灵活控制页面的业务逻辑,下面给出用户登录对象的内容。
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接口的定义了。
参考
- springfox-swagger
- swagger-bootstrap-ui
个人收获及感想
通过以上知识点的梳理,我们知道了如何在代码中通过注解来声明API并通过Web的方式查看API接口,通过API接口我们可以轻松地规范前后端的请求规范,更能在接口升级的过程中即时感知接口的变化,让接口相关人员能够快速地响应业务的需求变更,更能加快项目或者产品的开飞机进度,让我们在不断迭代升级的过程中享受工作的乐趣,减少工作负担,更能腾出时间去陪伴家人,我相信可以通过分组、打标签的形式更能分类不同业务的API文档,为我们项目或者产品的多人协作提供有力的保障,也为大家业务沟通和推进提供一种更加通用的语言,让我们不再受困于不同编程语言的差异,享受接口语言带给我们的极致快感。希望大家保持学习的热情,构建更加有价值的产品或服务,为我们的客户创造更大的价值。