.NET Core 3.0 使用Nswag生成Api文檔和客戶端代碼

摘要

在前後端分離、Restful API盛行的年代,完美的接口文檔,成了交流的紐帶。在項目中引入Swagger (也稱為OpenAPI),是種不錯的選擇,它可以讓接口數據可視化。下文將會演示

  • 利用Nswag如何生成Api文檔

  • 利用NSwagStudio如何生成客戶端代碼,並且進行測試

什麼是 Swagger/OpenAPI?

Swagger 是一個與語言無關的規範,用於描述 REST API。Swagger 項目已捐贈給 OpenAPI 計劃,現在它被稱為開放 API。這兩個名稱可互換使用,但 OpenAPI 是首選。它允許計算機和人員了解服務的功能,而無需直接訪問實現(源代碼、網絡訪問、文檔)。其中一個目標是盡量減少連接取消關聯的服務所需的工作量。另一個目標是減少準確記錄服務所需的時間。

Nswag VS Swashbuckle?

.NET Swagger 實現類庫有兩個比較流行:

  • Swashbuckle.AspNetCore 是一個開源項目,用於生成 ASP.NET Core Web API 的 Swagger 文檔。

  • NSwag 是另一個用於生成 Swagger 文檔並將 Swagger UI 或 ReDoc 集成到 ASP.NET Core Web API 中的開源項目。此外,NSwag 還提供了為 API 生成 C# 和 TypeScript 客戶端代碼的方法。

 

為什麼我在.NET core3.0中選擇NSwag呢,NSwag比較活躍,一直在更新,功能也很強大,可以完美的代替Swashbuckle.AspNetCore具體可以參考:https://github.com/aspnet/AspNetCore.Docs/issues/4258

一、利用Nswag生成Api文檔

步驟
  1. 創建Asp.NET Core Api項目,並且集成NSwag

  2. 配置項目

  3. 運行項目

創建Asp.NET Core Api項目,並且集成NSwag

我們將簡單的創建一個ASP.NET core API項目。將其命名為“WebAPIwithSwg”。基於.NETcore3.0

安裝nuget包NSwag.AspNetCore

接下來,在Startup.cs文件中配置Nswag服務和中間件。

在ConfigureServices方法中添加服務

  public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddSwaggerDocument(); //註冊Swagger 服務
        }
在Configure方法中添加Nswag中間件
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
            app.UseOpenApi(); //添加swagger生成api文檔(默認路由文檔 /swagger/v1/swagger.json)
            app.UseSwaggerUi3();//添加Swagger UI到請求管道中(默認路由: /swagger).
        }
配置項目

運行項目

右鍵項目在瀏覽器中查看,查看swagger UI需要在url後面添加“/swagger”。本示例http://localhost:54117/swagger

二、利用NSwagStudio如何生成客戶端代碼,並且進行測試
提供GUI界面是NSwag的一大特點,只需要下載安裝NSwagStudio,即可生成客戶端代碼。
步驟
  1. 現在安裝NSwagStudio

  2. NSwagStudio配置,生成客戶端代碼

  3. 創建測試客戶端項目

下載安裝NSwagStudio

下載NSwag Studio http://rsuter.com/Projects/NSwagStudio/installer.php 安裝之後打開 NSwag Studio 如圖

NSwagStudio配置,生成客戶端代碼

選擇runtime,我選擇的是NETCore30,切換OpenAPI/Swagger Specification ,在Specification UR輸入你的Swagger.json路徑,本示例:http://localhost:54117/swagger/v1/swagger.json輸入路徑之後,點擊 create local copy 按鈕獲取json。

接下配置來生成客戶端代碼。我們首先選擇csharp client”複選框,然後勾選掉 “Inject Http Client via Constructor (life cycle is managed by caller)” ,最後設置下輸出路徑 點擊生成文件(Generate Files)。步驟如下

到此客戶端代碼已經自動生成。

查看生成的部分代碼


