Gin與OpenAPI(Swagger)的使用

一、背景

1、swagger與openapi

??????Swagger:? ? ? ?

????????一種用于描述RESTFUL API的規范,它提供了一種簡單的來描述API的請求和相應參數、錯誤碼、返回數據類型等信息,是開發者可以方便了解API使用方式。

? ? ? ? ?官網:?https://swagger.io/

?????OpenAPI :

????????始于 Swagger 規范,Swagger 規范已于 2015 年捐贈給 Linux 基金會后改名為 OpenAPI,并定義最新的規范為 OpenAPI 3.0。
????????OpenAPI 規范(OAS)是一種通用的、和編程語言無關的 API 描述規范,使人類和計算機都可以發現和理解服務的功能,而無需訪問源代碼、文檔或針對接口進行嗅探。正確定義后,使用者可以使用最少的實現邏輯來理解遠程服務并與之交互。

? ? ? ? 官網:?https://www.openapis.org/

2、API設計優先的理念優勢

? ? ? ? 我們在實際前后端開發的過程中,其實前后端可以并行開發,這樣可以縮短我們的項目工期,提高工作效率。但是,并行工作的前提是,前端知道后端要返回怎么樣的接口數據,后端知道前端需要怎么樣的數據。? 由此, 前后端必須先對API結構進行一個"約定", 約定需要哪些接口、接口的URL、接口的參數、接口的響應等參數,明確后,雙方基于這個接口文檔/接口約定進行開發。

? ? ? ? 但是前端,開發過程中,后端接口還沒做好,怎么對接呢? 此時由于我們已經將接口內容定下來了,所以,此時我們希望有一種工具能夠給一些模擬的數據,前端先針對這些模擬數據進行Mock開發。 最后前后端開發差不多了,直接將API的URL地址改為后端地址,即可完成開發,轉而進行后續測試、部署,極大提高了我們的開發效率。

? ? ? ? 所以一般前后端開發基于OpenAPI的方式,步驟如下:

? ? ? ? 1、API設計優先的理念就是, API是一份前后端開發的”契約”, 前后端先進行數據接口展示和獲取的定義, 也就是定義輸入、正常輸出、異常輸出等情況API的輸入參數、輸出數據格式。 最后雙方再基于API契約進行代碼的實現

? ? ? ? 2、后端根據API接口進行編碼, 前端可以通過Mock程序模擬后端返回(按照API定義的請求、響應數據類型格式)進行隨機數填充

? ? ? ? 3、前后端可以同時基于契約進行并行開發,最后前后端都開發OK了,前端再將API地址從Mock服務器改為測試服務器地址,最后進行調試整合即可

二、API設計的相關工具

? ? ? ? 關于API設計的相關工具可以參考這個站點:?https://openapi.tools/

1、API文檔可視化編輯器(stoplight-studio)

? ? ? ? 如果我們是手動編輯OpenAPI的yaml文檔來生成接口文檔,這個確實效率比較低。人工編寫API的yaml文件,工作量太大,我們可以使用可視化工具對OpenAPI的規范文件進行設計, 最終生成yaml文件. 此時,我們期望有一種可視化工具,通過可視化工具配置,即可完成這個過程。那么這個工具就是stoplight-studio:? ? ?

2、提供給消費者(前端)的Mock服務工具(Prism)

? ? ? ? 前面我們講過,前端不能干等著后端開發完所有接口才能開始進行對接。那么此時,我們前端需要獲取后端的模擬數據,這個Mock工具就是Prism。 它可以根據我們定義的OpenAPI文檔,數據的響應格式、數據類型,返回模擬數據進行填充,這樣就模擬完成前后端對接的工作。 無須等待后端全部完成工作才進行對接。 最后很簡單,當前后端完成后,前端將URL地址換成后端地址即可.

3、提供給生產者(后端)的Code代碼生成工具(OpenAPI Generator)

? ? ? ? 針對后端來說,我們需要根據OpenAPI的URL、參數、響應編寫后端代碼。 此時后端的同學也想提高效率,有沒有根據文檔一鍵生成后端框架代碼的工具呢? 答案是肯定的。 例如Golang的Gin框架,可以通過此工具根據OpenAPI的文檔yaml文件生成route路由代碼,可以提高我們的工作效率。

?三.代碼轉OpenAPI文檔

1、優勢

? ? ? ? 這個工具是我們場景的應用場景。 我們后端在編寫接口的時候,往往都會將這個接口的相關文檔編寫到一個專門記錄這些接口的文檔工具進行記錄。例如Yapi等這些平臺。

? ? ? ? 但是這種方式往往存在一些問題,那就是,每次更新完代碼以后,忘記更新了Yapi的文檔或者漏更新了文檔,導致文檔和最新代碼不一致。

