真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot如何集成Swagger2項目-創(chuàng)新互聯(lián)

這篇文章主要介紹了Spring Boot如何集成Swagger2項目,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的固鎮(zhèn)網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

一、Swagger簡介

  在日常的工作中,我們往往需要給前端(WEB端、IOS、Android)或者第三方提供接口,這個時候我們就需要給他們提供一份詳細(xì)的API說明文檔。但維護(hù)一份詳細(xì)的文檔可不是一件簡單的事情。首先,編寫一份詳細(xì)的文檔本身就是一件很費(fèi)時費(fèi)力的事情,另一方面,由于代碼和文檔是分離的,所以很容易導(dǎo)致文檔和代碼的不一致。這篇文章我們就來分享一種API文檔維護(hù)的方式,即通過Swagger來自動生成Restuful API文檔。

  那什么是Swagger?我們可以直接看下官方的描述:

THE WORLD'S MOST POPULAR API TOOLING
Swagger is the world's largest framework of API developer tools for the OpenAPI Specification(OAS),
enabling development across the entire API lifecycle, from design and documentation, to test and deployment.

  這段話首先告訴大家Swagger是世界上最流行的API工具,并且Swagger的目的是支撐整個API生命周期的開發(fā),包括設(shè)計、文檔以及測試和部署。這篇文章中我們會用到Swagger的文檔管理和測試功能。

  對Swagger的作用有了基本的認(rèn)識后,我們現(xiàn)在來看看怎么使用。

二、Swagger與Spring boot集成

  第一步:引入對應(yīng)jar包:


  io.springfox
  springfox-swagger2
  2.6.0


  io.springfox
  springfox-swagger-ui
  2.6.0

  第二步,基本信息配置:

@Configuration
@EnableSwagger2
public class Swagger2Config {
  @Bean
  public Docket createRestApi() {
    return new Docket(DocumentationType.SWAGGER_2)
        .apiInfo(apiInfo())
        .select()
        .apis(RequestHandlerSelectors.basePackage("com.pandy.blog.rest"))
        .paths(PathSelectors.regex("/rest/.*"))
        .build();
  }
 
  private ApiInfo apiInfo() {
    return new ApiInfoBuilder()
        .title("Blog系統(tǒng)Restful API")
        .description("Blog系統(tǒng)Restful API")
        .termsOfServiceUrl("http://127.0.0.1:8080/")
        .contact("liuxiaopeng")
        .version("1.0")
        .build();
  }
}

  基礎(chǔ)的配置是對整個API文檔的描述以及一些全局性的配置,對所有接口起作用。這里涉及到兩個注解:

  @Configuration是表示這是一個配置類,是JDK自帶的注解,前面的文章中也已做過說明。

  @EnableSwagger2的作用是啟用Swagger2相關(guān)功能。

  在這個配置類里面我么實例化了一個Docket對象,這個對象主要包括三個方面的信息:

   ?。?)整個API的描述信息,即ApiInfo對象包括的信息,這部分信息會在頁面上展示。

   ?。?)指定生成API文檔的包名。

   ?。?)指定生成API的路徑。按路徑生成API可支持四種模式,這個可以參考其源碼:

public class PathSelectors {
  private PathSelectors() {
    throw new UnsupportedOperationException();
  }
 
  public static Predicate any() {
    return Predicates.alwaysTrue();
  }
 
  public static Predicate none() {
    return Predicates.alwaysFalse();
  }
 
  public static Predicate regex(final String pathRegex) {
    return new Predicate() {
      public boolean apply(String input) {
        return input.matches(pathRegex);
      }
    };
  }
 