public async System.Threading.Tasks.Task<System.Collections.Generic.ICollection<WeatherForecast>> GetAsync(System.Threading.CancellationToken cancellationToken)
        {
            var urlBuilder_ = new System.Text.StringBuilder();
            urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/WeatherForecast");
    
            var client_ = new System.Net.Http.HttpClient();
            try
            {
                using (var request_ = new System.Net.Http.HttpRequestMessage())
                {
                    request_.Method = new System.Net.Http.HttpMethod("GET");
                    request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
    
                    PrepareRequest(client_, request_, urlBuilder_);
                    var url_ = urlBuilder_.ToString();
                    request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
                    PrepareRequest(client_, request_, url_);
    
                    var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
                    try
                    {
                        var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
                        if (response_.Content != null && response_.Content.Headers != null)
                        {
                            foreach (var item_ in response_.Content.Headers)
                                headers_[item_.Key] = item_.Value;
                        }
    
                        ProcessResponse(client_, response_);
    
                        var status_ = ((int)response_.StatusCode).ToString();
                        if (status_ == "200") 
                        {
                            var objectResponse_ = await ReadObjectResponseAsync<System.Collections.Generic.ICollection<WeatherForecast>>(response_, headers_).ConfigureAwait(false);
                            return objectResponse_.Object;
                        }
                        else
                        if (status_ != "200" && status_ != "204")
                        {
                            var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); 
                            throw new ApiException("The HTTP status code of the response was not expected (" + (int)response_.StatusCode + ").", (int)response_.StatusCode, responseData_, headers_, null);
                        }
            
                        return default(System.Collections.Generic.ICollection<WeatherForecast>);
                    }
                    finally
                    {
                        if (response_ != null)
                            response_.Dispose();
                    }
                }
            }
            finally
            {
                if (client_ != null)
                    client_.Dispose();
            }
        }
創建測試客戶端項目

創建一個控製程序項目,命名“WebApiClient”。

把自動生成的類“WeatherForecastClient”添加到客戶端項目中,然後安裝Newtonsoft

最後在Main函數中添加測試代碼,開始使用Api。

 static async System.Threading.Tasks.Task Main(string[] args)
        {

            var weatherForecastClient = new WeatherForecastClient();
            //gets all values from the API
            var allValues = await weatherForecastClient.GetAsync();
            Console.WriteLine("Hello World!");
        }

運行客戶端應用程序,進行調用api

當然如果需要調試api項目內部代碼,可以設置斷點,進入一步一步的調試

小結:NSwag 功能遠不止這些,本篇文章演示了如何生成api文檔和自動生成的api客戶端代碼方便我們調試,也可以作為對應的sdk。

參考:微軟官方文檔—https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-nswag?view=aspnetcore-2.2&tabs=visual-studio

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※公開收購3c價格,不怕被賤賣!

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

雅虎日本在其餐廳徵收“油炸食品稅”

  為了推廣健康生活方式,減少僱員中間的肥胖率,雅虎日本在其總部餐廳開始徵收“油炸食品稅”。從 10 月 8 日開始,炸豬排之類的油炸食品價格上漲,而水煮魚或烤魚之類的魚類食品則價格下降。

  它在 2017 年的體檢显示,45% 的僱員 LDL 膽固醇含量較高。它的自助餐廳每天有 1000 名僱員吃飯,油炸食品要比水煮魚或烤魚受歡迎得多。除了炸豬排漲價外,炸雞排也漲了 100 日元至 691 日元。如今到了午餐點,魚類食品一售而空,官員表示效果顯著。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※公開收購3c價格,不怕被賤賣!

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

傳谷歌母公司欲收購Fitbit 擬推自有品牌可穿戴設備

  原標題:Google is reportedly trying to buy Fitbit

  網易科技訊,10 月 29 日消息,據外媒報道,據知情人士透露,谷歌母公司 Alphabet 正在就收購美國可穿戴設備公司 Fitbit 與後者進行談判。不過,目前兩家公司還沒有確認這筆交易,也不清楚 Alphabet 的報價。上個月,有報道稱 Fitbit 正在探索出售的可能。

  多年來,谷歌憑藉其 Wear OS 操作系統在可穿戴市場上佔據了重要地位,但它始終難以與 Apple Watch 競爭,儘管其得到了包括 LG、Fossil 和 TicWatch 在內的眾多公司支持。就連主要的安卓製造商三星也未使用 Wear OS,而是使用自己的 Tizen 操作系統。

  今年 1 月,谷歌斥資 4000 萬美元從 Fossil 手中收購了某種智能手錶技術,但目前尚不清楚該技術到底是什麼,Fossil 高管將其描述為“尚未投放市場的新產品創新”,不過迄今仍然沒有上市。

  多年來,始終有傳言稱谷歌希望推出自家品牌的 Pixel 智能手錶。在 2016 年的某個時候,這些計劃幾乎促使谷歌品牌的智能手錶上市,但該公司最終擱置了計劃,因為其擔心這些手錶可能“傷及谷歌硬件品牌的聲譽”。這些 LG 製造的智能手錶後來在 2017 年以 LG Watch Sports 和 LG Watch Style 的形式發布,評價一般。

  從那時起,谷歌打造自家硬件野心開始膨脹。2017 年,谷歌收購了 HTC 智能手機工程團隊以開發 Pixel 手機,而 Fitbit 的收購可能會幫助其在可穿戴設備領域取得類似的進展。

  與此同時,蘋果在 Apple Watch 上的經驗表明,健康正迅速成為智能手錶的殺手級應用,這也是 Fitbit 自身健身追蹤器越來越關注的一個領域。然而,儘管 Fitbit 在 2016 年收購了智能手錶製造商 Pebble,但其在智能手錶方面的表現卻不盡如人意。例如,今年早些時候發布的健身跟蹤器 Fitbit Versa 2,其實本質上就是一款普通的智能手錶。

  谷歌和 Fitbit 拒絕就上述報道置評。(小小)

  

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

