1. 程式人生 > >【實踐筆記】Spring MVC中Restful API使用 Swagger2 構建

【實踐筆記】Spring MVC中Restful API使用 Swagger2 構建

1、Swagger2是什麼?

Swagger 是一款RESTFUL介面的文件線上自動生成+功能測試功能軟體。

Swagger 是一個規範和完整的框架,用於生成、描述、呼叫和視覺化 RESTful 風格的 Web 服務。總體目標是使客戶端和檔案系統作為伺服器以同樣的速度來更新。檔案的方法,引數和模型緊密整合到伺服器端的程式碼,允許API來始終保持同步。Swagger 讓部署管理和使用功能強大的API從未如此簡單。官網:http://swagger.io/GitHub地址:https://github.com/swagger-api/swagger-ui

2、Swagger2官網

3.Swagger2的入門教程

在微服務架構流行的今天,RESTful API成了服務間互動的主要方式之一,Swagger則成為服務之間的契約描述、提高除錯、測試效率的重要工具。 Swagger工具包括Swagger Editor、Swagger UI、Swagger Codegen:

  • Swagger Editor——支援編輯Swagger API規範yaml文件描述API,並可實時預覽API。
  • SwaggerUI——API線上文件生成和測試的工具,可顯示API描述,並且支援呼叫API進行測試及驗證。
  • Swagger Codegen——一個模板驅動引擎,通過分析使用者Swagger資源宣告以各種語言生成客戶端SDK或Server端樁程式碼,從而讓開發團隊能夠更好的關注API的實現和呼叫,提高開發效率.

3.1Swagger2的maven依賴

<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.4.0</version>
</dependency>

3.2SwaggerConfig的配置

/**
* Created by Zhaky on 2017/3/17.
* @專案名稱:XXXXX
* @類名:SwaggerConfig
* @類的描述: Restapi SwaggerConfig的基本配置
* @作者:Zhaky
* @建立時間:2017/3/17
* @公司:xiaomi
* @QQ:411172392
* @郵箱:[email protected]
* @使用方法:Restful API 訪問路徑: http://localhost:{port}/{ProjectName}/swagger-ui.html
*/
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableWebMvc
@EnableSwagger2//啟用Swagger2
@Configuration//讓Spring來載入該類配置
@ComponentScan(basePackages ="com.xiaomi.XXXX")
public class SwaggerConfig {

@Bean
public Docket buildDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(buildApiInf())
.select()
.apis(RequestHandlerSelectors.basePackage("com.xiaomi.XXXX"))//controller路徑
.paths(PathSelectors.any())
.build();
}

private ApiInfo buildApiInf() {
return new ApiInfoBuilder()
.title("開放介面API")
.termsOfServiceUrl("https://XXXXXXX/openapi/")
.description("XXXXXX")
.contact(new Contact("[email protected]", "https://XXXXX.com/", "[email protected]"))
.version("1.0")
.build();
}
}

3.3在Controller中新增


