Spring Security技術棧開發企業級認證與授權(七)使用Swagger自動生成API文件
由於
Spring Boot
能夠快速開發、便捷部署等特性,相信有很大一部分Spring Boot
的使用者會用來構建RESTful API
。而我們構建RESTful API
的目的通常都是由於多終端的原因,這些終端會共用很多底層業務邏輯,因此我們會抽象出這樣一層來同時服務於多個移動端或者Web
前端。本文將介紹RESTful API
的重磅好夥伴Swagger2
,它可以輕鬆的整合到Spring Boot
中,並與Spring MVC
程式配合組織出強大RESTful API
文件。它既可以減少我們建立文件的工作量,同時說明內容又整合入實現程式碼中,讓維護文件和修改程式碼整合為一體,可以讓我們在修改程式碼邏輯的同時方便的修改文件說明。另外Swagger2
也提供了強大的頁面測試功能來除錯每個RESTful API
。此引用來自程式猿DD。
在Spring Boot
中應用中Swagger2
構建強大的API
文件十分方便,只需要在專案中新增Swagger2
的依賴,然後在Spring Boot
的啟動的main
方法的類上加上註解@EnableSwagger2
就可以完成構建工作。效果圖如下:
在圖中可以看出,我自定義的Controller
只有FileController
,而其他的都是Spring Boot
的一些控制器,而這些API
文件往往是我們不需要的,所以,僅僅使用Swagger2
的預設方式顯然是不能滿足我們的需求的,所以,我們需要自定義Swagger
新增依賴
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId >
<version>2.8.0</version>
</dependency>
配置Swagger
我們寫一個Swagger
的配置類,新增上@Configuration
註解方便被Spring Boot
配置,新增@EnableSwagger2
註解啟動Swagger
文件構建能力。需要注意的是,一般配置類可以放在Spring Boot
啟動類的同一個包裡,如果沒有放,那麼請在Spring Boot
的啟動類上新增包掃描註解@ComponentScan(basePackages = {"com.lemon.security"})
,然後配置類可以放在任何的這個包的子包下面。
package com.lemon.security.web.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
/**
* @author lemon
* @date 2018/4/3 下午1:01
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestfulApiDocs() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.lemon.security.web.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("自定義RESTful API文件")
.description("更多內容請關注CSDN部落格:https://blog.csdn.net/Lammonpeter")
.termsOfServiceUrl("https://blog.csdn.net/Lammonpeter")
.contact(new Contact("Lemon", "https://blog.csdn.net/Lammonpeter", "[email protected]"))
.version("1.0.0")
.build();
}
}
對上面的程式碼有如下解釋:
通過createRestfulApiDocs
方法建立Docket
的Bean
之後,apiInfo()
用來建立該API
的基本資訊(這些基本資訊會展現在文件頁面中)。select()
函式返回一個ApiSelectorBuilder
例項用來控制哪些介面暴露給Swagger
來展現,本例採用指定掃描的包路徑來定義,Swagger
會掃描該包下所有Controller
定義的API
,併產生文件內容(除了被@ApiIgnore
指定的請求)。
新增文件內容
在完成了上述配置後,其實已經可以生產文件內容,但是這樣的文件主要針對請求本身,而描述主要來源於函式等命名產生,對使用者並不友好,我們通常需要自己增加一些說明來豐富文件內容。如下所示,我們通過@ApiOperation
註解來給API
方法增加說明,通過@ApiImplicitParams
、@ApiImplicitParam
註解來給引數增加說明,通過@ApiModelProperty
註解來給實體類的屬性增加說明。
- 給
Controller
新增文件說明:
package com.lemon.security.web.controller;
import cn.hutool.core.io.IoUtil;
import com.lemon.security.web.dto.FileInfo;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
* @author lemon
* @date 2018/4/2 下午2:19
*/
@RestController
@RequestMapping("/file")
public class FileController {
private static String folder = "/Users/lemon/IdeaProjects/spring-security/lemon-security-demo";
@PostMapping
@ApiOperation(value = "檔案上傳介面", notes = "訪問此介面可以實現檔案上傳")
@ApiImplicitParam(name = "file", value = "使用MultipartFile的例項物件來接收檔案資料", required = true, dataTypeClass = MultipartFile.class)
public FileInfo upload(@RequestParam("file") MultipartFile file) throws IOException {
System.out.println("上傳檔案的表單name值為:" + file.getName());
System.out.println("檔案路徑為:" + file.getOriginalFilename());
System.out.println("檔案大小為:" + file.getSize());
File localFile = new File(folder, System.currentTimeMillis() + ".txt");
// 執行上傳操作
file.transferTo(localFile);
return new FileInfo(localFile.getAbsolutePath());
}
@GetMapping("/{id}")
@ApiOperation(value = "檔案下載介面", notes = "訪問此介面並提供檔案ID即可下載檔案")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "檔案ID", required = true, dataTypeClass = String.class),
@ApiImplicitParam(name = "request", value = "HttpServletRequest例項物件,自動注入,無需傳遞", required = true, dataTypeClass = HttpServletRequest.class),
@ApiImplicitParam(name = "response", value = "HttpServletResponse例項物件,自動注入,無需傳遞", required = true, dataTypeClass = HttpServletResponse.class)
})
public void download(@PathVariable String id, HttpServletRequest request, HttpServletResponse response) {
System.out.println(folder);
try (
// 這是JDK7的特性,關於流的操作,可以寫在try後面的圓括號裡,這樣就無需手動關閉流
InputStream inputStream = new FileInputStream(new File(folder, id + ".txt"));
OutputStream outputStream = response.getOutputStream()
) {
// 設定下載的檔案型別
response.setContentType("application/x-download");
// 設定下載後的檔名
response.setHeader("Content-Disposition", "attachment;filename=test.txt");
IoUtil.copy(inputStream, outputStream);
// 重新整理輸出流
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
其中,
@ApiOperation
註解的value
屬性一般都是簡單描述API
的功能,notes
屬性詳細描述API
的功能;
@ApiImplicitParams
用來描述一個方法的多個引數的註解;
@ApiImplicitParam
用來表述單個引數,name
屬性來描述引數的名稱,value
用來描述引數的意思,required
表示引數是否是必需值,dataTypeClass
或者dataType
指定了資料的型別。
這裡僅僅是對註解進行說明,而程式碼本身來自上一節內容,即《Spring Security技術棧開發企業級認證與授權(六)使用REST方式處理檔案服務》。
- 給實體類新增文件說明:
package com.lemon.security.web.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author lemon
* @date 2018/4/2 下午2:24
*/
@Data
public class FileInfo {
@ApiModelProperty(value = "檔案上傳後的檔案路徑")
private String path;
public FileInfo(String path) {
this.path = path;
}
}
其中,@ApiModelProperty
用來描述引數的意義。
配置完成以後,執行Spring Boot
應用,在位址列訪問http://localhost:8080/swagger-ui.html
就可以進入自定義的Swagger
文件介面,效果圖如下:
API
文件訪問與除錯
在上圖請求的頁面中,Swagger
除了檢視介面功能外,還提供了除錯測試功能,點選“Try it out!”
按鈕,即可完成了一次請求呼叫!此時,你也可以通過幾個POST
請求來驗證之前的POST
請求是否正確。相比為這些介面編寫文件的工作,我們增加的配置內容是非常少而且精簡的,對於原有程式碼的侵入也在忍受範圍之內。因此,在構建RESTful API
的同時,加入Swagger
來對API
文件進行管理,是個不錯的選擇。
Spring Security技術棧開發企業級認證與授權系列文章列表:
示例程式碼下載地址:
專案已經上傳到碼雲,歡迎下載,內容所在資料夾為
chapter007
。
相關推薦
Spring Security技術棧開發企業級認證與授權(七)使用Swagger自動生成API文件
由於Spring Boot能夠快速開發、便捷部署等特性,相信有很大一部分Spring Boot的使用者會用來構建RESTful API。而我們構建RESTful API的目的通常都是由於多終端的原因,這些終端會共用很多底層業務邏輯,因此我們會抽象出這樣一層
Spring Security技術棧開發企業級認證與授權(五)使用Filter、Interceptor和AOP攔截REST服務
一般情況,在訪問RESTful風格的API之前,可以對訪問行為進行攔截,並做一些邏輯處理,本文主要介紹三種攔截方式,分別是:過濾器Filter、攔截器Interceptor以及面向切面的攔截方式AOP。 一、使用過濾器Filter進行攔截 使用過
Spring Security技術棧開發企業級認證與授權(九)開發圖形驗證碼介面
在設計登入模組的時候,圖形驗證碼基本上都是標配,本篇部落格重點介紹開發可重用的圖形驗證碼介面,該介面支援使用者自定義配置,比如驗證碼的長度、驗證碼圖形的寬度和高度等資訊。 本文的目標是開發一個圖形驗證碼介面,該驗證碼支援使用者自定義長度,以及生成圖片後
Spring Security技術棧開發企業級認證與授權(八)Spring Security的基本執行原理與個性化登入實現
正如你可能知道的兩個應用程式的兩個主要區域是“認證”和“授權”(或者訪問控制)。這兩個主要區域是Spring Security的兩個目標。“認證”,是建立一個他宣告的主題的過程(一個“主體”一般是指使用者,裝置或一些可以在你的應用程式中執行動作的其他系統)
Spring Security技術棧開發企業級認證與授權(一)環境搭建
Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr
Spring Security技術棧開發企業級認證與授權(十一)開發簡訊驗證碼登入
簡訊登入也是一種常見的登入方式,但是簡訊登入的方式並沒有整合到Spring Security中,所以往往還需要我們自己開發簡訊登入邏輯,將其整合到Spring Security中,使用Spring Security來進行校驗。本文將介紹開發簡訊登入的方法,
Spring Security技術棧開發企業級認證與授權
iyu 復雜 sha 日誌 開發app 一個 核心概念 並發 自動 Spring Security技術棧開發企業級認證與授權網盤地址:https://pan.baidu.com/s/1mj8u6JQ 密碼: 92rp備用地址(騰訊微雲):https://share.weiy
Spring Security技術棧開發企業級認證與授權 Spring Security開發安全的REST服務
第1章 課程導學 介紹課程內容、課程特點,使用的主要技術棧,以及學習課程所需的前置知識 1-1 導學 第2章 開始開發 安裝開發工具,介紹專案程式碼結構並搭建,基本的依賴和引數設定,開發hello world 2-1 開發環境安裝 2-2 程式碼結構介紹 2-3
Spring Boot(九)Swagger2自動生成介面文件和Mock模擬資料
一、簡介 在當下這個前後端分離的技術趨勢下,前端工程師過度依賴後端工程師的介面和資料,給開發帶來了兩大問題: <!--more--> 問題一、後端介面檢視難:要怎麼呼叫?引數怎麼傳遞?有幾個引數?引數都代表什麼含義? 問題二、返回資料操作難:資料返回不對或者不夠
【Spring Security OAuth2筆記系列】- 【使用Spring MVC開發RESTful API】 使用swagger自動生成html文件
使用swagger自動生成html文件 本節內容 使用swagger自動生成html文件 使用WireMock快速偽造restful服務 前後分離並行開發的時候(當然不是一個人從前到後都幹那種);那麼提供文件就很有必要了。 光看文件不是那麼的直觀。偽
.net core 認證與授權(一)
前言 .net core web並不是一個非常新的架構,很多文章提及到認證與授權這個過程,但是一般都會提及到裡面的方法怎麼用的,而不是模擬一個怎樣的過程,所以我打算記錄自己的理解。 什麼是認證?我們大學畢業有學士證書和畢業證書,來證明你是一個學士。 什麼是授權,比如說你被認證是我的朋友後,你可以拿著這個身份,
.net core 認證與授權(二)
前言 這篇緊接著一來寫的,在第一篇中介紹了認證與授權,同時提出了這套機制其實就是模擬現實中的認證與授權。 同樣這篇介紹在這套機制下,使用者資訊管理機制?這裡就會問了,上一篇中認證和授權不是都ok了嗎,怎麼會有一個管理機制呢?當然並不一定要使用下面這套機制,但是給了我們很大的啟發。 在上一結中我們頒發證書是這樣
.net core 認證與授權(三)
前言 在寫三上是在一的基礎上寫的,所以有沒有看過二是沒得關係的,在一中介紹了認證與授權,但是沒有去介紹拿到證書後怎樣去驗證授權。 概念性東西:在這套機制中,把這個許可權認證呢,稱作為policy。這個policy是怎麼樣的過程呢? 就像我前面說的,證書也認證了,policy做的是檢查你的證書中是否符合我心中的
Angular SPA基於Ocelot API閘道器與IdentityServer4的身份認證與授權(四)
在上一講中,我們已經完成了一個完整的案例,在這個案例中,我們可以通過Angular單頁面應用(SPA)進行登入,然後通過後端的Ocelot API閘道器整合IdentityServer4完成身份認證。在本講中,我們會討論在當前這種架構的應用程式中,如何完成使用者授權。 回顧 《Angular SPA基於Oc
SpringBoot開發詳解(八) -- 使用Swagger2構建API文件
API文件 文件在開發中的價值與作用: 作為一個開發人員,平時看得最多的恐怕就是各式各樣的文件了。並且在開發中我們也避免不了的需要自己去書寫文件,比如作為後臺開發人員,我們書寫最多的應該就是介面文件了。前端人員會按照我們給出的文件來進行前端開發,並且按照文件
spring-boot-route(六)整合JApiDocs生成介面文件
上一篇文章中介紹了使用Swagger生成介面文件,非常方便,功能也十分強大。如果非要說Swaager有什麼缺點,想必就是註解寫起來比較麻煩。如果我說有一款不用寫註解,就可以生成文件的工具,你心動了嗎?他就是我們今天的主角——JApiDocs。 下面我們一起來看看如何使用! ## 一、新增依賴 ```xm
【Spring-Security】【1】認證和授權
部分 完整 業務 代碼 參數 web 用戶訪問 設置 管理權限 【認證】 憑據為基礎的認證: 當你登錄 e-mail 賬號時,你可能提供你的用戶名和密碼。E-mail的提供商會將你的用戶名與數據中的記錄進行匹配,並驗證你提供的密碼與對應的記錄是不是匹配。這些憑證(用戶名和
全棧開發之HTML快速入門(一)
ack enter 提示 其他 red tle 顯示圖片 val password 一、HTML 是什麽? HTML 指的是超文本標記語言 (Hyper Text Markup Language) HTML 不是一種編程語言,而是一種標記語言 (markup lan
2016-06-26 發布 支付系統開發的實踐與思考(一)
接口 簡單的 單向 new 成了 異步通知 平臺 應收 技術分享 通常我們在開發手機 app 或網站時都會涉及到支付相關的業務場景,用戶只需要簡單的點擊下按鈕並輸入密碼,就完成了整個支付過程。那麽今天我們就來簡單聊一下一個完整的支
Android開發--圖形影象與動畫(四)--AnimationListener簡介
就像Button控制元件有監聽器一樣,動畫效果也有監聽器,只需要實現AnimationListener就可以實現對動畫效果的監聽,其中需要過載三個函式,就是下面的這幾個函式:private class MyListenr implements AnimationLis