美文网首页
Springboot 项目集成Swagger

Springboot 项目集成Swagger

作者: qinghaihu | 来源:发表于2020-03-19 23:15 被阅读0次

相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的
接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及
更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这
个接口文档对于程序员来说,就跟注释一样,经常会抱怨别人写的代码没有写注释,然而自
己写起代码起来,最讨厌的,也是写注释。所以仅仅只通过强制来规范大家是不够的,随着
时间推移,版本迭代,接口文档往往很容易就跟不上代码了。

Swagger2 的出现就是为了从根本上解决上述问题。它作为一个规范和完整的框架,可以用
于生成、描述、调用和可视化 RESTful风格的Web服务:

1. 接口文档在线自动生成,文档随接口变动实时更新,节省维护成本

2. 支持在线接口测试,不依赖第三方工具

集成Swagger步骤

1 项目pom文件引入以下包:

io.springfox:springfox-swagger2:2.6.1

io.springfox:springfox-swagger-ui:2.6.1

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

2 启动类加添加swagger注解 @EnableSwagger2,开启swagger功能

@SpringBootApplication
@EnableSwagger2
public class SpringbootSwaggerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootSwaggerApplication.class, args);
    }

}

2 创建swagger配置类

@Configuration
@EnableSwagger2
@ConditionalOnProperty(prefix = "swagger2",value = {"enable"},havingValue = "true")
public class Swagger2Config {

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

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("Springboot利用Swagger构建api文档")
                .description("Swagger2整合测试用例")
                .termsOfServiceUrl("http://www.cmac.com")
                .version("1.0")
                .build();
    }
}

注解@Configuration表明这是一个配置类,@EnableSwagger2 开启Swagger功能,
@ConditionalOnProperty注解表明这是个条件配置类,只有当application.yml文件中
配置了swagger.enable该参数,并且值为true,该配置类才会生效。通过该条件注解,可以
轻松实现测试环境开启,生产环境关闭wagger效果。

成员方法 createRestApi 函数创建 Docket的Bean之后,apiInfo()用来创建该Api
的基本信息(这些基本信息会展现在文档页面中)。select()函数返回一个ApiSelectorBuilder
实例用来控制哪些接口暴露给Swagger来展现,本例采用指定扫描的包路径来定义,Swagger 会扫描
该包下所有 Controller 定义的API,并产生文档内容(除了那些被 @ApiIgnore 指定的请求。

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

@RestController
@RequestMapping("/user")
@Api(value = "用户服务",description = "用户的基本操作")
public class UserController {

    @ApiOperation(value = "用户列表服务",notes = "查詢所有用戶的列表信息")
    @RequestMapping(value = "/list",method = RequestMethod.GET)
    public List<User> list() {
        List<User> userList = new ArrayList<>();
        for(String key: DataNode.users.keySet()) {
            userList.add(DataNode.users.get(key));
        }
        return userList;
    }

    @ApiOperation(value ="根据用户ID查询用户信息",notes="根据url的id来获取用户详细信息")
    @ApiImplicitParam(name="userId",value = "用户ID",required = true,dataType ="Integer",paramType = "path")
    @RequestMapping(value = "/findOneById/{userId}",method = RequestMethod.GET)
    public User findOneById(@PathVariable("userId") Integer userId) {
        for(String key: DataNode.users.keySet()) {
            User user = DataNode.users.get(key);
            if(user.getUserId() == userId) {
                return user;
            }
        }

        return null;
    }

    @ApiOperation(value = "根据用户名获取用户信息")
    @RequestMapping(value = "/findOneUserName/{userName}",method = RequestMethod.GET)
    @ApiImplicitParam(name = "userName",value = "用户名",required = true,dataType = "String",paramType = "path")
    public User findOneByName( @PathVariable("userName") String userName) {
        for(String key: DataNode.users.keySet()) {
            User user = DataNode.users.get(key);
            if(user.getUserName().equals(userName)) {
                return user;
            }
        }

        return null;
    }

    @ApiOperation(value = "根据用户名获取用户信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "int", paramType = "query"),
            @ApiImplicitParam(name = "userName", value = "用户名称", required = true, dataType = "String", paramType = "query")
    }
    )
    @RequestMapping(value = "/findOneByIdAndName",method = RequestMethod.GET)
    public User findOneByIdAndName(@RequestParam String userName, @RequestParam Integer id) {
        for(String key: DataNode.users.keySet()) {
            User user = DataNode.users.get(key);
            if(user.getUserName().equals(userName) && id==user.getUserId()) {
                return user;
            }
        }

        return null;
    }

    @ApiOperation(value = "根据查询条件获取用户信息")
    @RequestMapping(value = "/findOneByCondition",method = RequestMethod.GET)
    public User findOneByCondition(UserCondition userCondition) {
        for(String key: DataNode.users.keySet()) {
            User user = DataNode.users.get(key);
            if(user.getUserName().equals(userCondition.getUserName()) &&
                    user.getUserId()==userCondition.getUserId()) {
                Car car = new Car();
                car.setName("奥迪");
                user.setCar(car);
                return user;
            }
        }
        return null;
    }
}

本接口示例了 @ApiOperation 和 @ApiImplicitParam 两个注解的使用。

Swagger 通过注解定制接口对外展示的信息,这些信息包括接口名、请求方法、参数、返回信息等。更多注解类型:

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

5 启动 SpringBoot 应用
SpringBoot 启动成功后,访问 http://localhost:8080/swagger-ui.html

展开类维度的接口列表,如 user-controller,页面会列出该类中定义的所有接口。点击任意接口,
可查看该接口的 url 路径、请求类型、参数描述和返回码说明等信息。


测试接口展示.png

录入请求参数,点击中间的的 “Try it out!”按钮,完成一次请求调用!


执行接口.png

工程源码地址:https://github.com/zhanglianzhong/springboot-swagger.git

相关文章

网友评论

      本文标题:Springboot 项目集成Swagger

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