/**
*
* Created by Zhaky on 2017/1/23.
*/
@RestController
@RequestMapping("/pay")
@Api(value = "XXXController", description = "查詢相關操作")
public class XXXController {
private final static Logger logger = LoggerFactory.getLogger(XXXController.class);
@Resource
private LogServiceImpl logServiceImpl;
/**
* 查詢
*/
@ApiOperation(value = "XX查詢", notes = "查詢資訊")
@RequestMapping(value = {"/payQuery"}, method = {RequestMethod.POST})

public
@ResponseBody
void payQuery(@RequestBody @Valid PayQuery requestVO, BindingResult result, HttpServletRequest req, HttpServletResponse resp) {
try {
ExecutorService pool = Executors.newCachedThreadPool();
pool.execute(new Runnable() {
@Override
public void run() {
log(req);
};//省略業務邏輯程式碼
})}}

對於@RequestBody 標記的表單引數實體必須在實體中新增@ApiModel註解

@ApiModel(description = "查詢請求表單實體")
@XmlType(name="PayQuery")
public class PayQuery extends BaseBody {

@NotNull(message = "{common.oriReqMsgId.not.empty}")
@Length(min=0, max=32)
@ApiModelProperty(value = "原交易流水號oriReqMsgId", example = "273453459302",position = 1)
private String oriReqMsgId;//原交易流水號
//省略部分程式碼
}

遇到的問題

Swagger-ui.html 404問題

再看看Springfox-swagger-ui的原始碼目錄結構如下: 
SouthEast

SouthEast
SpringBoot官方文件顯示:
By default Spring Boot will serve static content from a directory called /static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext。

所以springfox-swagger-ui裡swagger-ui.html的目錄是預設目錄結構。 
顯然兩者的靜態資源目錄結構不一致,若專案首頁能顯示則swagger-ui不能顯示,若swagger-ui頁面能顯示則首頁不能顯示。 

解決方案:

springmvc配置檔案中新增

<mvc:resources mapping="swagger-ui.html" location="classpath:/META-INF/resources/"/>
<mvc:resources mapping="/webjars/**" location="classpath:/META-INF/resources/webjars/"/>

3.4結果

3eQNry2.jpg!web

3eQNry2.jpg!web

3.5註解說明:

@Api:用在類上,說明該類的作用

@ApiOperation:用在方法上,說明方法的作用,標註在具體請求上,value和notes的作用差不多,都是對請求進行說明;tags則是對請求進行分類的,比如你有好幾個controller,分別屬於不同的功能模組,那這裡我們就可以使用tags來區分了,看上去很有條理

@ApiImplicitParams:用在方法上包含一組引數說明

@ApiImplicitParam:用在@ApiImplicitParams註解中,指定一個請求引數的各個方面

paramType:引數放在哪個地方

header-->請求引數的獲取:@RequestHeader

query-->請求引數的獲取:@RequestParam

path(用於restful介面)-->請求引數的獲取:@PathVariable

body(不常用)

form(不常用)

name:引數名

dataType:引數型別

required:引數是否必須傳

value:引數的意思

defaultValue:引數的預設值

@ApiResponses:用於表示一組響應

@ApiResponse:用在@ApiResponses中,一般用於表達一個錯誤的響應資訊

code:數字,例如400

message:資訊,例如"請求引數沒填好"

response:丟擲異常的類

@ApiModel:描述一個Model的資訊(這種一般用在post建立的時候,使用@RequestBody這樣的場景,請求引數無法使用@ApiImplicitParam註解進行描述的時候)表明這是一個被swagger框架管理的model,用於class上

@ApiModelProperty 這裡顧名思義,描述一個model的屬性,就是標註在被標註了@ApiModel的class的屬性上,這裡的value是對欄位的描述,example是取值例子,注意這裡的example很有用,對於前後端開發工程師理解文件起到了關鍵的作用,因為會在api文件頁面上顯示出這些取值來;這個註解還有一些欄位取值,可以自己研究,舉例說一個:position,表明欄位在model中的順序

以上這些就是最常用的幾個註解了。

相關推薦

實踐筆記Spring MVCRestful API使用 Swagger2 構建

1、Swagger2是什麼? Swagger 是一款RESTFUL介面的文件線上自動生成+功能測試功能軟體。 Swagger 是一個規範和完整的框架,用於生成、描述、呼叫和視覺化 RESTful 風格的 Web 服務。總體目標是使客戶端和檔案系統作為伺服器以同樣的速度來更新。檔案的方法,引數和模型緊密

Spring Security OAuth2筆記系列- 使用Spring MVC開發RESTful API 使用swagger自動生成html文件

使用swagger自動生成html文件 本節內容 使用swagger自動生成html文件 使用WireMock快速偽造restful服務 前後分離並行開發的時候(當然不是一個人從前到後都幹那種);那麼提供文件就很有必要了。 光看文件不是那麼的直觀。偽

筆記Spring MVC攔截入參、出參實現入參解密,出參加密統一管理

需求:為提高介面的安全性,對資料傳輸加密。 前提:Controller層使用@RequestBody接收入參,@ResponseBody出參 入參解密 package com.sep6th.base.core.advice; import java.lang.re

SpringMVC之FreeMark(一)spring mvc使用freemark的方法

