前言
swagger,中文“拽”的意思。它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,
而且还提供了在线文档的测试。另外swagger很容易构建restful风格的api。
一、swagger概述
swagger是一组围绕openapi规范构建的开源工具,可帮助设计、构建、记录和使用rest api。
简单说下,它的出现就是为了方便进行测试后台的restful形式的接口,实现动态的更新,当我们在后台的接口
修改了后,swagger可以实现自动的更新,而不需要认为的维护这个接口进行测试。
二、swagger常用注解
swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息的等等。
- @api:修饰整个类,描述controller的作用
- @apioperation:描述一个类的一个方法,或者说一个接口
- @apiparam:单个参数描述
- @apimodel:用对象来接收参数
- @apiproperty:用对象接收参数时,描述对象的一个字段
- @apiresponse:http响应其中1个描述
- @apiresponses:http响应整体描述
- @apiignore:使用该注解忽略这个api
- @apierror :发生错误返回的信息
- @apiparamimplicitl:一个请求参数
- @apiparamsimplicit 多个请求参数
三、springboot整合swagger
3.1 添加依赖
1
2
3
4
5
6
7
8
9
10
|
<dependency> <groupid>io.springfox</groupid> <artifactid>springfox-swagger2</artifactid> <version> 2.7 . 0 </version> </dependency> <dependency> <groupid>io.springfox</groupid> <artifactid>springfox-swagger-ui</artifactid> <version> 2.7 . 0 </version> </dependency> |
3.2 添加swaggerconfiguration
通过@configuration注解,表明它是一个配置类,@enableswagger2开启swagger2。
apiinfo()配置一些基本的信息。apis()指定扫描的包会生成文档。
再通过createrestapi函数创建docket的bean之后,apiinfo()用来创建该api的基本信息(这些基本信息会
展现在文档页面中)。select()函数返回一个apiselectorbuilder实例用来控制哪些接口暴露给swagger来
展现,本例采用指定扫描的包路径来定义,swagger会扫描该包下所有controller定义的api,并产生文档内容
(除了被@apiignore指定的请求)。
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
53
|
package com.lance.learn.springbootswagger.configuration; 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.service.contact; import springfox.documentation.spi.documentationtype; import springfox.documentation.spring.web.plugins.docket; import springfox.documentation.swagger2.annotations.enableswagger2; /** * @author lance(zyh) * @function swagger启动配置类 * @date 2018-07-09 21:24 */ @configuration @enableswagger2 public class swaggerconfiguration { /** * swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等 * @return */ @bean public docket createrestfulapi(){ return new docket(documentationtype.swagger_2) .pathmapping( "/" ) .select() .apis(requesthandlerselectors.basepackage( "com.lance.learn.springbootswagger.controller" )) //暴露接口地址的包路径 .paths(pathselectors.any()) .build(); } /** * 构建 api文档的详细信息函数,注意这里的注解引用的是哪个 * @return */ private apiinfo apiinfo(){ return new apiinfobuilder() //页面标题 .title( "spring boot 测试使用 swagger2 构建restful api" ) //创建人 .contact( new contact( "lanvetobigdata" , "http://www.cnblogs.com/zhangyinhua/" , "917484312@qq.com" )) //版本号 .version( "1.0" ) //描述 .description( "api 描述" ) .build(); } } |
3.3 controller文档内容
描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。
如下所示,我们通过@apioperation注解来给api增加说明、通过@apiimplicitparams、@apiimplicitparam
注解来给参数增加说明。
1)实例一
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
package com.lance.learn.springbootswagger.controller; import com.lance.learn.springbootswagger.bean.book; import io.swagger.annotations.apiimplicitparam; import io.swagger.annotations.apiimplicitparams; import io.swagger.annotations.apioperation; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.apiignore; import java.util.*; /** * @author lance(zyh) * @function * @date 2018-07-09 21:39 */ @restcontroller @requestmapping (value = "/bookcurd" ) public class bookcontroller { map< long , book> books = collections.synchronizedmap( new hashmap< long , book>()); @apioperation (value= "获取图书列表" , notes= "获取图书列表" ) @requestmapping (value={ "" }, method= requestmethod.get) public list<book> getbook() { list<book> book = new arraylist<>(books.values()); return book; } @apioperation (value= "创建图书" , notes= "创建图书" ) @apiimplicitparam (name = "book" , value = "图书详细实体" , required = true , datatype = "book" ) @requestmapping (value= "" , method=requestmethod.post) public string postbook( @requestbody book book) { books.put(book.getid(), book); return "success" ; } @apioperation (value= "获图书细信息" , notes= "根据url的id来获取详细信息" ) @apiimplicitparam (name = "id" , value = "id" , required = true , datatype = "long" ,paramtype = "path" ) @requestmapping (value= "/{id}" , method=requestmethod.get) public book getbook( @pathvariable long id) { return books.get(id); } @apioperation (value= "更新信息" , notes= "根据url的id来指定更新图书信息" ) @apiimplicitparams ({ @apiimplicitparam (name = "id" , value = "图书id" , required = true , datatype = "long" ,paramtype = "path" ), @apiimplicitparam (name = "book" , value = "图书实体book" , required = true , datatype = "book" ) }) @requestmapping (value= "/{id}" , method= requestmethod.put) public string putuser( @pathvariable long id, @requestbody book book) { book book1 = books.get(id); book1.setname(book.getname()); book1.setprice(book.getprice()); books.put(id, book1); return "success" ; } @apioperation (value= "删除图书" , notes= "根据url的id来指定删除图书" ) @apiimplicitparam (name = "id" , value = "图书id" , required = true , datatype = "long" ,paramtype = "path" ) @requestmapping (value= "/{id}" , method=requestmethod.delete) public string deleteuser( @pathvariable long id) { books.remove(id); return "success" ; } @apiignore //使用该注解忽略这个api @requestmapping (value = "/hi" , method = requestmethod.get) public string jsontest() { return " hi you!" ; } } |
2)实例二
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
53
54
55
56
57
58
59
60
61
62
63
|
package com.lance.learn.springbootswagger.controller; import com.lance.learn.springbootswagger.bean.user; import io.swagger.annotations.apiimplicitparam; import io.swagger.annotations.apiimplicitparams; import io.swagger.annotations.apioperation; import org.springframework.web.bind.annotation.*; import java.util.*; /** * @author lance(zyh) * @function * @date 2018-07-09 22:00 */ @restcontroller @requestmapping (value= "/users" ) public class userdetailcontroller { 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 = new user(); 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" ; } } |
3.4 web界面查看
四、项目代码地址
https://github.com/lancetobigdata/springbootlearning/tree/develop/springboot-swagger
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://www.cnblogs.com/zhangyinhua/p/9286391.html