springboot中使用swagger
spring boot下建議使用:
https://github.com/SpringForAll/spring-boot-starter-swagger
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.7.1.RELEASE</version>
</dependency>
Swagger使用
1、在pom.xml中加入Swagger2的依賴
<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>
2 在Application.java同級建立Swagger2的配置類Swagger2。
@Configuration
@EnableSwagger2
public class Swagger2 {
public static final String SWAGGER_SCAN_BASE_PACKAGE = "abc.boot.examples.web";
public static final String VERSION = "1.0.0";
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))//api介面包掃描路徑
.paths(PathSelectors.any())//可以根據url路徑設定哪些請求加入文件,忽略哪些請求
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger2 介面文件示例")//設定文件的標題
.description("更多內容請關注:http://www.abc.com")//設定文件的描述->1.Overview
.version(VERSION)//設定文件的版本資訊-> 1.1 Version information
.contact(new Contact("ABC Boot", "http://www.abc.comt", ""))//設定文件的聯絡方式->1.2 Contact information
.termsOfServiceUrl("www.abc.com")//設定文件的License資訊->1.3 License information
.build();
}
}
3 註解使用
**@ApiOperation**
@ApiOperation(value="獲取使用者列表", notes="獲取所有使用者列表",produces = "application/json")
@RequestMapping(value="/users", method= RequestMethod.GET)
public List<User> getUserList() {
List<User> r = new ArrayList<User>(users.values());
return r;
}
**@ApiResponses**
@ApiOperation(value="獲取使用者詳細資訊", notes="根據url的id來獲取使用者詳細資訊",produces = "application/json")
// ApiResponses 增加返回結果的描述
@ApiResponses(value = {@ApiResponse(code = 405,message = "Invalid input",response = Integer.class)}) (1)
@ApiImplicitParam(name = "id",value = "使用者ID",dataType = "int",paramType = "path") (2)
@RequestMapping(value="/users/{id}", method= RequestMethod.GET)
public User getUser(@PathVariable Integer id) {
return users.get(id);
}
(1) 在預設Response的基礎上增加新的Response說明
(2) 使用ApiImplicitParam描述介面引數
**@ApiImplicitParams**
@ApiOperation(value="更新使用者名稱稱", notes="更新指定使用者的名稱")
@RequestMapping(value="/users/{id}", method= RequestMethod.POST)
@ApiImplicitParams({ (1)
@ApiImplicitParam(name = "id",value = "使用者ID",paramType = "path",dataType = "int"), (2)
@ApiImplicitParam(name = "userName",value = "使用者名稱稱",paramType = "form",dataType = "string")
})
public void updateUserName(@PathVariable Integer id,@RequestParam String userName){
User u = users.get(id);
u.setName(userName);
}
(1) 使用ApiImplicitParams描述多個引數
(2) 使用ApiImplicitParam時,需要指定paramType,這樣也便於swagger ui 生成引數的輸入格式。
paramType 有五個可選值 : path, query, body, header, form
**@ApiParam**
@ApiOperation(value="建立使用者-傳遞簡單物件", notes="傳遞簡單物件",produces = "application/json")
@RequestMapping(value="/users-1", method= RequestMethod.POST)
//可以不加ApiParam註解,需要給引數新增描述時可以使用這個註解,或者使用ApiImplicitParams註解 (1)
public Map postUser(@RequestParam String userName,@ApiParam("地址") @RequestParam(required = false) String address) {
User user = new User();
user.setId(Math.round(10));
user.setName(userName);
user.setAddress(address);
users.put(user.getId(), user);
return ImmutableMap.of("user",user);
}
(1) 使用ApiParam描述介面引數
ApiImplicitParam 與 ApiParam 的區別
ApiImplicitParam: This is the only way to define parameters when using Servlets or other non-JAX-RS environments.
對Servlets或者非 JAX-RS的環境,只能使用 ApiImplicitParam。
在使用上,ApiImplicitParam比ApiParam具有更少的程式碼侵入性,只要寫在方法上就可以了,但是需要提供具體的屬性才能配合swagger ui解析使用。
ApiParam只需要較少的屬性,與swagger ui配合更好。
傳遞複雜物件 By ModelAttribute
@ApiOperation(value="建立使用者-傳遞複雜物件", notes="傳遞複雜物件DTO, url引數拼接",produces = "application/json")
@RequestMapping(value="/users-2", method= RequestMethod.POST)
//傳遞物件推薦使用ModelAttribute註解
public Map postUser2(@ModelAttribute User user) { (1)
users.put(user.getId(),user);
return ImmutableMap.of("user",user);
}
(1) ModelAttribute 是Spring mvc的註解,這裡Swagger可以解析這個註解,獲得User的屬性描述
**@ApiModel**
@ApiModel(value = "User", description = "使用者物件")
public class User {
@ApiModelProperty(value = "ID")
private Integer id;
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "地址")
private String address;
@ApiModelProperty(value = "年齡",access = "hidden")
private int age;
@ApiModelProperty(value = "性別")
private int sex;
.......
}
傳遞複雜物件 By RequestBody
@ApiOperation(value="建立使用者-傳遞複雜物件", notes="傳遞複雜物件DTO,json格式傳遞資料",produces = "application/json")
@RequestMapping(value="/users-3", method= RequestMethod.POST)
//json格式傳遞物件使用RequestBody註解
public User postUser3(@RequestBody User user) {
users.put(user.getId(),user);
return user;
}
**PathVariable**
@ApiOperation(value="刪除使用者- PathVariable", notes="根據url的id來指定刪除物件")
@RequestMapping(value="/users/{id}", method = RequestMethod.DELETE)
public void deleteUser(@PathVariable Integer id) { (1)
users.remove(id);
}
(1) PathVariable是Spring 的註解,對於這種簡單的引數,就可以不用寫ApiParam來描述介面引數。
陣列的描述
@ApiOperation(value="刪除使用者-傳遞陣列", notes="刪除物件,傳遞陣列")
@RequestMapping(value="/users/deleteByIds", method = RequestMethod.DELETE)
public void deleteUser(@ApiParam("使用者ID陣列") @RequestParam Integer[] ids) { (1)
for (int id:ids){
users.remove(id);
}
}
(1) 這裡用ApiParam為陣列引數新增描述
**
例項演示:
**
@RestController
@RequestMapping(value="/users") // 通過這裡配置使下面的對映都在/users下,可去除
public class UserController {
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";
}
}
如上程式碼所示,我們通常需要自己增加一些說明來豐富文件內容。如下所示,我們通過@ApiOperation註解來給API增加說明、通過@ApiImplicitParams、@ApiImplicitParam註解來給引數增加說明。
完成上述程式碼新增上,啟動Spring Boot程式,訪問:http://localhost:8080/swagger-ui.html
。就能看到RESTful API的頁面。如下圖所示。
我們可以再點開具體的API請求,以POST型別的/users請求為例,可找到上述程式碼中我們配置的Notes資訊以及引數user的描述資訊,如下圖所示。
API文件訪問與除錯
在上圖請求的頁面中,我們看到user的Value是個輸入框?是的,Swagger除了檢視介面功能外,還提供了除錯測試功能,我們可以點選上圖中右側的Model Schema(黃色區域:它指明瞭User的資料結構),此時Value中就有了user物件的模板,我們只需要稍適修改,點選下方“Try it out!”按鈕,即可完成了一次請求呼叫!
此時,你也可以通過幾個GET請求來驗證之前的POST請求是否正確。
相比為這些介面編寫文件的工作,我們增加的配置內容是非常少而且精簡的,對於原有程式碼的侵入也在忍受範圍之內。因此,在構建RESTful API的同時,加入swagger來對API文件進行管理,是個不錯的選擇。