上一篇,咱們是正式將ABP生成的代碼項目,跑起來了,而後演示了下多租戶的不一樣。那麼這篇咱們就來實現下SwaggerUI。javascript
Q:SwaggerUI是幹什麼的呢?css
A:他是一個能將咱們的webapi,經過Swagger Api來生成一個交互式的文檔。經過他能夠對你的接口進行調式。html
選擇PhoneBook.WebApi,而後添加nuget包(固然你也能夠經過命令行添加)。java
輸入「Swashbuckle.core」web
引入到咱們的項目中。api
打開 項目中的「PhoneBookWebApiModule.cs」文件.服務器
建立一個方法「ConfigureSwaggerUi();」cookie
/// <summary> /// 配置SwaggerUi /// </summary> private void ConfigureSwaggerUi() { Configuration.Modules.AbpWebApi().HttpConfiguration .EnableSwagger(c => { c.SingleApiVersion("v1", "YoYoCMS.PhoneBookAPI文檔"); c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); }) .EnableSwaggerUi(); }
而後在Initialize()中對他進行調用。架構
運行項目,打開」/swagger/ui/index」路徑app
獲得的效果
到此呢,ABP實現SwaggerUI的功能已經算是能夠了。可是咱們不能就這麼知足了。還不夠,爲何呢。由於咱們還要講咱們的註釋顯示出來。
這樣其餘開發人員看到了接口名稱才能說叫作API文檔嘛。
你們要特別注意:
這裏生成的XML文檔,必定要注意是application類庫中的,不是webapi類型的
是application類庫、application類庫、application類庫
首先咱們回到 方法:ConfigureSwaggerUi中,對他進行改造。
首先打開application類庫的屬性設置,而後在生成中找到XML文檔文件,啓用生成
而後再對ConfigureSwaggerUi方法進行改造
//將application層中的註釋添加到SwaggerUI中 var baseDirectory = AppDomain.CurrentDomain.BaseDirectory; var commentsFileName = "Bin//YoYoCMS.PhoneBook.Application.xml"; var commentsFile = Path.Combine(baseDirectory, commentsFileName); //將註釋的XML文檔添加到SwaggerUI中 c.IncludeXmlComments(commentsFile);
添加如下到方法中。
而後運行項目:
咦。。。怎麼沒有。。註釋呢。。。。
固然這一切的一切只是咱們能夠加註釋,來如今咱們把註釋加上。。
而後再來運行一次項目。。。
上圖咱們就能夠看到了。已經獲得了註釋信息,之後開發不再怕哪一個接口是哪一個了。
到目前爲止咱們訪問SwaggerUI的方式都是」/swagger/ui/index/」 這樣的路徑訪問方式。
我的感受不是很方面咱們對它進行稍微的優化下。
咱們能夠看到EnableSwaggerUi,F12轉到定義下。
支持路由重定向,那麼咱們就開始改造吧。
其實就這麼一句話,改造後的訪問路徑「/apis/index」就能夠了。
看看效果。
這樣操做接口就比較方便了。
.EnableSwaggerUi("apis/{*assetPath}", b => { b.InjectJavaScript(); b.InjectStylesheet(); });
一個 是注入JavaScript文件,一個是輸入css文件。因此若是這裏能夠對咱們的SwaggerUI界面進行自定義修改的。
須要將js文件路徑注入到SwaggerUI中。
.EnableSwaggerUi("apis/{*assetPath}", b => { //對js進行了拓展 b.InjectJavaScript(Assembly.GetExecutingAssembly(), "YoYoCMS.PhoneBook.SwaggerUi.scripts.swagger.js"); });
//YoYoCMS.PhoneBook.SwaggerUi.scripts.swagger.js是你的命名空間加上文件的路徑.
YoYoCMS.PhoneBook 是你的項目默認命名空間
而後接下來纔是你的各類文件夾結構。。
swagger.js須要設置爲嵌入的資源。
請注意你的項目結構。每個.表明的是一個文件夾
swagger.js 也放出來。
'use strict'; /** * Translator for documentation pages. * * To enable translation you should include one of language-files in your index.html * after <script src='lang/translator.js' type='text/javascript'></script>. * For example - <script src='lang/ru.js' type='text/javascript'></script> * * If you wish to translate some new texsts you should do two things: * 1. Add a new phrase pair ("New Phrase": "New Translation") into your language file (for example lang/ru.js). It will be great if you add it in other language files too. * 2. Mark that text it templates this way <anyHtmlTag data-sw-translate>New Phrase</anyHtmlTag> or <anyHtmlTag data-sw-translate value='New Phrase'/>. * The main thing here is attribute data-sw-translate. Only inner html, title-attribute and value-attribute are going to translate. * */ window.SwaggerTranslator = { _words: [], translate: function () { var $this = this; $('[data-sw-translate]').each(function () { $(this).html($this._tryTranslate($(this).html())); $(this).val($this._tryTranslate($(this).val())); $(this).attr('title', $this._tryTranslate($(this).attr('title'))); }); }, _tryTranslate: function (word) { return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word; }, learn: function (wordsMap) { this._words = wordsMap; } }; /* jshint quotmark: double */ window.SwaggerTranslator.learn({ "Warning: Deprecated": "警告:已過期", "Implementation Notes": "實現備註", "Response Class": "響應類", "Status": "狀態", "Parameters": "參數", "Parameter": "參數", "Value": "值", "Description": "描述", "Parameter Type": "參數類型", "Data Type": "數據類型", "Response Messages": "響應消息", "HTTP Status Code": "HTTP狀態碼", "Reason": "緣由", "Response Model": "響應模型", "Request URL": "請求URL", "Response Body": "響應體", "Response Code": "響應碼", "Response Headers": "響應頭", "Hide Response": "隱藏響應", "Headers": "頭", "Try it out!": "試一下!", "Show/Hide": "顯示/隱藏", "List Operations": "顯示操做", "Expand Operations": "展開操做", "Raw": "原始", "can't parse JSON. Raw result": "沒法解析JSON. 原始結果", "Model Schema": "模型架構", "Model": "模型", "apply": "應用", "Username": "用戶名", "Password": "密碼", "Terms of service": "服務條款", "Created by": "建立者", "See more at": "查看更多:", "Contact the developer": "聯繫開發者", "api version": "api版本", "Response Content Type": "響應Content Type", "fetching resource": "正在獲取資源", "fetching resource list": "正在獲取資源列表", "Explore": "瀏覽", "Show Swagger Petstore Example Apis": "顯示 Swagger Petstore 示例 Apis", "Can't read from server. It may not have the appropriate access-control-origin settings.": "沒法從服務器讀取。可能沒有正確設置access-control-origin。", "Please specify the protocol for": "請指定協議:", "Can't read swagger JSON from": "沒法讀取swagger JSON於", "Finished Loading Resource Information. Rendering Swagger UI": "已加載資源信息。正在渲染Swagger UI", "Unable to read api": "沒法讀取api", "from path": "從路徑", "server returned": "服務器返回" }); $(function () { window.SwaggerTranslator.translate(); });
這兩天有陸續看到留言說 提示使用動態請求的時候報錯400
緣由是在1.0後ABP開啓了一個功能」Cross-Site Request Forgery」CSRF 中文叫作跨站請求僞造
怎麼搞定呢。
1種是在咱們的swaggerui的js中添加:
var getCookieValue = function(key) { var equalities = document.cookie.split('; '); for (var i = 0; i < equalities.length; i++) { if (!equalities[i]) { continue; } var splitted = equalities[i].split('='); if (splitted.length !== 2) { continue; } if (decodeURIComponent(splitted[0]) === key) { return decodeURIComponent(splitted[1] || ''); } } return null; }; var csrfCookie = getCookieValue("XSRF-TOKEN"); var csrfCookieAuth = new SwaggerClient.ApiKeyAuthorization("X-XSRF-TOKEN", csrfCookie, "header"); swaggerUi.api.clientAuthorizations.add("X-XSRF-TOKEN", csrfCookieAuth);
以上JavaScript代碼。
還有一種是在webapimodule中關閉 CSRF功能
public override void PreInitialize() { ////關閉跨站腳本攻擊 Configuration.Modules.AbpWeb().AntiForgery.IsEnabled = false; }
有小夥伴在羣裏問SwaggerUI這麼強大,到了生產環境是否是要手動屏蔽?
剛剛通過個人實際測試發現無須擔心這個問題。
當咱們把項目發佈到IIS後。
再次打開SwaggerUI
就會發現報500錯誤,因此這個隱憂看看不用考慮了
若是你以爲本文章對你有幫助,能夠對我打賞哦。屏幕右方
羣裏能夠下載源代碼
交流QQ羣: 104390185
如此。The End