? ? ? ? 此時我們可以借助代碼框架集成swagger、openapi的方式,通過編寫代碼的時候,順帶通過注解的方式,將接口的相關信息寫上,最后在發布項目的時候,自動生成swagger文檔,這樣可以有利于對文檔的實時更新,寫代碼的時候順帶將文檔寫上了,一舉兩得。

2、Gin框架配置Swagger

開源項目地址:?https://github.com/swaggo/gin-swagger

1、安裝依賴

go install github.com/swaggo/swag/cmd/swag@latest
go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

2、swag init初始化docs目錄

執行命令: swag init
會生成docs目錄, 目錄里存在swagger api的yaml配置文件以及json相關文件

3、接口添加相關注解

4、main.go配置swagger路由信息

5、swag init 且 運行程序(每次代碼更新,需要swag init生成新的文檔)

四、總結

? ? ? ? 從上文我們可以發現OpenAPI的文檔yaml可以轉換為對應框架的代碼, 對應的框架代碼也可以生成yaml文檔。

? ? ? ? 其實除了上面說的:

????????1、基于文檔契約,前后端可以并行工作

? ? ? ? 2、文檔和代碼可以直接放在一起進行維護,保持文檔與代碼的準確性

? ? ? ? 其實還有一種場景,例如之前你們一直按照這種OpenAPI或者Swagger的方式進行開發,最初使用的是PHP、或者Python, 現在由于業務發展, 需要更加高性能的實現, 轉換為Go或者Java, 那么此時,我們只需要拿到OpenAPI/Swagger的yaml文件,通過工具生成對應Go、Java框架路由代碼, 參數、路由、響應數據格式都一鍵生成,自己再實現接口邏輯即可。

? ? ? ? 不需要自己再慢慢看文檔來從頭到尾實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15049.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15049.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15049.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gazebo仿真不起飛——QGC地面站查看下是否參數正確

檢查方法:打開QGC地面站查看是否能夠切入定點模式,不能的話查看定位數據來源參數

uniapp(微信小程序)退出小程序方法

