精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

swagger-decorator:注解方式為 Koa2 應用動態(tài)生成 Swagger 文檔

開發(fā) 開發(fā)工具
我們希望能夠在編寫后臺代碼、添加注釋的同時,能夠自動地生成接口文檔;筆者比較熟悉 Spring 中以注解方式添加 Swagger 文檔的模式,不過 Java 庫的抽象程度一般較高,用起來也不怎么順手。

[[194553]]

目前我司服務端應用程序框架主要采用了 Java Spring 與 Node.js,而因為今年有很多的調研階段的產品線 Demo 發(fā)布,持續(xù)部署、接口文檔以及線上質量監(jiān)控這三個問題愈發(fā)突出。本文則主要針對接口文檔的實時發(fā)布進行一些探討;在前后端分離的今天,即使是由單人縱向負責某個業(yè)務流,也需要將前后端交互的接口規(guī)范清晰地定義并且發(fā)布,以保證項目的透明性與可維護性。理想的開發(fā)流程中,應當在產品設計階段確定好關鍵字段命名、數據庫表設計以及接口文檔;不過實際操作中往往因為業(yè)務的多變性以及人手的缺失,使得接口的定義并不能總是實時地在項目成員之間達成一致。如果要讓開發(fā)人員在更改接口的同時花費額外精力維護一份開發(fā)文檔,可能對于我司這樣的小公司而言存在著很大的代價與風險。軟件開發(fā)中存在著所謂 Single Source of Truth 的原則,我們也需要盡量避免文檔與實際實現的不一致造成的團隊內矛盾以及無用的付出。綜上所述,我們希望能夠在編寫后臺代碼、添加注釋的同時,能夠自動地生成接口文檔;筆者比較熟悉 Spring 中以注解方式添加 Swagger 文檔的模式,不過 Java 庫的抽象程度一般較高,用起來也不怎么順手。筆者在編寫我司 node-server-boilerplate 根據自己的想法設計了 swagger-decorator。此外,項目中使用 Flow 進行靜態(tài)類型檢測,并且遵循我司內部的 JavaScript 編程樣式指南

我們可以使用 npm 或者 yarn 安裝 swagger-decorator,需要注意的是,因為使用了注解,因此建議是配置 Webpack 與 Babel,不熟悉的同學可以直接參考 node-server-boilerplate

  1. $ yarn add swagger-decorator  
  2. # 依賴于 Babel 的 transform-decorators-legacy 轉換插件來使用 Decorator  
  3. $ yarn add transform-decorators-legacy -D 

安裝完畢之后,我們需要對項目中使用的路由進行封裝。目前筆者只是針對 koa-router 中的路由對象進行封裝,未來若有必要可以針對其他框架的路由解決方案進行封裝。我們首先需要做的就是在路由定義之前使用 wrappingKoaRouter 函數修飾 router 對象:

  1. import { wrappingKoaRouter } from "swagger-decorator"
  2.  
  3. ... 
  4.  
  5. const Router = require("koa-router"); 
  6.  
  7. const router = new Router(); 
  8.  
  9. wrappingKoaRouter(router, "localhost:8080""/api", { 
  10.   title: "Node Server Boilerplate"
  11.   version: "0.0.1"
  12.   description: "Koa2, koa-router,Webpack" 
  13. }); 
  14.  
  15. //定義默認的根路由 
  16. router.get("/", async function(ctx, next) { 
  17.   ctx.body = { msg: "Node Server Boilerplate" }; 
  18. }); 
  19.  
  20. //定義用戶處理路由 
  21. router.scan(UserController); 

該函數的參數說明如下,對于 info 的結構參考這里:

  1. /** 
  2.  * Description 將 router 對象的方法進行封裝 
  3.  * @param router 路由對象 
  4.  * @param host API 域名 
  5.  * @param basePath API 基本路徑 
  6.  * @param info 其他的 Swagger 基本信息 
  7.  */ 
  8. export function wrappingKoaRouter( 
  9.   router: Object, 
  10.   host: string = "localhost"
  11.   basePath: string = ""
  12.   info: Object = {} 
  13. ) {} 

