日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swagger 入门使用

發布時間:2025/6/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swagger 入门使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

使用 Swagger 解決什么問題, 怎么使用 Swagger, 如何規范 go-swagger 的使用.

背景介紹

為了解決與后端對數據的的強耦合,? 使用 HTTP 接口進行解耦.

而 Swagger 一方面可以非常友好的對外展示接口, 文檔即接口, 另

一方面可以使用 go-swagger 自動生成部分 server 端代碼, 快速實現接口開發. 方便以后可以快速開發 HTTP 服務接口

主要內容

簡介

Swagger?是一個簡單但功能強大的?API 表達工具。

Swagger 使用?OpenAPI?規范(試圖通過定義一種用來描述API格式或API定義的語言,來規范RESTful服務開發過程).

使用 Swagger 生成 API,我們可以得到交互式文檔,自動生成代碼的 SDK 以及 API 的發現特性等。

wagger 主要包括三部分 Swagger API Spec,描述 Rest API 的語言。Swagger UI,將 Swagger API Spec 以 HTML 頁面展現出來的模塊。Swagger Editor,Swagger API Spec 的編輯器

為什么使用 swagger

主要是因為工作的核心在實時服務方面.

一方面: swagger能夠幫助我們節省編寫接口文檔的時間,提高我們開發時的效率.

另一方面: 保證文檔的即時性,準確性以及一致性, 減少不必要的溝通工作,?文檔都是同一份

另外一方面: 使用 go-swagger 自動生成部分代碼, 減少寫重復代碼.

go-swagger 簡介

go-swagger 是?Swagger?2.0?的 Go 語言實現。將 swagger 接口文檔生成客戶端、服務端代碼

怎么使用 Swagger

