Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。是一套流行的API框架,可以帮助开发人员快速构建API文档,还可以方便测试项目各项功能。

Swagger官网地址:https://swagger.io/

现在的项目大多是前后端分离,前后端沟通如果只依靠手写文档这种方式真的是很不方便,所以构建API文档的工作我们完全可以交给Swagger来做,节省时间,但是Swagger也有个缺点,就是代码侵入性比较强了,需要在代码中配置各种注解来实现。现在来看一下如何在Spring Boot中整合Swagger2。

第一步,构建一个Spring Boot基础项目,并添加maven依赖

<!--添加Swagger依赖 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.7.0</version>
</dependency>
<!--添加Swagger-UI依赖 -->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.7.0</version>
</dependency>

第二步,添加Swagger配置类,并使用@EnableSwagger2开启Swagger2

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;

/**
 * Swagger配置
 */
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(restApiInfo())
                .select()
                // 指定包名
                .apis(RequestHandlerSelectors.basePackage("com.curise.learning.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo restApiInfo() {
        return new ApiInfoBuilder()
                .title("springboot利用swagger2构建api文档")
                .description("简单优雅的restful风格")
                .termsOfServiceUrl("no terms of serviceUrl")
                .version("1.0")
                .build();
    }
}

注意:这里可以给不同的Controller指定不同的Bean,这里我就创建一个Bean了。

第三步,创建用户实体类和RestController并添加增删改查方法

public class User {
    private int id;
    private String name;
    private int age;

