二十三搀玖、Spring Boot使用Swagger2生成API文檔

一、Swagger2概念

Swagger 是一款RESTFUL接口的文檔在線自動生成+功能測試功能軟件驻呐。

Swagger 是一個規(guī)范和完整的框架灌诅,用于生成、描述含末、調(diào)用和可視化 RESTful 風(fēng)格的 Web 服務(wù)猜拾。總體目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新佣盒。文件的方法挎袜,參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步肥惭。Swagger 讓部署管理和使用功能強(qiáng)大的API從未如此簡單盯仪。

官網(wǎng):http://swagger.io/

GitHub地址:https://github.com/swagger-api/swagger-ui

二、為什么要使用Swagger2蜜葱?

Swagger2引入的好處全景,同樣也是手寫Api文檔的幾個痛點(diǎn):

  • 文檔需要更新的時(shí)候,需要再次發(fā)送一份給前端牵囤,也就是文檔更新交流不及時(shí)爸黄。
  • 接口返回結(jié)果不明確
  • 不能直接在線測試接口,通常需要使用工具奔浅,比如postman
  • 接口文檔太多,不好管理

三诗良、使用Swagger2

3.1汹桦、添加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>

3.2、創(chuàng)建Swagger2配置類

  • 使用@Configuration來表示該類是個配置類
  • 使用@EnableSwagger2來啟用Swagger2
@Configuration
@EnableSwagger2//啟用Swagger2
public class Swagger2Config {

    //從配置文件中獲取屬性值
    @Value("${swagger2.basepackage}")
    private String basepackage;


    /**
     * buildDocket()用于創(chuàng)建Docket的Bean鉴裹,
     * buildApiInfo()創(chuàng)建Api的基本信息舞骆,用于顯示在文檔頁面上钥弯。
     * select()函數(shù)返回一個ApiSelectorBuilder實(shí)例,用來控制哪些接口暴露給Swagger2來展現(xiàn)督禽。
     *      一般采用指定掃描的包路徑來定義脆霎,本例中Swagger會掃描controller包下所有定義的API,并產(chǎn)生文檔內(nèi)容(除了被@ApiIgnore指定的請求)狈惫。
     *
     * @return
     */
    @Bean
    public Docket buildDocket(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage(basepackage))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo buildApiInfo(){
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2構(gòu)建RESTful API文檔")
                .description("構(gòu)建簡單優(yōu)雅的Restfun風(fēng)格的api")
                .termsOfServiceUrl("https://github.com/caychen")
                .contact(new Contact("Cay", "", "412425870@qq.com"))
                .version("1.0")
                .build();
    }
}

3.3睛蛛、添加文檔內(nèi)容

@Api:用于controller請求類上,說明該類的說明

@Api(value = "用戶Controller")
public class UserController {}

@ApiOperation:用在controller類的具體請求方法上胧谈,說明方法的作用和用途

  • value:說明方法的用途忆肾、作用
  • notes:備注說明
@ApiOperation(value = "獲取User列表", notes = "獲取所有User對象")
public List<User> getUserList() {}

@ApiModel:用于響應(yīng)類上,表示一個返回響應(yīng)數(shù)據(jù)的信息(這種一般用在post創(chuàng)建的時(shí)候菱肖,使用@RequestBody這樣的場景客冈,請求參數(shù)無法使用@ApiImplicitParam注解進(jìn)行描述的時(shí)候)

@ApiModelProperty:用在相應(yīng)類的屬性上,描述響應(yīng)類的屬性

  • value:參數(shù)名稱
  • required:是否必須boolean
  • hidden:是否隱藏hidden
@ApiModel(value = "用戶對象User")
public class User implements Serializable {
    @ApiModelProperty(value = "用戶id", name = "uid")
    private Integer uid;
    @ApiModelProperty(value = "用戶名", name = "uname")
    private String uname;
    @ApiModelProperty(value = "用戶年齡", name = "uage")
    private Integer uage;
}

@ApiResponses:用于controller類的具體請求方法上稳强,來表示一組響應(yīng)

@ApiResponse:用在@ApiResponses中场仲,一般用于表達(dá)一個錯誤的響應(yīng)信息

code:狀態(tài)碼
message:信息
response:響應(yīng)的類型,默認(rèn)void

@ApiImplicitParams:用在請求的方法上退疫,表示一組參數(shù)說明

@ApiImplicitParam:用在@ApiImplicitParams注解中渠缕,指定一個請求參數(shù)的各個方面

  • name:對應(yīng)方法中接收參數(shù)名,必須指定
  • value:參數(shù)的說明蹄咖、解釋
  • required:參數(shù)是否必須傳參褐健,必須指定
  • dataType:參數(shù)類型,默認(rèn)String澜汤,如果類型名稱相同蚜迅,請指定全路徑,例如 dataType = “java.util.Date”俊抵,springfox會自動根據(jù)類型生成模型
  • defaultValue:參數(shù)的默認(rèn)值
  • paramType:參數(shù)放在哪個地方谁不,必須指定
  • header --> 請求參數(shù)從header請求頭中獲取,需要使用@RequestHeader
  • query --> 請求參數(shù)從url的請求中獲取徽诲,@RequestParam刹帕。例如 ?query=q ,jquery ajax中data設(shè)置的值也可以,例如 data:{query:”q”}谎替,在Controller中不需要添加注解就可以直接接收偷溺。
  • path(用于restful接口)--> 請求參數(shù)從path中獲取:需要使用@PathVariable
  • body --> 需要使用@RequestBody接收數(shù)據(jù)钱贯,POST有效
  • form --> 表單提交挫掏,必須使用post提交
