1. 程式人生 > >轉載:SpringBoot非官方教程 | 第十一篇:springboot整合swagger2,構建優雅的Restful API

轉載:SpringBoot非官方教程 | 第十一篇:springboot整合swagger2,構建優雅的Restful API

swagger,中文“拽”的意思。它是一個功能強大的api框架,它的整合非常簡單,不僅提供了線上文件的查閱,而且還提供了線上文件的測試。另外swagger很容易構建restful風格的api,簡單優雅帥氣,正如它的名字。

一、引入依賴

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

二、寫配置類

@Configuration
@EnableSwagger2
public class Swagger2 {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.forezp.controller"))
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("springboot利用swagger構建api文件")
                .description("簡單優雅的restfun風格,http://blog.csdn.net/forezp")
                .termsOfServiceUrl("http://blog.csdn.net/forezp")
                .version("1.0")
                .build();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

通過@Configuration註解,表明它是一個配置類,@EnableSwagger2開啟swagger2。apiINfo()配置一些基本的資訊。apis()指定掃描的包會生成文件。

三、寫生產文件的註解

swagger通過註解表明該介面會生成文件,包括介面名、請求方法、引數、返回資訊的等等。

  • @Api:修飾整個類,描述Controller的作用
  • @ApiOperation:描述一個類的一個方法,或者說一個介面
  • @ApiParam:單個引數描述
  • @ApiModel:用物件來接收引數
  • @ApiProperty:用物件接收引數時,描述物件的一個欄位
  • @ApiResponse:HTTP響應其中1個描述
  • @ApiResponses:HTTP響應整體描述
  • @ApiIgnore:使用該註解忽略這個API
  • @ApiError :發生錯誤返回的資訊
  • @ApiParamImplicitL:一個請求引數
  • @ApiParamsImplicit 多個請求引數

現在通過一個栗子來說明:

package com.forezp.controller;
import com.forezp.entity.Book;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import java.util.*;
/**
 * 使用者建立某本圖書	POST	/books/
 * 使用者修改對某本圖書	PUT	/books/:id/
 * 使用者刪除對某本圖書	DELETE	/books/:id/
 * 使用者獲取所有的圖書 GET /books
 *  使用者獲取某一圖書  GET /Books/:id
 * Created by fangzhipeng on 2017/4/17.
 * 官方文件:http://swagger.io/docs/specification/api-host-and-base-path/
 */
@RestController
@RequestMapping(value = "/books")
public class BookContrller {
    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!";
    }
}
  • 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
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

通過相關注解,就可以讓swagger2生成相應的文件。如果你不需要某介面生成文件,只需要在加@ApiIgnore註解即可。需要說明的是,如果請求引數在url上,@ApiImplicitParam 上加paramType = “path” 。

Paste_Image.png

整個整合過程非常簡單,但是我看了相關的資料,swagger沒有做安全方面的防護,可能需要我們自己做相關的工作。

四、參考資料