使用Spring Boot&Swagger快速構(gòu)建REST API并生成優(yōu)美的API文檔

通常我們要構(gòu)建API 服務(wù)厉颤,自然少不了文檔,但由于API與文檔的分離使得我們每次對(duì)API進(jìn)行的更改都需要去同步文檔,稍有紕漏難免就會(huì)出現(xiàn)調(diào)用的異常归榕,而編寫(xiě)、同步文檔通常是比較繁瑣無(wú)趣的事≈ㄉ妫現(xiàn)在得益于Spring BootSwagger刹泄,我們不但可以極速的搭建REST外里、RESTful風(fēng)格的API服務(wù)并且還可以生成優(yōu)美、強(qiáng)大的在線或離線API文檔特石。

  • 引入Maven依賴
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>
    </dependencies>
  • 創(chuàng)建Application主類
package example;//注意包結(jié)構(gòu)
@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}
  • 創(chuàng)建Swagger配置類
package example.config;//注意包結(jié)構(gòu)
@Configuration
@EnableSwagger2
public class Swagger2Configuration {
    @Bean
    public Docket buildDocket() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(buildApiInf())
                .select()
                .apis(RequestHandlerSelectors.basePackage("example.web.controller"))//要掃描的API(Controller)基礎(chǔ)包
                .paths(PathSelectors.any())
                .build();
    }
    private ApiInfo buildApiInf() {
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2 UI構(gòu)建API文檔")
                .contact("土豆")
                .version("1.0")
                .build();
    }
}
  • 創(chuàng)建RestController 構(gòu)建一個(gè)簡(jiǎn)單計(jì)算服務(wù)API
package example.web.controller;//注意包結(jié)構(gòu)
@Api(value = "計(jì)算服務(wù)",description="簡(jiǎn)單的計(jì)算服務(wù)盅蝗,提供加減乘除運(yùn)算API")
@RestController
@RequestMapping("/compute")
public class ComputeController {
      @ApiOperation("加法運(yùn)算")
      @PostMapping("/add")
      public Double add(@RequestParam Double a,  @RequestParam Double b) {
         return a + b;
      }
   
      @ApiOperation("減法運(yùn)算")
      @PostMapping("/sub")
      public Double sub(@RequestParam Double a,  @RequestParam Double b) {
          return a - b;
      }

      @ApiOperation("乘法運(yùn)算")
      @PostMapping("/mul")
      public Double mul(@RequestParam Double a,  @RequestParam Double b) {
          return a * b;
      }

      @ApiOperation("除法運(yùn)算")
      @PostMapping("/div")
      public Double div(@ApiParam("被除數(shù)")@RequestParam Double a, @ApiParam("除數(shù)")@RequestParam   Double b) {
          return a / b;
      }
}

@Api注解用來(lái)表述該服務(wù)的信息,如果不使用則顯示類名稱.
@ApiOperation注解用于表述接口信息
@ApiParam注解用于描述接口的參數(shù)

通過(guò)上面幾步我們已經(jīng)成功構(gòu)建了一個(gè)具備加減乘除的計(jì)算服務(wù)API姆蘸,并且已經(jīng)擁有一份不錯(cuò)的在線文檔了墩莫,現(xiàn)在我們來(lái)啟動(dòng)它,執(zhí)行mvn spring-boot:run逞敷,或直接運(yùn)行Application.main()狂秦。

啟動(dòng)成功后,訪問(wèn)http://localhost:8080/swagger-ui.html推捐,便可以看到我們剛才構(gòu)建的計(jì)算服務(wù)的API文檔了裂问。

swagger-ui

Swagger UI不僅僅是文檔,還提供了在線API調(diào)試的功能牛柒,我們可以調(diào)試下我們的除法運(yùn)算API堪簿。
swagger-ui

點(diǎn)擊Try it out!后可以看到我們成功的調(diào)用了除法運(yùn)算API并獲得了正確的響應(yīng)椭更。
swagger-ui

  • 創(chuàng)建RESTful 風(fēng)格的API及文檔

下面我們以用戶的增刪改查服務(wù)為例

1.創(chuàng)建Model

package example.model;//注意包結(jié)構(gòu)
public class User {

    private Long id;
    private String username;
    private Integer age;
    
    //省略getter畏腕、setter方法
    
}

2.創(chuàng)建RestController

package example.web.controller;//注意包結(jié)構(gòu)
@RestController
@RequestMapping("/user")
@Api(value = "用戶服務(wù)",description = "提供RESTful風(fēng)格API的用戶的增刪改查服務(wù)")
public class UserController {
    //模擬DAO層
    private final Map<Long, User> repository = new HashMap<Long, User>();