值得一提的是,在封裝 router 時,筆者自定義了 scan 方法,其能夠根據自動遍歷目標類中的自定義方法,有點類似于 Java 中的 ComponentScan:

  1. /** 
  2. * Description 掃描某個類中的所有靜態(tài)方法,按照其注解將其添加到 
  3. * @param staticClass 
  4. */ 
  5. router.scan = function(staticClass: Function) { 
  6.     let methods = Object.getOwnPropertyNames(staticClass); 
  7.      
  8.     // 移除前三個屬性 constructor、name 
  9.     methods.shift(); 
  10.     methods.shift(); 
  11.     methods.shift(); 
  12.      
  13.     for (let method of methods) { 
  14.       router.all(staticClass[method]); 
  15.     } 
  16. }; 

準備工作完成之后,我們即可以開始定義具體的接口控制器;筆者不喜歡過多的封裝,因此這里選用了類的靜態(tài)方法來定義具體的接口函數,整個 Controller 也只是樸素函數。下面筆者列舉了常見的獲取全部用戶列表、根據用戶編號獲取用戶詳情、創(chuàng)建新用戶這幾個接口的文檔注釋方式:

  1. import { 
  2.   apiDescription, 
  3.   apiRequestMapping, 
  4.   apiResponse, 
  5.   bodyParameter, 
  6.   pathParameter, 
  7.   queryParameter 
  8. from "swagger-decorator"
  9. import User from "../entity/User"
  10.  
  11. /** 
  12.  * Description 用戶相關控制器 
  13.  */ 
  14. export default class UserController { 
  15.   @apiRequestMapping("get""/users"
  16.   @apiDescription("get all users list"
  17.   @apiResponse(200, "get users successfully", [User]) 
  18.   static async getUsers(ctx, next): [User] { 
  19.     ... 
  20.   } 
  21.  
  22.   @apiRequestMapping("get""/user/:id"
  23.   @apiDescription("get user object by id, only access self or friends"
  24.   @pathParameter({ 
  25.     name"id"
  26.     description: "user id"
  27.     type: "integer" 
  28.   }) 
  29.   @queryParameter({ 
  30.     name"tags"
  31.     description: "user tags, for filtering users"
  32.     required: false
  33.     type: "array"
  34.     items: ["string"
  35.   }) 
  36.   @apiResponse(200, "get user successfully"User
  37.   static async getUserByID(ctx, next): User { 
  38.     ... 
  39.   } 
  40.  
  41.   @apiRequestMapping("post""/user"
  42.   @apiDescription("create new user"
  43.   @bodyParameter({ 
  44.     name"user"
  45.     description: "the new user object, must include user name"
  46.     required: true
  47.     schemaUser 
  48.   }) 
  49.   @apiResponse(200, "create new user successfully", { 
  50.     status_code: "200" 
  51.   }) 
  52.   static async postUser(): number { 
  53.     ... 
  54.   } 

在對接口注解的時候,我們需要用實體類指明返回值或者請求體中包含的參數信息,因此我們也需要使用 swagger-decorator 提供的 entityProperty 注解來為實體類添加描述。值得一提的是,這里我們支持直接將 Object 作為描述對象的返回值,算是避免了 Java 中的一大痛點。

  1. // @flow 
  2.  
  3. import { entityProperty } from "swagger-decorator"
  4. /** 
  5.  * Description 用戶實體類 
  6.  */ 
  7. export default class User { 
  8.   // 編號 
  9.   @entityProperty({ 
  10.     type: "integer"
  11.     description: "user id, auto-generated"
  12.     required: false 
  13.   }) 
  14.   id: string = 0; 
  15.  
  16.   // 姓名 
  17.   @entityProperty({ 
  18.     type: "string"
  19.     description: "user name, 3~12 characters"
  20.     required: true 
  21.   }) 
  22.   name: string = "name"
  23.  
  24.   // 朋友列表 
  25.   friends: [number] = [1]; 
  26.  
  27.   // 屬性 
  28.   properties: { 
  29.     address: string 
  30.   } = { 
  31.     address: "address" 
  32.   }; 

對于沒有添加注解的屬性,swagger-decorator 會自動根據其默認值來推測類型。然后我們就可以正常地啟動應用,swagger-decorator 已經自動地為 router 對象添加了兩個路由,其中 /swagger 指向了 Swagger UI:

而 /swagger/api.json 指向了 Swagger 生成的 JSON 文檔:

【本文是51CTO專欄作者“張梓雄 ”的原創(chuàng)文章,如需轉載請通過51CTO與作者聯系】 

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2017-07-20 17:05:04

JavaScriptswagger-decSwagger

2023-03-08 08:48:50

Swag工具

2023-03-06 08:53:13

2018-08-23 16:18:59

2018-04-20 16:15:42

Koa2上傳下載

2023-09-21 10:44:41

Web服務Swagger前端

2020-12-07 06:05:34

apidocyapiknife4j

2022-02-16 08:21:11

JavaSwagger工具

2024-09-10 08:15:33

Asp項目API

2025-08-14 07:40:05

2016-10-31 14:16:33

node前后端分離koa

2025-09-03 04:15:00

Swagger@TagAPI

2023-08-09 08:37:44

2022-07-28 10:39:50

OpenApiSwaggerSpringDoc

2020-08-06 11:45:37

數據庫文檔Swagger

2025-08-04 02:11:00

2021-05-07 20:27:14

SpringBootSwagger3文檔

2021-01-18 06:19:31

SpringbooSwagger2配置

2022-01-26 07:53:07

koa2后端服務器

2022-07-21 11:04:53

Swagger3Spring
點贊
收藏

51CTO技術棧公眾號

欧美三级乱人伦电影| 99精品黄色片免费大全| 久久久精品日本| 亚洲妇女无套内射精| 黄色软件视频在线观看| 国产午夜精品久久久久久免费视 | 678在线观看视频| 久久久久久久久久看片| 成人激情黄色网| 精品91久久久| 欧美激情理论| 日韩大陆毛片av| 视频二区在线播放| 白浆在线视频| 亚洲美女屁股眼交| 日韩av电影免费在线| 午夜精品久久久久久久第一页按摩 | 亚洲美女av电影| 一级片免费在线观看视频| 中文字幕在线免费观看视频| 亚洲丝袜美腿综合| 欧美精品中文字幕一区二区| 午夜精品久久久久久久爽| 秋霞电影网一区二区| 韩国v欧美v日本v亚洲| 午夜激情视频在线播放| 久久97精品| 日韩欧美一二三四区| 亚洲第一中文av| 性感女国产在线| 亚洲国产成人精品视频| 吴梦梦av在线| 午夜视频在线观看网站| 久久夜色精品国产噜噜av| 97人人干人人| 国产美女免费看| 日本亚洲视频在线| 青青草99啪国产免费| 九九九免费视频| 亚洲最新色图| 日韩中文字幕久久| 亚洲黄色免费视频| 美日韩中文字幕| 亚洲精品国产精品国产自| 69久久精品无码一区二区| 亚洲成人高清| 欧美午夜视频网站| 成年人视频在线免费| 亚洲涩涩在线| 日韩欧美成人精品| 日韩视频第二页| 在线手机中文字幕| 欧美日韩在线视频观看| 青青青国产在线观看| av中文字幕在线看| 亚洲6080在线| 青青草视频在线免费播放 | 精品av一区二区| 亚洲乱码国产乱码精品精| 国产又粗又猛又色| 欧美一级三级| 亚洲天堂成人在线| 成年人在线免费看片| 成人在线免费观看视频| 中文字幕精品av| 免费在线观看a级片| 午夜性色一区二区三区免费视频| 欧美成人午夜激情视频| 精品一级少妇久久久久久久| 国产一区亚洲| 欧美一二三视频| 无码人妻aⅴ一区二区三区有奶水| 毛片一区二区| 国产欧美精品日韩| xxxx国产精品| 99国产欧美另类久久久精品| 日本不卡一区| 黄网站在线免费| 亚洲最大色网站| 免费在线a视频| a屁视频一区二区三区四区| 欧美日韩国产高清一区| 精品无码av一区二区三区不卡| av综合网址| 国产香蕉97碰碰久久人人| 国产在视频线精品视频| 欧美日本一区二区视频在线观看| 高清一区二区三区四区五区| 亚洲欧美自拍视频| 久久国产精品第一页| 91手机在线观看| 亚洲av激情无码专区在线播放| 欧美极品xxx| 国产欧美日韩小视频| 久久电影tv| 日韩一区二区三区免费看 | 亚洲福利视频导航| 男人搞女人网站| 日韩视频一二区| 亚洲日本中文字幕免费在线不卡| 希岛爱理中文字幕| 久久久久久黄| 亚洲va久久久噜噜噜| 亚洲色欧美另类| 自拍偷在线精品自拍偷无码专区| 国产极品粉嫩福利姬萌白酱| 国产一区二区三区视频在线| 亚洲欧美综合精品久久成人| 久久99久久98精品免观看软件 | 成人免费网视频| 午夜影院免费视频| 亚洲三级免费电影| 国内自拍视频网| 久久久久97| 成人97在线观看视频| 亚洲欧美另类在线视频| 国产成人高清在线| 亚洲日本精品一区| 成人免费网站视频| 亚洲黄色www| 日本中文在线视频| 日韩电影免费一区| 精品一区二区三区国产| 新版中文在线官网| 欧美精品色综合| 卡一卡二卡三在线观看| 国产精品美女| 国产欧美亚洲日本| 欧美亚洲系列| 欧美一卡2卡三卡4卡5免费| 亚洲一二三精品| 老司机免费视频久久| 精品日产一区2区三区黄免费| 三级网站视频在在线播放| 欧美一区二区三区四区五区| www中文在线| 日本色综合中文字幕| 免费一区二区三区在在线视频| 久草在线资源站资源站| 精品国产欧美一区二区| 欧美成人精品欧美一级| 国产激情一区二区三区桃花岛亚洲| 中文字幕一区二区三区最新 | 一区二区精品免费| 国产精品亚洲产品| 另类视频在线观看+1080p| segui88久久综合9999| 精品精品欲导航| 伊人国产在线观看| 99久久99久久综合| 日日橹狠狠爱欧美超碰| 天堂日韩电影| 欧亚精品中文字幕| 国产天堂素人系列在线视频| 91久久线看在观草草青青 | 综合久久久久久| 亚洲美女性囗交| 在线一区电影| 国产精品日韩欧美一区二区三区| 欧美hdxxx| 亚洲精品mp4| 天天操天天操天天操天天| 久久久久青草大香线综合精品| 成人午夜激情av| 亚洲成人av| 国产伦精品一区二区三区视频孕妇 | 国产综合色香蕉精品| www久久日com| 欧美精品一区二区三区很污很色的| 国产一级生活片| 久久久欧美精品sm网站| 免费看污污网站| 欧美不卡一区| 免费成人看片网址| 国产精品亚洲成在人线| zzijzzij亚洲日本成熟少妇| 国产欧美久久久精品免费| 亚洲综合色区另类av| 日本japanese极品少妇| 久久免费黄色| 精品免费久久久久久久| 日韩电影不卡一区| 国产精品视频久久久久| 久久青青色综合| 亚洲人成在线观| 国产福利免费视频| 欧美日韩在线影院| 日韩在线一卡二卡| jvid福利写真一区二区三区| 中文字幕第80页| 伊人成人在线视频| 神马影院一区二区| 99国产精品久久一区二区三区| 日产日韩在线亚洲欧美| а√天堂在线官网| 亚洲人成人99网站| 国模人体一区二区| 欧美日韩一区二区在线观看 | 成人手机在线免费视频| 久久精品国产一区二区三区免费看| 女人色极品影院| 欧美日韩久久精品| 好看的日韩精品视频在线| 成人毛片免费| 欧美在线性视频| 日韩特级毛片| 久久精品免费播放| 毛片网站在线观看| 精品国产凹凸成av人导航| 亚洲无码精品在线观看| 欧美日韩激情网| 麻豆成人在线视频| 国产精品美女视频| 免费看黄色av| 91欧美激情一区二区三区成人| 婷婷中文字幕在线观看| 免费在线观看日韩欧美| 精品国产一二三四区| 欧美福利在线| 国产又大又长又粗又黄| 精品日韩毛片| 欧美精品一区二区视频 | 亚洲成在人线av| 国产特级黄色片| 欧美视频一区在线| 国产一区二区视频网站| 午夜视黄欧洲亚洲| 久久久久久久久久久久国产| 中文字幕亚洲在| 国产探花视频在线播放| 久久蜜桃香蕉精品一区二区三区| 91精品人妻一区二区三区蜜桃2| 狠狠狠色丁香婷婷综合久久五月| 天美星空大象mv在线观看视频| 国产精品毛片| 无码精品国产一区二区三区免费| 亚洲精品视频啊美女在线直播| 黄色特一级视频| 欧美在线免费| 草草草视频在线观看| 国产一区日韩欧美| 被灌满精子的波多野结衣| 国产精品av一区二区| 免费看黄色a级片| 综合精品久久| 欧美一区二区视频在线播放| 国自产拍偷拍福利精品免费一 | 欧美人与性动交α欧美精品济南到| 久久午夜a级毛片| 18+视频在线观看| 欧美日韩高清区| jizzjizz中国精品麻豆| 久久久久久久国产精品| 91超碰在线播放| 97超级碰碰人国产在线观看| 亚洲一级少妇| 国产精品国产三级国产专播精品人| 日本免费久久| 国产精品色视频| 久久av偷拍| 国产一区二区三区四区五区加勒比| 激情视频极品美女日韩| 欧美人与物videos另类| 成人在线免费观看网站| 久久av秘一区二区三区| 欧美日韩天堂| 国内性生活视频| 免费看精品久久片| 三级网站免费看| 91免费在线看| x88av在线| 一区二区三区精密机械公司| 国产手机在线视频| 欧美性感一区二区三区| 国产精品区在线观看| 精品国产一区二区亚洲人成毛片 | 波多野结衣绝顶大高潮| 欧美日韩精品一区二区| 亚洲乱码精品久久久久..| 亚洲男人天堂手机在线| 黄色网址免费在线观看| 高清欧美性猛交| 精品176极品一区| 国严精品久久久久久亚洲影视| 国产日产精品一区二区三区四区的观看方式| 偷拍视频一区二区| 亚洲成人原创| 少妇网站在线观看| 99精品视频一区| 亚洲综合久久av一区二区三区| 亚洲自拍偷拍九九九| 色老头在线视频| 日韩欧美在线综合网| 男人天堂网在线| 久久成年人视频| 日本综合字幕| 97人人香蕉| 日韩中文首页| 人妻熟妇乱又伦精品视频| 激情综合网最新| 九色porny自拍视频| 一二三四社区欧美黄| 这里只有精品免费视频| 精品国产一区二区三区四区四| 天天在线视频色| 日本中文字幕久久看| youjizz亚洲| 久久久久亚洲av无码专区喷水| 亚洲激情不卡| gogo亚洲国模私拍人体| 欧美国产激情二区三区| 日本一级黄色大片| 欧美一区二区三区婷婷月色| 成人欧美亚洲| 欧美一区二区三区……| 51社区在线成人免费视频| 中文有码久久| 天堂影院一区二区| 噜噜噜在线视频| 亚洲成人av电影在线| 国产福利资源在线| 久久夜精品va视频免费观看| 日韩高清不卡| 欧美精品七区| 久久成人在线| xxxwww国产| 亚洲午夜久久久久| 国产激情视频在线播放| 久久精品成人动漫| 久久天天久久| 一本一生久久a久久精品综合蜜| 丝袜诱惑亚洲看片| 国产全是老熟女太爽了| 欧美性感美女h网站在线观看免费| 欧美性猛交 xxxx| 欧美日韩国产va另类| 人人爱人人干婷婷丁香亚洲| 亚洲精品成人久久久998| 日本欧美韩国一区三区| 成人国产精品久久久网站| 在线影视一区二区三区| 国产在线观看精品一区| 日本一区二区不卡| 欧美日韩一二三四| 中文字幕在线导航| 中文无字幕一区二区三区| 日本视频www色| 色偷偷91综合久久噜噜| 国产精品国产亚洲精品| 裸体裸乳免费看| 国产成人免费视频网站| 久久精品女人毛片国产| 精品久久久久久久久久久院品网 | 激情文学一区| 在线免费观看污视频| 欧美性生交大片免网| 国产黄在线观看免费观看不卡| 国产精品嫩草视频| 天天射天天综合网| 日本少妇一级片| 欧美日韩国产一区中文午夜| 日本福利片高清在线观看| 国产成人免费av| 99精品视频精品精品视频 | 99精品视频一区| 无码人妻一区二区三区免费| 中文字幕免费精品一区| 国产午夜精品一区在线观看| 91成人综合网| 久久久久88色偷偷免费| 奴色虐av一区二区三区| xxxx性欧美| 国产厕拍一区| 无人在线观看的免费高清视频| 中文字幕一区免费在线观看| 国产浮力第一页| 国产成人精品久久二区二区91| 国产高清欧美| 女同性恋一区二区三区| 欧美怡红院视频| 日本欧美电影在线观看| 欧美日韩一区二区三| 国产福利精品一区二区| 一级片中文字幕| 日韩一区二区久久久| 国产亚洲精品美女久久| 天天爽夜夜爽一区二区三区| 一区二区三区四区不卡视频 | 国产人成亚洲第一网站在线播放| 亚洲最大成人在线视频| 欧美交受高潮1| 成人久久电影| 亚洲中文字幕无码一区| 欧美日韩一区久久| 涩涩av在线| 成人手机在线播放| 国产欧美一区二区三区网站 | 高清乱码免费看污| 久久国产精品久久精品| 国产精品中文字幕亚洲欧美|