    模板技術在現代的軟體開發中有著重要的地位,而目前最流行的兩種模板技術恐怕要算freemarker和velocity了,webwork2.2對兩者都有不錯的支援,也就是說在webwork2中你可以隨意選擇使用freemarker或velocity作為view,模板

開發者筆記按List存放對象的某一字段計數的問題

true value right 過大 java block package 技術 display   如題,假設有如下表t_info: name  date info a 20127-12-20 xxxx描述 b 20127-1

java學習spring mvc 公共dao的實現,定義基本的增刪改查

pri 代碼 部分 lec sse encoding del epo repos 接口類:    package com.blog.db.dao; import com.blog.util.Pagination; import java.util.Lis

學習筆記Spring AOP註解使用總結

trace -a tid nat 修改 with this throwable pid Spring AOP基本概念 是一種動態編譯期增強性AOP的實現 與IOC進行整合,不是全面的切面框架 與動態代理相輔相成 有兩種實現:基於jdk動態代理、cglib Spring

Java筆記IO流四種檔案複製方式效率比較

位元組流檔案複製方式: (1)位元組流讀寫單個位元組 (2)位元組流讀寫位元組陣列 (3)位元組緩衝流讀寫單個位元組 (4)位元組緩衝流讀寫位元組陣列 import java.io.BufferedInputStream; import java.io.BufferedOutpu

Java筆記IO流檔案複製及異常處理

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class Main

讀書筆記Web開發的跨域

文章:為什麼給你設定重重障礙?講一講Web開發中的跨域 總結: 一、什麼是跨域?     二、為什麼不讓跨域? 因為在web互動的環境中,只能保證請求發自某個使用者的瀏覽器,卻不能保證請求本身是使用者自願發出的, 這就是跨站請求偽造(CSR

產品筆記產品工作Android和iOS差異

移動網際網路時代,移動端產品的規劃設計是大多數產品經理的必修課。廣義來說,移動端產品主要包含iOS端App、Android端App、微信端H5、小程式、WAP版H5以及平板端App(HD版),本文主要就前兩種——Android和iOS手機端App 在產品工作中應該注意的一些差

oracle筆記關於windows安裝Oracle的SQLPlus

windows中安裝Oracle的SQLPlus 說明一下: 由於自己在伺服器上安裝了一個oracle資料庫,但是資料庫中只有資料庫,也就是沒有任何客戶端等介面,我在本地安裝的pl/sql等一些連線工具,但是突然想在伺服器做一些工作,因為這樣伺服器上跑查詢資料命令自己就可

學習筆記在Chrom除錯TypeScript時禁止快取

在除錯時,開啟瀏覽器重新整理,依然是舊的資料,這給除錯帶來麻煩。 可以按以下方法做,禁用瀏覽器的快取。 禁用快取的步驟如下: 先按F12,再按F1, 勾選 Disable cache (whi

Spring mvcRestful API

clas 處的 ati code ans 指定 reat get 不能 Spring mvc之Restful API 這是一個路徑,http://127.0.0.1:8080/OperationAPI/v0.1/pins/3是API的具體網址。在RESTful架構中,每個網

使用Spring MVC開發RESTful API(續)

描述 多線程 用戶 接收http esp 訂單號 開始 邏輯 配置 使用多線程提高REST服務性能 異步處理REST服務,提高服務器吞吐量 使用Runnable異步處理Rest服務 AsyncController.java @RestController @GetMapp

基於spring mvcRestful API示例

在之前的文章中我們介紹瞭如何理解RESTful  API,這裡為了讓大家更好的理解restful架構風格,開始之前先介紹幾個spring mvc的註解: @RestController 我們通常使用ajax+json實現restful架構風格,請求和響應的資料都使用json格

ContextLoaderListener和Spring MVC的DispatcherServlet載入內容的區別

原文地址:https://blog.csdn.net/py_xin/article/details/52052627 ContextLoaderListener和DispatcherServlet都會在Web容器啟動的時候載入一下bean配置.  區別: DispatcherServle

Spring學習筆記SpringApplication Context和Servlet Context的區別

1. Servlet Context It is initilized when an servlet application is deployed. Servlet Context holds all the configurations (init

spring mvcSpring MVC配置過濾器並在過濾器使用bean

使用springMVC的專案,web.xml一般是這樣的: <servlet>     <servlet-name>spring</servlet-name>     <servlet-class>org.sprin

SpringSpring MVC原理及配置詳解

進行 return sub sca scrip uil 線程安全 松耦合 必須 1.Spring MVC概述: Spring MVC是Spring提供的一個強大而靈活的web框架。借助於註解,Spring MVC提供了幾乎是POJO的開發模式,使得控制器的開發和測試更加簡