1. 程式人生 > >Spring Security技術棧開發企業級認證與授權(七)使用Swagger自動生成API文件

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方法建立DocketBean之後,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 BootSwagger2自動生成介面和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