暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用SwaggerUI生成API文档

Sumslack团队 2018-07-24
305

    在前文《对外Restful API接口平台的设计与实现》我们设计好了API,这些API最终交付给第三方开发公司(你提供的是一个类似开放平台)或公司内部的前端人员(你编写的是一个项目的后台服务,采用动静态分离)使用,那么后续我们就要考虑如何方便终端用户(第三方开发者或前端人员)使用呢,当然需要给这些API生成文档,标注下每个API的用户,并且能在这个平台上测试这些API,这时候SwaggerUI就要大显身手了,不管你是基于SpringBoot还是自己的Web框架,它都能帮到你,以下文章以SpringBoot为例,考虑以下几个问题:


  • 在平台上生成各个接口的使用文档,并且可以归类;

  • 应该支持markdown语法,以便我们更好的描述接口以及使用范围等;

  • 平台上应该能支持接口的调测,建立白名单机制,以便在API文档的Web页不需要进行验签;

  • 文档的生成应该是与代码无关的,可基于Java注解;


回归正题,下文给出以SpringBoot为例,解决上述问题:


首先我们解决屏蔽掉API文档平台(以下简称文档网)的验签,我们可以建立白名单机制,只要接口调用的来源方是文档网,我们就在切面里自动过滤掉验签:


如上代码,只需在环绕通知里,加个判断就可以,这样我们就能在文档网里测试所有接口了;

要在一个SpringBoot项目里生成文档,我们只需要加入Swagger的maven依赖就可以了,如下:

 1<properties>
2        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3        <swagger.version>2.9.2</swagger.version>
4</properties>    
5<dependencies>    
6  <dependency>
7            <groupId>io.springfox</groupId>
8            <artifactId>springfox-swagger2</artifactId>
9            <version>${swagger.version}</version>
10  </dependency>
11<!--如果不需要提供生成HTML网站,可以不用以下引入-->
12  <dependency>
13            <groupId>io.springfox</groupId>
14            <artifactId>springfox-swagger-ui</artifactId>
15            <version>${swagger.version}</version>
16  </dependency>
17</dependencies>

定义一个@Configuration的Spring依赖注入,初始化Swagger:

 1@Configuration
2@EnableSwagger2
3public class SwaggerConfig {
4    @Bean
5    public Docket createRestApi() {
6        Predicate<RequestHandler> predicate = new Predicate<RequestHandler>() {
7            @Override
8            // 哪些类和方法需要生成文档
9            public boolean apply(RequestHandler input) {
10                Class<?> declaringClass = input.declaringClass();
11                if (declaringClass == BasicErrorController.class)// 排除
12                    return false;
13                if(declaringClass.isAnnotationPresent(RestController.class) && declaringClass.isAnnotationPresent(ApiLevel.class))
14                    return true;
15                if(input.isAnnotatedWith(ResponseBody.class) && input.isAnnotatedWith(ApiLevel.class))
16                    return true;
17                return false;
18            }
19        };
20        return new Docket(DocumentationType.SWAGGER_2)
21                .apiInfo(apiInfo())
22                .useDefaultResponseMessages(false)
23                .select()
24                .apis(predicate)
25                .build();
26    }
27
28    private ApiInfo apiInfo() {
29        return new ApiInfoBuilder()
30            .title("宁波公司对外API服务")
31            .description("宁波对外Restful API服务:\r\n"
32                    + "- 接口的调用必须先申请高级API权限,请发邮件至  jacon.xue@sumscope.com 说明使用范围、用途等\r\n"
33                    + "- 所有接口必须经过验签,[点击这里查看详情](http://doc.sumslack.com/index.php?s=/5&page_id=122)")
34            .termsOfServiceUrl("http://www.sumslack.com")
35            .contact(new Contact("NBTeam","http://www.sumslack.com","jacon.xue@sumscope.com"))
36            .version("1.0.0")//版本
37            .build();
38    }
39}

给Controller的接口方法添加注解,以便生成文档,如以下是获取债券详情的接口文档说明:

 1    @RequestMapping(value="/detail/{bondKey}",method= {RequestMethod.GET})
2    @PostMapping("/detail/1.0.0/{bondKey}")
3    @ApiLevel(level=2)
4
5    @ApiOperation(value="获取债券详情", notes=DubboVersion.LEVEL_2 + "获取债券详细信息,包括剩余期限,全称等几十个信息")
6    @ApiImplicitParam(name = "bondKey", value = "债券唯一内部ID", required = true, paramType = "path",dataType="String",defaultValue="Z0000902014CORCSP01")
7    @ApiResponses(value = {
8            @ApiResponse(code = 200, message = "成功",response=BondBean.class)
,
9            @ApiResponse(code = 404, message = "找不到债券")})
10    public ResponseEntity<?> detail(@PathVariable String bondKey) {
11        ......
12        return ResponseEntity.ok(detail);
13    }

以下是SwaggerUI注解的使用说明:

使用SwaggerUI2生成文档

  • @Api
    :用在接口类上,通过tags可以将接口归类

  • @ApiOperation
    :用在接口类对应的方法上,说明方法的用途、作用
    value=说明方法的用途、作用
    notes=方法的备注说明,支持MD

  • @ApiImplicitParams
    :用在接口类的方法上,有多个参数说明时使用

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

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

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

  • @ApiModelProperty
    :用在属性上,描述响应类的属性

以下文章可能对你有用:

  1. 后台开发中的分库分表技术;

  2. 基于Netty的日志中心设计与实现;

  3. 基于SpringBoot的日志集中收集、微服务使用及切面的使用;

  4. Guava库常用工具类使用整理(一);

长按识别二维码关注我们



文章转载自Sumslack团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论