※公開收購3c價格,不怕被賤賣!

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

使用 Cloudflare 防火牆 Zone Lockdown 保護網站控制台及登入頁面教學



Copyright : Weerapat Kiatdumrong / 123RF Stock Photos

我在 WordCamp Taipei 2018 分享這幾年經營免費資源網路社群的經驗,當中也提到我選用的工具服務和理由,作為一個樂於分享的使用者,其實沒有什麼不可告人的「秘方」,反倒很希望能夠將自身經驗拋出來讓大家參考,獲得更多回饋,通常在交流過程中可以使自己學習很多。雖然沒有任何作法可以 100% 符合所有網站需求,但我還是希望透過文章傳遞一些你可能會用到、足以解決問題的觀點,當然這些不應太過複雜,至少要能讓大家願意閱讀,我寫的文章才會有所用處。

在演講時我不斷提到一個推薦的服務 Cloudflare,兼具我重視的速度和安全性,除了是一款內容傳遞網路(CDN)服務外,更重要的是它提供許多安全工具,可以增加網站的防護力,不要覺得你的網站很安全或不會被盯上,事實上有很多的自動化程式都是隨機尋找可下手攻擊或植入惡意程式的目標,因此平常就要做好安全措施,總不可能等到被入侵才來修補漏洞。

如果你使用 WordPress 架站,最需要防護的控制台(wp-admin)和登入頁面(wp-login.php)絕對別輕忽,早先很多網站都是教你透過 .htaccess 限制可連線的 IP 位址,若你已經開始使用 Cloudflare 的話,可以把這部分丟給 Cloudflare 協助處理,我相信它在安全防護上會更強大也更具有彈性和空間。

本文要介紹 Cloudflare 其中一個模組「Zone Lockdown」,這個模組在防火牆(Firewall)頁面底下,可以想見它和防護有關,簡單來說,利用 Zone Lockdown 功能可設定要加強防護的區域,讓使用者預先設定某些路徑僅能讓某個 IP(或 IP 範圍)來源存取,如果運用在 WordPress 最基本的用法是把登入頁面和控制台設定進去,如此一來就能確保只有你可以存取控制台,不僅大幅降低被攻擊入侵的機會,也能不被暴力測試帳號密碼消耗主機資源。

我之前也推薦過另一個方法:啟用 Jetpack「單一登入」機制教學,讓你的 WordPress 網站更安全(含兩步驟驗證),也能讓 WordPress 更加安全,你可以挑一個適合自己需求的使用,那麼接下來我會更深入說明 Zone Lockdown 功能。

使用教學

STEP 1

首先,你可以在登入 Cloudflare、選擇你的區域(網域名稱)後點選 Firewall 找到這項功能。

Zone Lockdown 暫不提供 Cloudflare 免費帳戶使用,如果你是免費方案,會要求升級到 Pro 或更高的方案才能開啟這項工具。Pro 帳戶可提供三個規則設定,Business 則有 10 個額度,其實數量不用太多,若你已經升級到最基本的 Pro 方案就可以滿足基本需求,除非你想設定很複雜的規則。

STEP 2

如果你是付費方案,應該會看到 Zone Lockdown 功能已被開啟,點選「Create Lockdown Rule」建立第一個網址防護規則。

STEP 3