  public static Predicate ant(final String antPattern) {
    return new Predicate() {
      public boolean apply(String input) {
        AntPathMatcher matcher = new AntPathMatcher();
        return matcher.match(antPattern, input);
      }
    };
  }
}

  從源碼可以看出,Swagger總共支持任何路徑都生成、任何路徑都不生成以及正則匹配和ant 模式匹配四種方式。大家可能比較熟悉的是前三種,最后一種ant匹配,如果不熟悉ant的話就直接忽略吧,前三種應(yīng)該足夠大家在日常工作中使用了。

  有了上面的配置我們就可以看到效果了,我在com.pandy.blog.rest這個包下面有一個ArticleRestController這個類,源碼如下:

  啟動Spring boot,然后訪問:http://127.0.0.1:8080/swagger-ui.html即可看到如下結(jié)果:

Spring Boot如何集成Swagger2項目

   這個頁面上可以看到,除了最后一個接口/test/{id}外,其他接口都生成對應(yīng)的文檔,最后一個接口因為不滿足我們配置的路徑——“/rest/.*”,所以沒有生成文檔。

  我們還可以點進(jìn)去看一下每一個具體的接口,我們這里以“POST /rest/article”這個接口為例:

Spring Boot如何集成Swagger2項目

  可以看到,Swagger為每一個接口都生成了返回結(jié)果和請求參數(shù)的示例,并且能直接通過下面的"try it out"進(jìn)行接口訪問,方面大家對接口進(jìn)行測試。整體上感覺Swagger還是很強(qiáng)大的,配置也比較簡單。

@RestController
public class ArticleRestController {
  @Autowired
  private ArticleService articleService;
  @RequestMapping(value = "/rest/article", method = POST, produces = "application/json")
  public WebResponse> saveArticle(@RequestBody Article article) {
    article.setUserId(1L);
    articleService.saveArticle(article);
    Map ret = new HashMap<>();
    ret.put("id", article.getId());
    WebResponse> response = WebResponse.getSuccessResponse(ret);
    return response;
  }
  @RequestMapping(value = "/rest/article/{id}", method = DELETE, produces = "application/json")
  public WebResponse deleteArticle(@PathVariable Long id) {
    Article article = articleService.getById(id);
    article.setStatus(-1);
    articleService.updateArticle(article);
    WebResponse response = WebResponse.getSuccessResponse(null);
    return response;
  }
  @RequestMapping(value = "/rest/article/{id}", method = PUT, produces = "application/json")
  public WebResponse updateArticle(@PathVariable Long id, @RequestBody Article article) {
    article.setId(id);
    articleService.updateArticle(article);
    WebResponse response = WebResponse.getSuccessResponse(null);
    return response;
  }
  @RequestMapping(value = "/rest/article/{id}", method = GET, produces = "application/json")
  public WebResponse
 getArticle(@PathVariable Long id) {     Article article = articleService.getById(id);     WebResponse
 response = WebResponse.getSuccessResponse(article);     return response;   }   @RequestMapping(value = "/test/{id}", method = GET, produces = "application/json")   public WebResponse getNoApi(){     WebResponse response = WebResponse.getSuccessResponse(null);     return response;   } }

三、Swagger API詳細(xì)配置

   不過大家看到這里肯定會有點疑問:

    第一個問題:這個返回結(jié)果和請求參數(shù)都沒有文字性的描述,這個可不可以配置?

    第二個問題:這個請求參應(yīng)該是直接根據(jù)對象反射出來的結(jié)果,但是不是對象的每個屬性都是必傳的,另外參數(shù)的值也不一定滿足我們的需求,這個能否配置?

  答案肯定是可以的,現(xiàn)在我們就來解決這兩個問題,直接看配置的代碼:

package com.pandy.blog.rest;
import com.pandy.blog.dto.WebResponse;
import com.pandy.blog.po.Article;
import com.pandy.blog.service.ArticleService;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Profile;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.springframework.web.bind.annotation.RequestMethod.DELETE;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
import static org.springframework.web.bind.annotation.RequestMethod.PUT;
@RestController
@RequestMapping("/rest")
public class ArticleRestController {
  @Autowired
  private ArticleService articleService;
  @RequestMapping(value = "/article", method = POST, produces = "application/json")
  @ApiOperation(value = "添加文章", notes = "添加新的文章", tags = "Article",httpMethod = "POST")
  @ApiImplicitParams({
      @ApiImplicitParam(name = "title", value = "文章標(biāo)題", required = true, dataType = "String"),
      @ApiImplicitParam(name = "summary", value = "文章摘要", required = true, dataType = "String"),
      @ApiImplicitParam(name = "status", value = "發(fā)布狀態(tài)", required = true, dataType = "Integer")
  })
  @ApiResponses({
      @ApiResponse(code=200,message="成功",response=WebResponse.class),
  })
  public WebResponse> saveArticle(@RequestBody Article article){
    articleService.saveArticle(article);
    Map ret = new HashMap<>();
    ret.put("id",article.getId());
    WebResponse> response = WebResponse.getSuccessResponse(ret);
    return response;
  }
  @ApiOperation(value = "刪除文章", notes = "根據(jù)ID刪除文章", tags = "Article",httpMethod = "DELETE")
  @ApiImplicitParams({
      @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long")
  })
  @RequestMapping(value = "/{id}",method = DELETE,produces = "application/json")
  public WebResponse deleteArticle(@PathVariable Long id){
    Article article = articleService.getById(id);
    article.setStatus(-1);
    articleService.saveArticle(article);
    return WebResponse.getSuccessResponse(new HashMap<>());
  }
  @ApiOperation(value = "獲取文章列表", notes = "可以根據(jù)標(biāo)題進(jìn)行模糊查詢", tags = "Article",httpMethod = "GET")
  @ApiImplicitParams({
      @ApiImplicitParam(name = "title", value = "文章標(biāo)題", required = false, dataType = "String"),
      @ApiImplicitParam(name = "pageSize", value = "每頁文章數(shù)量", required = false, dataType = "Integer"),
      @ApiImplicitParam(name = "pageNum", value = "分頁的頁碼", required = false, dataType = "Integer")
  })
  @RequestMapping(value = "/article/list", method = GET, produces = "application/json")
  public WebResponse listArticles(String title, Integer pageSize, Integer pageNum) {
    if (pageSize == null) {
      pageSize = 10;
    }
    if (pageNum == null) {
      pageNum = 1;
    }
    int offset = (pageNum - 1) * pageSize;
    List
 articles = articleService.getArticles(title, 1L, offset, pageSize);     return WebResponse.getSuccessResponse(articles);   }   @ApiOperation(value = "更新文章", notes = "更新文章內(nèi)容", tags = "Article",httpMethod = "PUT")   @ApiImplicitParams({       @ApiImplicitParam(name = "id", value = "文章ID", required = true, dataType = "Long"),       @ApiImplicitParam(name = "title", value = "文章標(biāo)題", required = false, dataType = "String"),       @ApiImplicitParam(name = "summary", value = "文章摘要", required = false, dataType = "String"),       @ApiImplicitParam(name = "status", value = "發(fā)布狀態(tài)", required = false, dataType = "Integer")   })   @RequestMapping(value = "/article/{id}", method = PUT, produces = "application/json")   public WebResponse updateArticle(@PathVariable Long id,@RequestBody Article article){     article.setId(id);     articleService.updateArticle(article);     return WebResponse.getSuccessResponse(new HashMap<>());   } }

  我們解釋一下代碼中幾個注解及相關(guān)屬性的具體作用:

  @ApiOperation,整個接口屬性配置:

    value:接口說明,展示在接口列表。

    notes:接口詳細(xì)說明,展示在接口的詳情頁。

    tags:接口的標(biāo)簽,相同標(biāo)簽的接口會在一個標(biāo)簽頁下展示。

    httpMethod:支持的HTTP的方法。

  @ApiImplicitParams,@ApiImplicitParam的容器,可包含多個@ApiImplicitParam注解

  @ApiImplicitParam,請求參數(shù)屬性配置:

    name:參數(shù)名稱

    value:參數(shù)說明

    required:是否必須

    dataType:數(shù)據(jù)類型  

  @ApiResponses,@ApiResponse容器,可以包含多個@ApiResponse注解

  @ApiResponse,返回結(jié)果屬性配置:

    code:返回結(jié)果的編碼。

    message:返回結(jié)果的說明。

    response:返回結(jié)果對應(yīng)的類。    

  完成以上配置后,我們再看下頁面效果:

列表頁:   

Spring Boot如何集成Swagger2項目         

   可以看到,現(xiàn)在接口都位于Article這個tag下,并且接口后面也有了我們配置好的說明。我們再看下”POST /rest/article“這個接口的詳情頁:

Spring Boot如何集成Swagger2項目

  圖片太大,只截取了title屬性的展示,其他幾個參數(shù)的類似。我們可以從頁面上看到請求參數(shù)的說明是有的,不過這不是我們預(yù)期的效果,如果我們的參數(shù)僅僅是簡單類型,這種方式應(yīng)該沒問題,但現(xiàn)在的問題是我們的請求參數(shù)是一個對象,那如何配置呢?這就涉及到另外兩個注解:@ApiModel和@ApiModelProperty,我們還是先看代碼,然后再解釋,這樣更容易理解:

@ApiModel(value="article對象",description="新增&更新文章對象說明")
public class Article {
  @Id
  @GeneratedValue
  @ApiModelProperty(name = "id",value = "文章ID",required = false,example = "1")
  private Long id;
  @ApiModelProperty(name = "title",value = "文章標(biāo)題",required = true,example = "測試文章標(biāo)題")
  private String title;
  @ApiModelProperty(name = "summary",value = "文章摘要",required = true,example = "測試文章摘要")
  private String summary;
  @ApiModelProperty(hidden = true)
  private Date createTime;
  @ApiModelProperty(hidden = true)
  private Date publicTime;
  @ApiModelProperty(hidden = true)
  private Date updateTime;
  @ApiModelProperty(hidden = true)
  private Long userId;
  @ApiModelProperty(name = "status",value = "文章發(fā)布狀態(tài)",required = true,example = "1")
  private Integer status;
  @ApiModelProperty(name = "type",value = "文章分類",required = true,example = "1")
  private Integer type;
}

  @ApiModel是對整個類的屬性的配置:

    value:類的說明

    description:詳細(xì)描述

  @ApiModelProperty是對具體每個字段的屬性配置:

    name:字段名稱

    value:字段的說明

    required:是否必須

    example:示例值

    hidden:是否顯示

  完成上面的配置后,我們再來看效果:

Spring Boot如何集成Swagger2項目

Spring Boot如何集成Swagger2項目

  現(xiàn)在我們可以看到,字段的說明都已經(jīng)展示出來,并且,示例中字段的值也變成了我們配置的example屬性對應(yīng)的值了。這樣,一份完整的API文檔就生成了,并且該文檔與代碼緊密的聯(lián)系在一起,而不是隔離的兩個部分。除此之外,我們還可以直接通過該文檔很方便的進(jìn)行測試,我們只需要點擊Example Value下黃色的框,里面的內(nèi)容就會自動復(fù)制到article對應(yīng)的value框中,然后在點擊“Try it out”就可以發(fā)起http請求了。

 Spring Boot如何集成Swagger2項目

  點擊Try it out后,我們就可以看到返回的結(jié)果:

Spring Boot如何集成Swagger2項目

  操作還是很方便的,相比Junit和postman,通過Swagger來測試會更加便捷,當(dāng)然,Swagger的測試并不能代替單元測試,不過,在聯(lián)調(diào)的時候還是有非常大的作用的。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Spring Boot如何集成Swagger2項目”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!


網(wǎng)站標(biāo)題:SpringBoot如何集成Swagger2項目-創(chuàng)新互聯(lián)
文章來源:http://weahome.cn/article/cspepj.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部