前言
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