• 由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下游的抱怨声不绝于耳。
  • 随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。

 

下面来具体介绍,如果在Spring Boot中使用Swagger2。首先,我们需要一个Spring Boot实现的RESTful API工程,若您没有做过这类内容,建议先阅读
Spring Boot构建一个较为复杂的RESTful APIs和单元测试。

pom.xml中加入Swagger2的依赖

 
1
2
3
4
5
6
7
8
9
10
11
 
 
<dependency>
<groupId>io.springfox </groupId>
<artifactId>springfox-swagger2 </artifactId>
<version>2.2.2 </version>
</dependency>
<dependency>
<groupId>io.springfox </groupId>
<artifactId>springfox-swagger-ui </artifactId>
<version>2.2.2 </version>
</dependency>

如上代码所示,通过@Configuration注解,让Spring来加载该类配置。再通过@EnableSwagger2注解来启用Swagger2。

在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。如下所示,我们通过@ApiOperation注解来给API增加说明、通过@ApiImplicitParams@ApiImplicitParam注解来给参数增加说明。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
 
@RestController
@RequestMapping(value= "/users") // 通过这里配置使下面的映射都在/users下,可去除
publicclassUserController{
 
static Map<Long, User> users = Collections.synchronizedMap( new HashMap<Long, User>());
 
@ApiOperation(value= "获取用户列表", notes= "")
@RequestMapping(value={ ""}, method=RequestMethod.GET)
public List<User> getUserList(){
List<User> r = new ArrayList<User>(users.values());
return r;
}
 
@ApiOperation(value= "创建用户", notes= "根据User对象创建用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
@RequestMapping(value= "", method=RequestMethod.POST)
public String postUser(@RequestBody User user){
users.put(user.getId(), user);
return"success";
}
 
@ApiOperation(value= "获取用户详细信息", notes= "根据url的id来获取用户详细信息")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
@RequestMapping(value= "/{id}", method=RequestMethod.GET)
public User getUser(@PathVariable Long id){
return users.get(id);
}
 
@ApiOperation(value= "更新用户详细信息", notes= "根据url的id来指定更新对象,并根据传过来的user信息来更新用户详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long"),
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataType = "User")
})
@RequestMapping(value= "/{id}", method=RequestMethod.PUT)
public String putUser(@PathVariable Long id, @RequestBody User user){
User u = users.get(id);
u.setName(user.getName());
u.setAge(user.getAge());
users.put(id, u);
return"success";
}
 
@ApiOperation(value= "删除用户", notes= "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Long")
@RequestMapping(value= "/{id}", method=RequestMethod.DELETE)
public String deleteUser(@PathVariable Long id){
users.remove(id);
return"success";
}
 
}

API文档访问与调试

相比为这些接口编写文档的工作,我们增加的配置内容是非常少而且精简的,对于原有代码的侵入也在忍受范围之内。因此,在构建RESTful API的同时,加入swagger来对API文档进行管理,是个不错的选择。

 

  • Swagger官方网站

 

Spring Boot中使用Swagger2构建强大的RESTful API文档_SpringBoot