1. 程式人生 > >springboot中使用swagger

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文件進行管理,是個不錯的選擇。