    @PostMapping
    @ApiOperation("添加用戶")
    public Boolean add(@RequestBody User user) {
        repository.put(user.getId(), user);
        return true;
    }

    @DeleteMapping("/{id}")
    @ApiOperation("通過(guò)ID刪除用戶")
    public Boolean delete(@PathVariable Long id) {
        repository.remove(id);
        return true;
    }

    @PutMapping
    @ApiOperation("更新用戶")
    public Boolean update(@RequestBody User user) {
        repository.put(user.getId(), user);
        return true;
    }

    @GetMapping("/{id}")
    @ApiOperation("通過(guò)ID查詢用戶")
    public User findById(@PathVariable Long id) {
        return repository.get(id);
    }
}

這里說(shuō)點(diǎn)題外話恋日,@GetMapping,@PostMapping,@PutMapping,@DeleteMapping 等注解是Spring MVC 4.3X版本添加的新注解,它們是對(duì)@RequestMapping注解的簡(jiǎn)化封裝谈截。

好了喻鳄,我們重新啟動(dòng)下Application,再次訪問(wèn)http://localhost:8080/swagger-ui.html,用戶服務(wù)的RESTful API文檔也已生成。

swagger-ui

我們來(lái)嘗試調(diào)用添加用戶API增加一位用戶

swagger-ui

成功后聚请,我們調(diào)用查詢API,來(lái)進(jìn)行查詢看時(shí)候可以返回正確的JSON數(shù)據(jù)。

swagger-ui
  • 為Model(JSON)添加注釋

為了使API的調(diào)用者能夠清晰的知道請(qǐng)求和響應(yīng)的Model中各字段的具體含義疙驾,我們需要對(duì)其添加一些簡(jiǎn)單的注釋郭毕,而Swagger也為我們提供了相應(yīng)的注解比如@ApiModel它碎、@ApiModelProperty來(lái)幫助我們解釋我們的Model,下面就是最簡(jiǎn)單的使用例子,詳細(xì)用法及更多相關(guān)注解點(diǎn)我查看~

@ApiModel("User(用戶模型)")
public class User {
     @ApiModelProperty("ID")
     private Long id;
     @ApiModelProperty("用戶名")
     private String username;
     @ApiModelProperty("年齡")
     private Integer age;

     //省略getter扳肛、setter方法
}
swagger-ui

這一切是不是很簡(jiǎn)單傻挂?從開(kāi)發(fā)API到構(gòu)建高逼格的API文檔完全可以用極速來(lái)形容。當(dāng)然敞峭,本文也只是展現(xiàn)了Spring Boot + Swagger的冰山一角踊谋,要了解更多細(xì)節(jié)那就快去翻閱官方文檔吧~

本示例完整代碼的GIT地址點(diǎn)擊我~
Swagger-Core文檔點(diǎn)擊我~
SpringFox文檔點(diǎn)擊我~
Spring Boot 文檔點(diǎn)擊我~
還不錯(cuò)的Spring Boot系列教程點(diǎn)擊我~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市旋讹,隨后出現(xiàn)的幾起案子殖蚕,更是在濱河造成了極大的恐慌,老刑警劉巖沉迹,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睦疫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡鞭呕,警方通過(guò)查閱死者的電腦和手機(jī)蛤育,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)葫松,“玉大人瓦糕,你說(shuō)我怎么就攤上這事∫该矗” “怎么了咕娄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)珊擂。 經(jīng)常有香客問(wèn)我圣勒,道長(zhǎng),這世上最難降的妖魔是什么摧扇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任圣贸,我火速辦了婚禮,結(jié)果婚禮上扛稽,老公的妹妹穿的比我還像新娘吁峻。我一直安慰自己,他們只是感情好在张,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布锡搜。 她就那樣靜靜地躺著,像睡著了一般瞧掺。 火紅的嫁衣襯著肌膚如雪耕餐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天辟狈,我揣著相機(jī)與錄音肠缔,去河邊找鬼夏跷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛明未,可吹牛的內(nèi)容都是我干的槽华。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼趟妥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼猫态!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起披摄,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亲雪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后疚膊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體义辕,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年寓盗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灌砖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡傀蚌,死狀恐怖基显,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情善炫,我是刑警寧澤续镇,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站销部,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏制跟。R本人自食惡果不足惜舅桩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雨膨。 院中可真熱鬧擂涛,春花似錦、人聲如沸聊记。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)排监。三九已至狰右,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舆床,已是汗流浹背棋蚌。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工嫁佳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷暮。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓蒿往,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親湿弦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓤漏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容