使用步驟

  • 使用 swagger-editor 定義 API
  • 使用 swagger-ui 展示 API 定義
  • 使用 go-swagger 生成代碼
  • 基于代碼增加業務處理邏輯
  • swagger-spec

    Swagger?使用 OpenAPI 規范開發 API。后來,?SmartBear Software 將?Swagger 規范捐贈給 Linux Foundation,并將規范重命名為OpenAPI規范。?SmartBear 成為OpenAPI Initiative(OAI)的創始成員,該機構以開放和透明的方式管理 OAS 的發展。

    簡而言之 Swagger 包含了一套 API 規范,并且提供一系列的生態組件
    OpenAPI = 規范
    Swagger = 實現規范的組件

    swagger-ui

    除官方提供的 swagger-ui 外, 還有一個Re-Doc, 界面交互我覺得更好一點, 但是存在一點的規范丟失.

    go-swagger?生成服務端、客戶端代碼

    swagger generate server --target? --name --spec ../../swagger.yaml?

    swagger generate client -f? swagger.yml -A? 應用名稱 -t 目錄

    如何自定義 handler

    可以在生成代碼的restapi.configure_*中手動將handler 的業務邏輯實現, 缺點是對生成的代碼有修改, 約束性較高.

    參考?kv-store?(官方推薦), 每一個 handler 都定義一個 struct.

    舉例說明

    接口列表

    重新生成回放

    批量查詢重新生成回放狀態

    查詢所有在線教師, 包括正在上課的老師以及在線的老師

    批量查詢連線信息

    批量查詢回放信息

    定時同步session 信息

    swagger 接口定義

    swagger: '2.0' info:description: '開放 API, 主要用于獲取連線相關的信息'version: 1.0.0title: Swagger Sessioncontact:name: zhanghaojieemail: zhanghaojie@iyunxiao.com externalDocs:description: Find out more about Swaggerurl: 'http://swagger.io' basePath: /v1/session tags:- name: sessiondescription: '連線信息' schemes:- http host: testhfsfd-sessions.haofenshu.com consumes:- application/json produces:- application/json paths:/playbackInfos: post:tags:- sessionsummary: '批量獲取回放信息'description: '如果請求內容中包含不存在的連線 ID, 響應中不會包含此 ID 的任何信息'operationId: getPlaybackInfosBySessionIdsparameters:- name: sessionIdsdescription: '連線 ID 的數組'in: bodyrequired: trueschema:$ref: '#/definitions/SessionIds'responses:'201':description: '請求成功'schema:type: objectproperties:result:type: stringdescription: '結果情況, success 代表成功, 其他 代表失敗'enum:- success- failexample:"success"msg:type: stringdescription: '對結果的描述'example:"獲取成功"data:type: arrayitems:$ref: '#/definitions/PlaybackInfo''500':$ref: '#/responses/Standard500ErrorResponse'/{sessionId}/playbackStatus/regeneration: put:tags:- sessionsummary: '重新生成回放'description: '重新生成回放'operationId: setPlaybackStatusToRegenerationparameters:- name: sessionIddescription: '連線 ID'required: truein: pathtype: stringresponses:'201':description: '請求成功'schema:type: objectproperties:result:type: stringdescription: '結果情況, success 代表成功, 其他情況 代表失敗'enum:- success- sessionNoFound- repeatSubmit- generatingexample:"success"msg:type: stringexample:"重新生成成功"'500':$ref: '#/responses/Standard500ErrorResponse'/playbackStatuses: post:tags:- sessionsummary: '批量獲取回放狀態信息'description: '如果請求內容中包含不存在的連線 ID, 響應中不會包含此 ID 的任何信息'operationId: getPlaybackStatusesBySessionIdsparameters:- name: sessionIdsdescription: '連線 ID 的數組'in: bodyschema:$ref: '#/definitions/SessionIds'responses:'201':description: '請求成功'schema:type: objectproperties:result:type: stringdescription: '結果情況, success 代表成功, 其他 代表失敗'enum:- success- failexample:"success"msg:type: stringdescription: '對結果的描述'example:"獲取成功"data:type: arrayitems:$ref: '#/definitions/PlaybackStatus''500':$ref: '#/responses/Standard500ErrorResponse'/teachers/{teacherStatus}:get:tags:- sessionsummary: '獲取不同狀態下所有的老師'operationId: getAllTeachersByStatusdescription: 'online 包含 inClass 中的老師'parameters:- name: teacherStatusdescription: 'online 表示在線的老師, inClass 表示連線中的老師'in: pathrequired: truetype: stringenum:- online- inClassresponses:'200':description: '請求成功'schema:type: objectproperties:result:type: stringdescription: '結果情況, success 代表成功, 其他 代表失敗'enum:- success- failexample:"success"msg:type: stringdescription: '對結果的描述'example:"獲取成功"data:type: arrayitems:type: string'500':$ref: '#/responses/Standard500ErrorResponse'/sessionInfosByRange: get:tags:- sessionsummary: '同步課堂信息, 通過傳入 連線 開始時間的時間區間'operationId: getSessionInfosByRangeparameters:- name: startin: queryrequired: truedescription: '連線 開始時間的起始時間戳(unix 時間戳(毫秒))'type: integerformat: int64- name: endin: queryrequired: truedescription: '連線 開始時間的截止時間戳(unix 時間戳(毫秒))'type: integerformat: int64responses:'201':description: '請求成功'schema:type: objectproperties:result:type: stringdescription: '結果情況, success 代表成功, 其他 代表失敗'enum:- success- failmsg:type: stringdescription: '對結果的描述'data:type: arrayitems:$ref: '#/definitions/SessionInfo''500':$ref: '#/responses/Standard500ErrorResponse'/sessionInfosBySessionIds: post:tags:- sessionsummary: '批量查詢連線信息'description: '如果請求內容中包含不存在的連線 ID, 響應中不會包含此 ID 的任何信息'operationId: getSessionInfoBySessionIdsparameters:- name: sessionIdsdescription: SessionId's arrayin: bodyrequired: trueschema:$ref: '#/definitions/SessionIds'responses:'201':description: '請求成功'schema:type: objectproperties:result:type: stringdescription: '結果情況, success 代表成功, 其他 代表失敗'enum:- success- failmsg:type: stringdescription: '對結果的描述'data:type: arrayitems:$ref: '#/definitions/SessionInfo''500':$ref: '#/responses/Standard500ErrorResponse' definitions:PlaybackStatus:type: objectrequired:- sessionId- statusproperties:sessionId:type: stringdescription: '數據庫 session 表中的 session 字段'example:"7210000"status:type: stringdescription: '回放狀態信息: <br>playbackNotGenerated 回放還未生成, 包括需要重新生成, 還未生成 <br>sessionNotExist 課程不存在 <br>sessionNotFinish 課程正在上課 <br>playbackFailedGenerated 回放生成失敗, 包括只有語音、只有畫圖等各種錯誤情況 <br>playbackSuccessGenerated 回放生成成功'default: sessionNotExistenum:- sessionNotExist- sessionNotFinish- playbackNotGenerated- playbackFailedGenerated- playbackSuccessGeneratedexample:"playbackSuccessGenerated"PlaybackInfo:type: objectrequired:- sessionIdproperties:sessionId:type: stringdescription: '回放視頻 ID'example:"7210000"status:type: stringdescription: '回放狀態信息: <br>sessionNotExist 課程不存在 <br>sessionNotFinish 課程正在上課 <br>playbackNotGenerated 回放還未生成, 包括需要重新生成, 還未生成 <br>playbackFailedGenerated 回放生成失敗, 包括音頻錯誤等各種錯誤情況 <br>playbackSuccessGenerated 回放生成成功, 存在下載地址, 視頻大小 <br>playbackNotVideo 老回放, 只有視頻地址 沒有下載地址'default: sessionNotExistenum:- sessionNotExist- sessionNotFinish- playbackNotGenerated- playbackFailedGenerated- playbackSuccessGenerated- playbackNotVideoexample:"playbackSuccessGenerated"videoUrl:type: stringdescription: '新回放的下載地址'example:"http://yx-fudao.ks3-cn-beijing.ksyun.com/testreplayer_data/7210000/7210000.mp4?Expires=1548152332&AWSAccessKeyId=AKLT6GLT4mf1RoiAY5DCcsd_3Q&Signature=zXSJNkX9C3ovtmPYwF3Y2fNcXdY%3D"videoSize:type: integerformat: int64default: -1description: '新回放的文件大小(單位: byte)'example:1026323expire:type: integerformat: int64description: '新回放下載地址的過期時間(unix 時間戳(毫秒))'example:1548507047292webUrl:type: stringdescription: '舊回放的直接播放地址'example:"testhfsfd-replayer.haofenshu.com/entry?sid=7210000"SessionInfo:type: objectrequired:- sessionIdproperties:sessionId:type: stringdescription: '數據庫 session 表中的 session 字段'example:"7210000"teacher:type: stringdescription: '老師的用戶名'example:"muyi"student:type: stringdescription: '學生的用戶名'example:"test014"status:type: stringdescription: '回放狀態信息: <br>playbackNotGenerated 回放還未生成, 包括需要重新生成, 還未生成 <br>sessionNotExist 課程不存在 <br>sessionNotFinish 課程正在上課 <br>playbackFailedGenerated 回放生成失敗, 包括只有語音、只有畫圖等各種錯誤情況 <br>playbackSuccessGenerated 回放生成成功'default: sessionNotExistenum:- sessionNotExist- sessionNotFinish- playbackNotGenerated- playbackFailedGenerated- playbackSuccessGeneratedexample:"playbackSuccessGenerated"classType:type: stringdescription: '課程類型, UnFormal 代表非正式課, Formal 代表正式課'enum:- UnFormal- Formalexample:"Formal"startTime:type: integerformat: int64description: '課程開始時間(unix 時間戳(毫秒))'example:1548085855endTime:type: integerformat: int64description: '課程結束時間(unix 時間戳(毫秒))'example:1548067573SessionIds:type: objectdescription: '連線 ID 的數組'required:- sessionIdsproperties:sessionIds:type: arrayuniqueItems: trueminItems: 1items:type: stringminLength: 1example:"7210000"example:["7210000","7210001","7210002","7210003","7210004","7210005"]Error:type: objectrequired:- messageproperties:message:type: stringexample:"database error" responses:Standard500ErrorResponse:description: '服務器內部異常'schema:$ref: '#/definitions/Error'

    接口定義規范

    go-swagger 會做部分業務校驗, 此時的返回碼是RESTful風格 的HTTP Code

    在 Swagger 中的描述性話語盡量使用中文. summary 使用簡單概述, description 盡可能描述清楚

    不必非得遵循 RESTful 風格. HTTP Method 僅使用 GET、POST、PUT 、DELETE 這些常用的方法, HTTP Code 也僅使用常用狀態碼

    接口保證好的擴展性

    個人思考

    個人思考

    為什么使用 Swagger

    選用 Swagger 的主要考慮點在代碼接口層跟接口文檔的統一, 并且我們的主要工作并不是以寫接口為主, 因此選用 Swagger 可以方便管理文檔與兼顧效率.

    Go 常用的 HTTP 框架如 Gin 與 Beego 都提供了對 Swagger 的支持,?但是需要將相應的注釋或注解編寫到方法上,再利用生成器自動生成說明Swagger文件. 他們將一些不是代碼相關的內容注入到代碼中, 增加部分冗余.

    go-swagger、gin、beego 的區別

    gin 在 Go 社區的流行度非常高, 遠高于其他. 流行程度可以方便問題的處理. beego 在國內來說是使用的人數也不錯, 但從論壇中看出大家開始放棄 Beego, 因為它的大而全.?go-swagger?使用的人數還是相當較少, 從官方文檔中看到使用go-swagger的一些項目中, 很多是使用它做 Client, 而非 Server.

    go-swagger 的默認路由是?naoina's denco, 官方的文檔中說明其是一個?ternary search tree, 相對于 gin 的?httprounter?中的?radix tree性能更好. (我也沒有測試). beego 相關的路由實現我未找到, 其支持正則匹配.?

    go-swagger 對 handler 的管理

    個人覺得這是一個很棘手的問題, 如果每個 handler 都寫一個 struct 其實現其接口方法, 如果接口越來越多, 導致 main 方法中對 API 注入越來越多, 并且一個接口一個 struct 這種方式, 個人還是覺得非常不優雅的.大家有什么好的方法可以提供建議.

    go-swagger 散失代碼的靈活性

    go-swagger 對 swagger spec 中的校驗有實現, 可以說非常的方便, 減少業務代碼的冗長. go-swagger 可以支持增加middleware, 進行一些功能擴展.

    使用框架必然會散失部分靈活性, 這是一個權衡的問題.

    總結

    Swagger 結合 go-swagger 可以快速的開發 API 接口, 并且可以實現代碼與接口文檔的一致, 保證接口的一致. 結合當前項目還是非常棒的選擇

    ?

    參考資料

  • Swagger Spec 結構
  • 如何編寫基于OpenAPI規范的API文檔
  • API接口管理之道
  • Go HTTP路由基準測試
  • 轉載于:https://www.cnblogs.com/Zereker/p/11390850.html

    總結

    以上是生活随笔為你收集整理的Swagger 入门使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲综合丁香 | 日韩av免费播放 | 久久精品国产大片免费观看 | 永久av在线免费观看 | 好吊视频一区二区三区四区 | 有码视频在线观看 | 精品福利影院 | 国产亚洲一区二区三区在线观看 | 蜜桃av免费看 | 超碰女人| 麻豆传媒一区二区 | 国产黑丝av | 大香蕉精品一区 | 国产色影院 | 国产精品电影在线观看 | 嫩草视频一区二区三区 | 东京干手机福利视频 | 久久极品视频 | 免费毛片网站 | 无人在线观看高清视频 单曲 | 国产ts人妖调教重口男 | 国内精品久久99人妻无码 | 欧美一区二区视频在线 | 人禽l交视频在线播放 视频 | 久久极品 | 中文字幕手机在线视频 | 午夜一区二区三区 | 韩国毛片一区二区三区 | 毛片毛片毛片毛片毛片毛片毛片 | 国产一级三级 | 精品久久久久久无码人妻 | 日日夜夜狠狠 | 亚洲一区二区精品 | 色桃网| 伊人成长网 | 成人精品在线观看 | 日本一二三区在线视频 | 亚洲av色香蕉一区二区三区 | 粉嫩av国产一区二区三区 | 日本成人福利视频 | 西西4444www大胆无码 | 深夜福利一区二区三区 | 黄色片在线观看视频 | av国产网站 | 蜜桃视频在线播放 | 中文字幕第2页 | 丰满岳跪趴高撅肥臀尤物在线观看 | 亚洲日批| 日本精品免费在线观看 | 抱着老师的嫩臀猛然挺进视频 | 欧美久久99 | 国产美女极度色诱视频www | 亚洲成人av免费在线观看 | 国产三级在线免费 | 黄色片子看看 | 亚洲成人三区 | 免费a级片在线观看 | 在线97视频 | 青草综合 | 影音先锋毛片 | 亚洲精品91在线 | 国产精品亚洲二区 | 刘亦菲毛片 | 丁香啪啪综合成人亚洲 | 国产日韩欧美日韩大片 | 欧美日韩激情一区 | jzz在线观看 | 国产一二三在线视频 | 少妇饥渴放荡91麻豆 | 亚洲精品成人a | 精品成人一区二区 | 国产第四页 | 国产成人精品国内自产拍免费看 | 在线观看日韩国产 | 成人看片泡妞 | 窝窝午夜视频 | 人妻无码一区二区三区免费 | 懂色一区二区三区免费观看 | 国产亚洲一区二区三区在线观看 | 色久天堂 | 国产91精品一区 | av色片 | 欧美特级特黄aaaaaa在线看 | 激情五月婷婷久久 | 亚洲一区二区三区在线视频 | 欧美成人a | 亚洲AV成人无码久久精品同性 | www.成人 | 男女做受视频 | 综合网在线视频 | 日韩精品极品视频 | 友田真希一区二区 | 深夜福利免费观看 | 色综合中文字幕 | 69人人| 亚洲无av在线中文字幕 | 欧美精品一二三 | 五月天在线 | 成人在线免费看视频 |