1、下載swaggerUI代碼
git clone https://github.com/swagger-api/swagger-ui.git
2、安裝express
1、安裝nodeJS;
2、新建一個空目錄;
3、在目錄下執行【npm init】,然后一路回車即可;
4、最后執行【npm install express –save】即可完成對express的安裝。
具體參照博文
3、添加swagger官方demo
1、在目錄下新建public目錄;
2、將swagger目錄dist下文件盡數拷貝到public目錄下。
4、編寫nodeJS啟動腳本
新建index.js並在其中編寫如下代碼:
//Setting up server var server = app.listen(process.env.PORT || 20106, function () { var port = server.address().port; console.log("App now running on port", port); console.log("Continuing..."); }); app.use(express.static(path.join(__dirname, 'public'))); // 設置服務永不超時 server.setTimeout(0)
5、啟動swaggerUI
1、執行命令【node index.js】即完成對swagger的啟動;
2、通過瀏覽器訪問【http://ip:8002/index.html】即可以訪問到swagger官方的API demo UI。
接下來我們采用自定義接口描述文件swagger.json替換官方demo。
6:自定義接口描述文件並使用
1、編寫接口描述文件swagger.json
描述文件編寫規則見:
https://swagger.io/docs/specification/2-0/describing-request-body/
使用swagger edit在線編輯器編輯:
https://editor.swagger.io/
這部分可以通過yaml語法編輯,完成后選擇保存為json文件swagger.json.
2、使用swagger.json替換官方demo
1、將編寫完成swagger.json放入public目錄;
2、打開public/index.html,將其中的【url: “…”】更換為【url: “swagger.json”】;
3、重新【node index.js】,然后打開瀏覽器即可看到類似如下的頁面:
加載成功。
4、上圖右下角有個錯誤,是無法是被swagger.json為url所致,解決辦法是:打開public/index.html,在【url: “…”】同級添加【validatorUrl: false】即可。
7:解決跨域問題
完成以上步驟以后,你所自定義的接口即可通過swaggerUI的方式展示在人面前,便於查看。
但是當具體點擊某一個接口並進行【Try it】的時候,你會發現並沒有成功,調出瀏覽器調試頁面后,你會發現是跨域問題。
這是因為,swagger是純粹的前端,它並沒有后台的支持,所有界面上接口的請求都是直接由ajax發起,而此時你的服務端獲取並不支持跨域,所以便出現了跨域的問題。
解決方案有兩種:
1、攔截swaggerUI的請求,統一由nodeJS做轉發
由於需要涉及swaggerUI源碼的東西,對我不適用,故放棄。
有興趣的同學可以研究一下。
2、在服務端添加支持跨域請求的代碼
對於get、post請求,是直接發送的具體請求的,在返回頭添加(’Access-Control-Allow-Origin’, ‘*’)即可:
response.headers['Access-Control-Allow-Origin'] = '*'
而對於put、delete請求來說,當你【Try it】測試接口的時候,打開瀏覽器調試界面,可以發現其發送的是options請求,而查看服務端日志,收到的也是options請求。原來put、delete請求在發送之前首先會發送一次options請求,用來驗證服務端是否支持跨域等操作。
處於這種情況,需要在服務端為這類請求添加options請求處理方法,並應swagger添加以下部分的東西后,測試成功。
response.headers['Access-Control-Allow-Origin'] = '*' accessMethod = 'GET, POST, DELETE, PUT, PATCH, OPTIONS' response.headers['Access-Control-Allow-Methods'] = accessMethod accessHeaders = 'Content-Type, api_key, Authorization' response.headers['Access-Control-Allow-Headers'] = accessHeaders