在這裡我以一般 WordPress 網站(自架站)為例,首先,設定一下規則名稱,例如可以命名為「僅限從辦公室 IP 位址登入 WordPress」,設定一個讓你可以一眼看出來的名稱即可,重點在於第二個欄位,也就是設定要讓 Zone Lockdown 防護的網址,可以設定為:

  • *example.com/wp-login.php*
  • *example.com/wp-admin/*

請將上面的 example.com 替換成你的網域名稱,如果格式不同也自行調整一下。

在第三個欄位「IP Range」將你平常使用的固定 IP 設定進去,可使用 IP 區段或是 IPv6 位址,最後點選「Save and Deploy」就能保存並將設定啟用,一切都是這麼簡單。

STEP 4

Cloudflare 各項模組功能都有快速開關,記得將規則切換到綠色的 On 才算啟用。

STEP 5

當有人連線到你設定防護的路徑,來源不在 IP 位址的白名單中,就會被 Zone Lockdown 模組自動擋掉,看到的會像下圖防火牆封鎖畫面(Access Denied)。

被阻擋的當下,Cloudflare 防火牆就會將此事件紀錄下來,可以在控制台看到被封鎖的來源、時間、存取的路徑、IP 位址及 User Agent 等資訊,當然如果是你不小心被阻擋,可以在 Firewall 中把自己加入白名單,就能解除問題,或者也可隨時將 Zone Lockdown 暫停或關閉。

本站聲明:網站內容來源免費資源網路社群https://free.com.tw,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

想要讓你的商品在網路上成為最夯、最多人討論的話題?

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

如何退訂免費資源網路社群每日新文章 Email 電子報通知?

長久以來免費資源網路社群都有提供 Email 訂閱更新通知的功能,最早是使用 Google 的 FeedBurner RSS Feed 訂閱工具,後來選擇 Jetpack 的 Subscriptions 模組讓使用者能有更彈性運用,亦可選擇要接收的電子郵件格式和寄送時間(就是網站目前右上角的訂閱功能),對我來說,以 Email 接收資訊的管道是很必要的,在發佈文章後可以快速推送給使用者,相較於推送桌面通知我更傾向不打擾不干擾的 Email 郵件通知。

 

一般而言,有禮貌的 Email 電子報或訂閱郵件都會提供退訂鏈結(Unsubscribe),可以快速從郵件清單將自己的地址移除,通常都是一鍵完成,然而有些退訂方式就設計得比較難懂,還得手動選擇要退訂的訂閱項目或是反覆輸入 Email 地址,就更不用說是完全沒有提供退訂鏈結的電子報,這在台灣相當常見,不但相當冒犯也算是過時的方法。

偶爾會收到讀者來信詢問要如何停止接收免費資源網路社群的新文章通知?站在網站管理者的立場還是希望大家多多使用這項功能,不過如果真的覺得每天 Email 多到爆炸,而且沒有太多時間看文章的話,其實網站郵件通知是可以快速取消訂閱的。以下我會教大家怎麼樣管理訂閱或是退訂網站的 Email 通知。

如何退訂不想接收的電子報或郵件通知?

STEP 1

首先,打開你要退訂的郵件,在最下方可以找到「取消訂閱」和「管理訂閱」鏈結,不管點那一個鏈結都會連到 https://subscribe.wordpress.com/,這是 WordPress 提供的郵件通知功能,自然就是回到 WordPress 設定。

其他的 Email 電子報或行銷廣告也是類似的退訂方式,在郵件上方或下方通常能找到一個「Unsubscribe」,點選後就會引導到訂閱設定頁面,大多情況不用進行任何操作,就會自動將你從寄件名單刪除。

STEP 2

點選取消訂閱後,會引導到 WordPress 提供的訂閱管理頁面,不過目前還沒有完成中文化可能會有一些中英文字串夾雜的情形,在這裡可以看到你曾訂閱過的網站(例如免費資源網路社群),如果你不想完全退訂,但又希望能選擇接收郵件的時間,點選「Settings」鏈結調整要接收的 Email 格式和時間區間。

確定要刪除訂閱嗎?點一下中間的藍色按鈕「Delete Subscription」就能將你從寄件清單移除,沒關係,未來隨時可以重新訂閱,如果你已經訂閱很多來自 WordPress 網站的郵件通知,想要一次全部停掉,可點選右邊的「Stop All WordPress.com Subscriptions」鏈結,停止接收所有來自 WordPress.com 的訂閱郵件。

STEP 3

若你是更早期透過 FeedBurner 訂閱的朋友一樣也能手動退訂,不過可能日後就無法再次加入接收名單,因為網站目前已經沒有提供 FeedBurner 訂閱表單,但目前的訂閱功能仍可以隨時退訂或加入清單,退訂方法一樣是找到郵件最底下的 Unsubscribe,點選後進入看到如下頁面,再次點選確定訂閱的按鈕就能離開寄件名單。

STEP 4

跳出黃色的 Successfully unsubscribed… 訊息後代表已成功取消訂閱。

本站聲明:網站內容來源免費資源網路社群https://free.com.tw,如有侵權,請聯繫我們,我們將及時處理

【精選推薦文章】

如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

想要讓你的商品在網路上成為最夯、最多人討論的話題?

網頁設計公司推薦更多不同的設計風格,搶佔消費者視覺第一線

不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!