Swagger

Swagger是一組開源項目,其中主要要項目如下:

  • Swagger-tools:提供各種與Swagger進行集成和交互的工具。例如模式檢驗、Swagger 1.2文檔轉換成Swagger2.0文檔等功能。
  • Swagger-core: 用於Java/Scala的的Swagger實現。與JAX-RS(Jersey、Resteasy、CXF…)、Servlets和Play框架進行集成。
  • Swagger-js: 用於JavaScript的Swagger實現。 Swagger-node-express:
  • Swagger模塊,用於node.js的Express web應用框架。
  • Swagger-ui:一個無依賴的HTML、JS和CSS集合,可以爲Swagger兼容API動態生成優雅文檔。
  • Swagger-codegen:一個模板驅動引擎,通過分析用戶Swagger資源聲明以各種語言生成客戶端代碼。

API註解

@Api

用在類上,該註解將一個Controller(Class)標註爲一個swagger資(API)。在默認情況下,Swagger-Core只會掃描解析具有@Api註解的類,而會自動忽略其他類別資源(JAX-RS endpoints,Servlets等等)的註解。該註解包含以下幾個重要屬性

  • tags API分組標籤。具有相同標籤的API將會被歸併在一組內展示。
  • value 如果tags沒有定義,value將作爲Api的tags使用
  • description API的詳細描述,在1.5.X版本之後不再使用,但實際發現在2.0.0版本中仍然可以使用

@ApiOperation

在指定的(路由)路徑上,對一個操作或HTTP方法進行描述。具有相同路徑的不同操作會被歸組爲同一個操作對象。不同的HTTP請求方法及路徑組合構成一個唯一操作。此註解的屬性有:

  • value 對操作的簡單說明,長度爲120個字母,60個漢字。
  • notes 對操作的詳細說明。
  • httpMethod HTTP請求的動作名,可選值有:“GET”, “HEAD”, “POST”, “PUT”, “DELETE”, “OPTIONS” AND “PATCH”。
  • code 默認爲200,有效值必須符合標準的HTTP Status Code Definitions。

@ApiImplicitParams

用在方法上,註解ApiImplicitParam的容器類,以數組方式存儲。

@ApiImplicitParam

對API的單一參數進行註解。雖然註解@ApiParam同JAX-RS參數相綁定,但這個@ApiImplicitParam註解可以以統一的方式定義參數列表,也是在Servelet及非JAX-RS環境下,唯一的方式參數定義方式。注意這個註解@ApiImplicitParam必須被包含在註解@ApiImplicitParams之內。可以設置以下重要參數屬性:

  • name 參數名稱
  • value 參數的簡短描述
  • required 是否爲必傳參數
  • dataType 參數類型,可以爲類名,也可以爲基本類型(String,int、boolean等)
  • paramType 參數的傳入(請求)類型,可選的值有path, query, body, header or form

@ApiParam

增加對參數的元信息說明。這個註解只能被使用在JAX-RS 1.x/2.x的綜合環境下。其主要的屬性有

  • required 是否爲必傳參數,默認爲false
  • value 參數簡短說明

@ApiResponses

註解@ApiResponse的包裝類,數組結構。即使需要使用一個@ApiResponse註解,也需要將@ApiResponse註解包含在註解@ApiResponses內。

@ApiResponse
描述一個操作可能的返回結果。當REST API請求發生時,這個註解可用於描述所有可能的成功與錯誤碼。可以用,也可以不用這個註解去描述操作的返回類型,但成功操作的返回類型必須在@ApiOperation中定義。如果API具有不同的返回類型,那麼需要分別定義返回值,並將返回類型進行關聯。但Swagger不支持同一返回碼,多種返回類型的註解。注意:這個註解必須被包含在@ApiResponses註解中。

  • code HTTP請求返回碼。有效值必須符合標準的HTTP Status Code Definitions。
  • message 更加易於理解的文本消息
  • response 返回類型信息,必須使用完全限定類名,比如“com.willem.user.User.class”。
  • responseContainer 如果返回類型爲容器類型,可以設置相應的值。有效值爲 “List”, “Set” or “Map”,其他任何無效的值都會被忽略

Model註解

對於Model的註解,Swagger提供了兩個:@ApiModel及@ApiModelProperty,分別用以描述Model及Model內的屬性。

@ApiModel
描述一個Model的信息(一般用在請求參數無法使用@ApiImplicitParam註解進行描述的時候)
提供對Swagger model額外信息的描述。在標註@ApiOperation註解的操作內,所有的類將自動被內省(introspected),但利用這個註解可以做一些更加詳細的model結構說明。主要屬性有:

  • value model的別名,默認爲類名
  • description model的詳細描述

@ApiModelProperty

描述一個model的屬性 對model屬性的註解,主要的屬性值有:

  • value 屬性簡短描述
  • example 屬性的示例值
  • required 是否爲必須值

將各個系統的API數據集中

  1. 客戶端
    將這個放到你的config啓動,注意這裏我用了一個佔位符獲取當前文檔的名稱,避免寫死後續可能添加其他模塊
    pom文件中添加以下依賴
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
/**
 * @program: container
 * @description: SwaggerConfig
 * @author: willem
 * @create: 2020-03-04 13:30:23
 */
@ConditionalOnClass(value = {Swagger.class})
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Value("${spring.application.name}")
    private String applicationName;
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.**.**.controller"))
                .paths(PathSelectors.any())
                .build()
                .globalOperationParameters(parameters());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(applicationName+"接口文檔")
                .description(applicationName+"接口文檔")
                .contact(new Contact("***", "https://***.***.com", "***@163.com"))
                .version("2.0")
                .build();
    }

    private List<Parameter> parameters() {
        ParameterBuilder parameterBuilder = new ParameterBuilder();
        List<Parameter> parameters = new ArrayList<>();
        parameterBuilder.name("session")
                .description("session")
                .modelRef(new ModelRef("string"))
                .parameterType("header")
                .required(false).build();
        parameters.add(parameterBuilder.build());
        return parameters;
    }
}
  1. 網關Zuul
    zuul的pom文件中添加以下依賴
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>com.github.xiaoymin</groupId>
   <artifactId>swagger-bootstrap-ui</artifactId>
   <version>2.9.2</version>
</dependency>

在zuul的config中添加如下配置,注意這裏有個apiNames是所有的分組服務名,避免寫死,直接從配置文件讀取

SwaggerResource有三個參數,

第一個參數:名稱,也就是之前那個下拉框的選擇條名稱
第二個參數:url,就是訪問具體系統swagger的鏈接
第三個參數:version ,就是swagger的版本

/**
 * @program: container
 * @description: DocumentationConfig
 * @author: willem
 * @create: 2020-03-05 17:01:23
 */
@EnableSwagger2
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {

    @Value("${rest.api.names}")
    private String[] apiNames;

    @Override
    public List<SwaggerResource> get() {
        List resources = new ArrayList<>();
        if (apiNames != null) {
            Arrays.stream(apiNames).forEach(s ->
                    resources.add(swaggerResource(s, "/" + s + "/v2/api-docs", "2.0"))
            );
        }
        return resources;
    }

    private SwaggerResource swaggerResource(String name, String location, String version) {
        SwaggerResource swaggerResource = new SwaggerResource();
        swaggerResource.setName(name);
        swaggerResource.setLocation(location);
        swaggerResource.setSwaggerVersion(version);
        return swaggerResource;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章