@PutMapping("/{id}")
@ApiOperation(value = "更新指定user對象", notes = "根據(jù)url的id來指定更新對象,并根據(jù)傳過來的user信息來更新用戶詳細(xì)信息")
@ApiImplicitParams({
    @ApiImplicitParam(name = "id", value = "需要更新的用戶id", required = true, dataType = "Integer", paramType = "path"),
    @ApiImplicitParam(name = "user", value = "用戶詳細(xì)實(shí)體user", required = true, dataType = "User", paramType = "body")
})
public String updateUser(@PathVariable Integer id, @RequestBody User user) {}

@ApiIgnore:使用該注解忽略Controller的api方法

具體參照UserController:

@RestController
@RequestMapping("/user")
@Api(value = "用戶Controller")
public class UserController {

    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @Autowired
    private IUserService userService;

    //@RequestMapping("/")
    @GetMapping("/")
    @ApiOperation(value = "獲取User列表", notes = "獲取所有User對象")
    public List<User> getUserList() {
        logger.info("獲取User列表...");
        return userService.getUserList();
    }

    @GetMapping("/{id}")
    @ApiOperation(value = "獲取用戶詳情", notes = "根據(jù)url中用戶id來獲取該用戶的詳情")
    @ApiImplicitParam(name = "id", value = "用戶id", required = true, dataType = "Integer", paramType = "path")
    public User getById(@PathVariable Integer id) {
        logger.info("獲取id為{}的User...", id);
        return userService.getById(id);
    }

    @PostMapping("/")
    @ApiOperation(value = "新增User", notes = "根據(jù)User對象創(chuàng)建用戶")
    @ApiImplicitParam(name = "user", value = "用戶詳細(xì)實(shí)體user", required = true, dataType = "User", paramType = "body")
    public String addUser(@RequestBody User user) {
        logger.info("新增User對象...");
        int result = userService.addUser(user);
        if (result == 1) {
            return "success";
        } else {
            return "error";
        }
    }

    @PutMapping("/{id}")
    @ApiOperation(value = "更新指定user對象", notes = "根據(jù)url的id來指定更新對象秩命,并根據(jù)傳過來的user信息來更新用戶詳細(xì)信息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "需要更新的用戶id", required = true, dataType = "Integer", paramType = "path"),
            @ApiImplicitParam(name = "user", value = "用戶詳細(xì)實(shí)體user", required = true, dataType = "User", paramType = "body")
    })
    public String updateUser(@PathVariable Integer id, @RequestBody User user) {
        logger.info("更新id為{}的User對象...", id);
        user.setUid(id);
        int result = userService.updateUser(id, user);
        if (result == 1) {
            return "success";
        } else {
            return "error";
        }
    }

    @DeleteMapping("/{id}")
    @ApiOperation(value = "刪除指定user對象", notes = "根據(jù)url中的id來刪除user對象")
    @ApiImplicitParam(name = "id", value = "需要刪除user對象的id", required = true, dataType = "Integer", paramType = "path")
    public String deleteUser(@PathVariable Integer id) {
        logger.info("刪除id為{}的User對象...", id);
        int result = userService.deleteUser(id);
        if (result == 1) {
            return "success";
        } else {
            return "error";
        }
    }
}

3.4尉共、啟動項(xiàng)目褒傅,訪問http://ip:port/swagger-ui.html

Swagger文檔頁面.png

依次點(diǎn)開每個url,即可在線調(diào)試袄友。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殿托,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子剧蚣,更是在濱河造成了極大的恐慌支竹,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券敌,死亡現(xiàn)場離奇詭異唾戚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)待诅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門叹坦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卑雁,你說我怎么就攤上這事募书。” “怎么了测蹲?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵莹捡,是天一觀的道長。 經(jīng)常有香客問我扣甲,道長篮赢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任琉挖,我火速辦了婚禮启泣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘示辈。我一直安慰自己寥茫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布矾麻。 她就那樣靜靜地躺著纱耻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪险耀。 梳的紋絲不亂的頭發(fā)上弄喘,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音甩牺,去河邊找鬼蘑志。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卖漫。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赠群,長吁一口氣:“原來是場噩夢啊……” “哼羊始!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起查描,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤突委,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冬三,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匀油,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年勾笆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敌蚜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡窝爪,死狀恐怖弛车,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒲每,我是刑警寧澤纷跛,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站邀杏,受9級特大地震影響贫奠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜望蜡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一唤崭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泣特,春花似錦浩姥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至膏孟,卻和暖如春眯分,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柒桑。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工弊决, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓飘诗,卻偏偏與公主長得像与倡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昆稿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345