一、描述 場景是:當用戶不予授權的時候,不允許使用該小程序,在用戶點擊取消之后,應該關閉當前小程序,不讓他繼續使用。 二、代碼 uni.exitMiniProgram({success: function() {console.log(退出小程序成功);},fail: …

鴻蒙HarmonyOS實戰-Stage模型(信息傳遞載體Want)

🚀前言 應用中的信息傳遞是為了實現各種功能和交互。信息傳遞可以幫助用戶和應用之間進行有效的溝通和交流。通過信息傳遞,應用可以向用戶傳遞重要的消息、通知和提示,以提供及時的反饋和指導。同時,用戶也可以通過信息傳遞向應用…

FPGA 第4章 攝像頭Bayer轉rgb

參考文獻 彩色MT9V034攝像頭 Bayer轉rgb FPGA實現 https://www.cnblogs.com/hqz68/p/10413896.html 文章目錄 前言Bayer轉rgb算法解析 總結 前言 Bayer格式是相機內部的原始數據, 一般后綴名為.raw。 對于彩色圖像,一般是三原色數據,rgb格式。但是攝像頭一個像素…

【linux-IMX6ULL-LED字符驅動框架完善】

目錄 1.簡介2.前置知識2.1 重要函數及結構體2.2 程序框架流程 3. 代碼詳解: 1.簡介 在上節,我對linux-IMX6ULL-字符設備驅動簡單框架實驗進行了說明和構建,但是也存在幾個問題; 需要手動指定設備號,不能自…

TCP 與 UDP

0. tcp 與 udp 的 異同特性 TCPUDPname傳輸控制協議用戶數據報協議面向連接? 需要 傳輸數據前建立連接傳輸完畢后斷開連接不需要可靠的傳輸數據? 可靠 有確認機制(三次握手) 有確認、窗口、重傳、擁塞控制的機制保證數據可靠傳輸…

itertools拼裝迭代器

itertools拼裝迭代器 連接多個迭代器 內置的itertools模塊有一些函數可以把多個迭代器連城一個使用。 chain chain可以把多個迭代器從頭到尾連成一個迭代器。 import itertoolsit itertools.chain([1, 2, 3], [4, 5, 6]) print(list(it))>>> [1, 2, 3, 4, 5, 6]…

操作視頻號小店,新手最關心的問題,一篇給你講解清楚!

大家好,我是電商小V 新手去做視頻號小店的時候,心里面一定是有很多疑問的,會反復咨詢一些最關心的問題,因為他們要做好準備,以防后續做店過程中出現問題,其實新手關心的問題就那幾個,咱們今天就…

C++貪心算法3

過河的最短時間 #include<bits/stdc.h> using namespace std; void f(int); int n; int main() {system("color 1");cin>>n;int a[10010];for(int i0;i<n;i){cin>>a[i];}sort(a0,an);int ta[1];int k1n-2;int k2n-1;while(true){int t1a[0]a[k…

springboot2+mybatis-plus+vue3創建入門小項目[學生管理系統]02[實戰篇]

創建一個 vue 項目 創建這個新的文件夾 創建前端項目 eggbox 數據庫 SQL CREATE DATABASE IF NOT EXISTS egg DEFAULT CHARACTER SET utf8 COLLATE utf8_bin; USE egg;CREATE TABLE stu (id INT AUTO_INCREMENT, -- 自增主鍵name VARCHAR(64) NOT NULL, -- 非空姓名字段&a…

前端傳參的三種方式

1、params 傳參 參數拼接在地址 url 的后面給后臺&#xff1b;地址欄中可見 案例1 地址欄&#xff1a;https://xxxxxxxx/admin/clues/detail?id558 接口代碼&#xff1a; export function getClueDetail(query: any) {return request<clueItem>({url: /clues/detai…

Java:圖書管理系統

目錄 一.book 1.在book包中的Book 類用來定義和引用書的名字&#xff0c;作者&#xff0c;價格&#xff0c;類型等。 2.在book包中的第二個類是BookList是用來構建書架&#xff0c;和書架上的初始書本&#xff0c; 二、ioperations 1.AddOperation (增加圖書) 2.BorrowOp…

保研機試算法訓練個人記錄筆記(七)

輸入格式&#xff1a; 在第1 行給出不超過10^5 的正整數N, 即參賽&#xff5d;人數。隨后N 行&#xff0c;每行給出一位參賽者的 信息和成績&#xff0c;包括其所代表的學校的編號&#xff08;從1 開始連續編號&#xff09;及其比賽成績&#xff08;百分制&#xff09;&#xf…

Linux環境基礎開發工具的使用(yum,vim,gcc/g++,make/Makefile,gdb)

Linux 軟件包管理器-yum 什么是軟件包及安裝方式 在Linux下安裝軟件, 一個通常的辦法是下載到程序的源代碼, 并進行編譯, 得到可執行程序。 但是這樣太麻煩了, 于是有些人把一些常用的軟件提前編譯好, 做成軟件包(可以理解成windows上的安裝程序)放在一個服務器上, 通過包管理…

數據結構——棧(詳細分析)

目錄 &#x1f349;引言 &#x1f349;棧的本質和特點 &#x1f348;棧的基本操作 &#x1f348;棧的特點 &#x1f34d;后進先出 &#x1f34d;操作受限 &#x1f34d;動態調整 &#x1f348;棧的優缺點 &#x1f34d;優點 &#x1f34d;缺點 &#x1f349;棧的應用…

002 遞歸評論 mongodb websocket消息推送

文章目錄 商品評論CommentController.javaComment.javaCommentServiceImpl.javaCommentRepository.javaCommentService.javaWebSocketConfig.javaWebSocketProcess.javaapplication.yamlproductReview.htmlindex.htmlindex.jsindex.css 訂單評論EvaluateMapper.xmlEvaluateMapp…

從零手寫實現 nginx-01-為什么不能有 java 版本的 nginx?

前言 大家好&#xff0c;我是老馬。很高興遇到你。 作為一個 java 開發者&#xff0c;工作中一直在使用 nginx。卻發現一直停留在使用層面&#xff0c;無法深入理解。 有一天我在想&#xff0c;為什么不能有一個 java 版本的 nginx 呢&#xff1f; 一者是理解 nginx 的設計…

HTTP 協議中 GET 和 POST 有什么區別?分別適用于什么場景?

HTTP 協議中 GET 和 POST 是兩種常用的請求方法&#xff0c;它們的區別如下: 1. 參數傳遞方式不同 GET 請求參數是在 URL 中以鍵值對的形式傳遞的&#xff0c;例如:http://www.example.com/&#xff1f;key1value1&k ey2value2。 而 POST 請求參數是在請求體中以鍵值對的…

SQOOP詳細講解

SQOOP安裝及使用 SQOOP安裝及使用SQOOP安裝1、上傳并解壓2、修改文件夾名字3、修改配置文件4、修改環境變量5、添加MySQL連接驅動6、測試準備MySQL數據登錄MySQL數據庫創建student數據庫切換數據庫并導入數據另外一種導入數據的方式使用Navicat運行SQL文件導出MySQL數據庫impo…

數據訪問與Spring Data JPA

數據訪問與Spring Data JPA 在現代Java應用程序中&#xff0c;持久化數據是核心功能之一。Spring Data JPA&#xff08;Java Persistence API&#xff09;為開發者提供了一種簡單且高效的方式來訪問和操作數據庫。在本博文中&#xff0c;我將向您展示如何使用Spring Data JPA來…