    public User(){

    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
@Api("restful风格的api示例")
@RestController
@RequestMapping("user")
public class RestfulController {

    private final static List<User> userList = new ArrayList<>();{
        userList.add(new User(1, "admin", 33));
        userList.add(new User(2, "jacks", 22));
    }

    @ApiOperation(value = "根据id获取用户",notes = "id必须是数字")
    @ApiImplicitParams({@ApiImplicitParam(name = "id",value = "用户id",required = true,paramType = "path")})
    @ApiResponses({@ApiResponse(code=400,message="id为空")})
    @GetMapping("{id}")
    public User get(@PathVariable("id") int id){
        Optional<User> op = userList.stream().filter( (u) -> u.getId() == id).findFirst();
        return op.orElse(null);
    }

    @ApiOperation("获取列表")
    @GetMapping("list")
    public List userList() {
        return userList;
    }

    @ApiOperation("新增用户")
    @PostMapping("save")
    public boolean save(User user) {
        return userList.add(user);
    }

    @ApiOperation("更新用户")
    @ApiImplicitParam(name = "user", value = "单个用户信息", dataType = "User")
    @PutMapping("update")
    public boolean update(User user) {
        return userList.remove(user) && userList.add(user);
    }

    @ApiOperation("批量删除")
    @ApiImplicitParam(name = "users", value = "N个用户信息", dataType = "List<User>")
    @DeleteMapping("delete")
    public boolean delete(@RequestBody List<User> users) {
        return userList.removeAll(users);
    }

}

第四步,启动Spring Boot项目,访问http://localhost:8080/swagger-ui.html

选择/user/{id} 进行简单的测试

关于Swagger的注解,这里介绍一下

@Api:用在请求的类上,表示对类的说明
            tags="说明该类的作用,可以在UI界面上看到的注解"
            value="该参数没什么意义,在UI界面上也看到,所以不需要配置"

示例:@Api(tags="用户Controller")


@ApiOperation:用在请求的方法上,说明方法的用途、作用
            value="说明方法的用途、作用"
            notes="方法的备注说明"

示例:@ApiOperation(value="用户注册",notes="手机号、密码都是必输项,年龄随边填,但必须是数字")


@ApiImplicitParams:用在请求的方法上,表示一组参数说明
            @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面
                       name:参数名
                       value:参数的汉字说明、解释
                       required:参数是否必须传
                       paramType:参数放在哪个地方
                                  · header --> 请求参数的获取:@RequestHeader
                                  · query --> 请求参数的获取:@RequestParam
                                  · path(用于restful接口)--> 请求参数的获取:@PathVariable
                                  · body(不常用)
                                  · form(不常用)       
                     dataType:参数类型,默认String,其它值dataType="Integer"       
                     defaultValue:参数的默认值
示例:

@ApiImplicitParams({
           @ApiImplicitParam(name="mobile",value="手机号",required=true,paramType="form"),
           @ApiImplicitParam(name="password",value="密码",required=true,paramType="form"),
           @ApiImplicitParam(name="age",value="年龄",required=true,paramType="form",dataType="Integer")
})


@ApiResponses:用在请求的方法上,表示一组响应
           @ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
                    code:数字,例如400
                    message:信息,例如"请求参数没填好"
                    response:抛出异常的类
示例:

@ApiResponses({
            @ApiResponse(code=400,message="请求参数不对"),
            @ApiResponse(code=404,message="请求路径不对")
})


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

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;

@ApiModel(description= "返回响应数据")
public class Rest implements Serializable{

	@ApiModelProperty(value = "状态码")
	private Integer code;
	@ApiModelProperty(value = "信息")
	private String message;
	@ApiModelProperty(value = "返回对象")
	private Object data;
	/* getter/setter */
}

中文界面定制

到现在已经成功整合Swagger2了,但是页面里都是英文,我们可以定制一个中文界面

在resources目录下创建META-INF.resources目录并在META-INF.resources目录下创建swagger-ui.html文件

swagger-ui.html文件内容

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Swagger UI</title>
    <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-32x32.png" sizes="32x32"/>
    <link rel="icon" type="image/png" href="webjars/springfox-swagger-ui/images/favicon-16x16.png" sizes="16x16"/>
    <link href='webjars/springfox-swagger-ui/css/typography.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='webjars/springfox-swagger-ui/css/reset.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='webjars/springfox-swagger-ui/css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
    <link href='webjars/springfox-swagger-ui/css/reset.css' media='print' rel='stylesheet' type='text/css'/>
    <link href='webjars/springfox-swagger-ui/css/print.css' media='print' rel='stylesheet' type='text/css'/>

    <script src='webjars/springfox-swagger-ui/lib/object-assign-pollyfill.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/jquery-1.8.0.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/jquery.slideto.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/jquery.wiggle.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/jquery.ba-bbq.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/handlebars-4.0.5.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/lodash.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/backbone-min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/swagger-ui.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/highlight.9.1.0.pack.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/highlight.9.1.0.pack_extended.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/jsoneditor.min.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/marked.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lib/swagger-oauth.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/springfox.js' type='text/javascript'></script>

    <!--国际化操作:选择中文版 -->
    <script src='webjars/springfox-swagger-ui/lang/translator.js' type='text/javascript'></script>
    <script src='webjars/springfox-swagger-ui/lang/zh-cn.js' type='text/javascript'></script>

</head>

<body class="swagger-section">
<div id='header'>
    <div class="swagger-ui-wrap">
        <a id="logo" href="http://swagger.io"><img class="logo__img" alt="swagger" height="30" width="30" src="webjars/springfox-swagger-ui/images/logo_small.png" /><span class="logo__title">swagger</span></a>
        <form id='api_selector'>
            <div class='input'>
                <select id="select_baseUrl" name="select_baseUrl"></select>
            </div>
            <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
            <div id='auth_container'></div>
            <div class='input'><a id="explore" class="header__btn" href="#" data-sw-translate>Explore</a></div>
        </form>
    </div>
</div>

<div id="message-bar" class="swagger-ui-wrap" data-sw-translate> </div>
<div id="swagger-ui-container" class="swagger-ui-wrap"></div>
</body>
</html>

再次重启项目就好了,如果页面没有变化就Ctrl+F5强制刷新一下。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