ASP.NET Core 3.0 實戰:構建多版本 API 介面

来源:https://www.cnblogs.com/vcode/archive/2019/01/05/10225410.html
-Advertisement-
Play Games

第一次在博客寫分享,請多多捧場,如有歧義請多多包含! 因為業務需求發展需要,所以API介面的變更升級是必不可少的事情,而原有的介面是不可能馬上停止使用的。例如:Login介面為例,1.0版本之返回用戶的基本信息,而2.0版本的迭代下,要把用戶祖宗十八代信息都要返回到客戶端,這時候1.0 vs 2.0 ...


第一次在博客寫分享,請多多捧場,如有歧義請多多包含! 因為業務需求發展需要,所以API介面的變更升級是必不可少的事情,而原有的介面是不可能馬上停止使用的。例如:Login介面為例,1.0版本之返回用戶的基本信息,而2.0版本的迭代下,要把用戶祖宗十八代信息都要返回到客戶端,這時候1.0 vs 2.0版本的返回信息有一點信息上的差異,如果在不進行版本控制的情況下,在原1.0的版本下優化,那麼會出現一個比較嚴重的問題,如果還有在使用原1.0版本的終端豈不是GG了,所以如何能魚與熊掌兼得,同時為1.0、2.0版本的終端考慮,所以一般常見的幾種解決方案如下:   1、使用不同API名稱(常見同時最為噁心) 這種是非常簡單粗暴,非靈活處理方案,例如:1.0=Login 2.0=NewLogin 相對於來說是可以有效兼顧到各版本的終端用戶,但是還是不夠靈活,可配置度有點低。 1.0版本 https://****.com/Login 2.0版本 https://****.com/NewLogin 2、請求時帶參數(這裡就不詳細說了) 1.0版本 https://****.com/Login?version=1 2.0版本 https://****.com/Login?version=2 3、Header中標識版本信息 終端調用API介面時,在Header中添加參數來表明請求的版本信息 4、在URL中標識版本信息 1.0版本 https://****.com/v1/Login 2.0版本 https://****.com/v2/Login   這裡主要介紹的是第四種方案的項目搭建(網上有很多類似的文章描述)   1、建立web api項目   2、NuGet集成以下組件 SwashBuckle.AspNetCore 4.0.1 Microsoft.AspNetCore.Mvc.Versioning 3.1.1 Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer 3.1.0 Microsoft.Extensions.PlatformAbstractions1.1.0 (選擇性集成,如果不需要API XMl文檔生成的可以去除) 以上組件的描述、作用請各位google、baidu下去瞭解,這裡不詳細說明瞭   3、項目、代碼上的設置/改動 在Startup->ConfigureServices方法中添加以下代碼
       services.AddApiVersioning((o) =>
            {
                o.ReportApiVersions = true;//可選配置,設置為true時,header返回版本信息
                o.DefaultApiVersion = new ApiVersion(1, 0);//預設版本,請求未指明版本的求預設認執行版本1.0的API
                o.AssumeDefaultVersionWhenUnspecified = true;//是否啟用未指明版本API,指向預設版本
            }).AddVersionedApiExplorer(option =>
            {
                option.GroupNameFormat = "'v'VVVV";//api組名格式
                option.AssumeDefaultVersionWhenUnspecified = true;//是否提供API版本服務
            }).AddSwaggerGen((s) =>
            {
                //填充UI內容
                var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    s.SwaggerDoc(description.GroupName,
                         new Info()
                         {
                             Title = $"體檢微服務介面 v{description.ApiVersion}",
                             Version = description.ApiVersion.ToString(),
                             Description = "微服務框架-切換版本請點右上角版本切換",
                             Contact = new Contact() { Name = "榮少(黎更榮) WeChat:186***** QQ:157537648", Email = "*******@hotmail.com" }
                         }
                    );
                }
                //生成API XML文檔
                var basePath = PlatformServices.Default.Application.ApplicationBasePath;
                var xmlPath = Path.Combine(basePath, typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml");
                s.IncludeXmlComments(xmlPath);
            });

以上代碼其中option.GroupNameFormat = "'v'VVVV";//api組名格式,各位可以嘗試玩玩~~~~

在Startup->Configure方法中添加以下代碼

            app.UseSwagger().UseSwaggerUI((o) =>
            {
                foreach (var description in provider.ApiVersionDescriptions)
                {
                    o.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
                }
            });

其中在Startup->Configure方法中缺少了IApiVersionDescriptionProvider provider參數,自己手動補上即可

//項目自動生成的版本
public void Configure(IApplicationBuilder app, IHostingEnvironment env)

//參數補上後的版本 
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApiVersionDescriptionProvider provider)

以上配置基本上算時完成了,那麼Web Api要怎麼寫法呢?

 

在WebApi項目中Controllers下建立v1、v2倆個文件夾

namespace WebApplication1.Controllers.v1
{
    [ApiVersion("1.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "v1", "v1" };
        }
    }
}
namespace WebApplication1.Controllers.v2
{
    [ApiVersion("2.0")]
    [Route("api/v{version:apiVersion}/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        {
            return new string[] { "v2", "v2" };
        }
    }
}

這裡的路由設置了配置的標簽{version:apiVersion},其中ApiVersion中有各類的屬性欄位,例如:棄用(不代表停用,就好像巨硬上已經過時的方法)該版本API-ApiVersion("1.0", Deprecated = true)],該[ApiVersionNeutral]標簽就是表明停用,不需要該版本。

配置完成後,可以直接用url訪問不同版本的介面地址:

https://localhost:44383/api/v1/Values

https://localhost:44383/api/v2/Values

最後的配置,因為項目預設啟動的是api/Values介面地址,需要修改項目Properties->launchSettings.json

 

最終運行效果如下:

 

如果是對您有幫助,而您又比較慷概的請微信打賞下(後續會有更多的分享):

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題意 "題目鏈接" Sol 設$f[i]$表示炸彈到達$i$這個點的概率,轉移的時候考慮從哪個點轉移而來 $f[i] = \sum_{\frac{f(j) (1 \frac{p}{q})}{deg(j)}}$ $f[1]$需要+1(炸彈一開始在1) cpp // luogu judger enabl ...
  • 字典dict字典是由大括弧{鍵:值}組成.字典是無序的.字典的鍵是不可變的,不能使用列表作為鍵.但可以使用元祖作為字典的鍵.例如: 新增 setdefault(鍵,值):如果只寫鍵不寫值將列印該鍵所對應的值,如果沒有找到鍵返回Note fromkeys(字典鍵列表,值):如果值是列表,是可變的那麼如 ...
  • 引言 - 背景 2016 年寫過一篇關於 linux 共用記憶體 shm api 掃盲文. C擴展 從共用記憶體shm到memcache外部記憶體 比較簡單. 沒有深入分析(能力有限, 也深入分析不了). 3年(2019)過去了. 本質而言共用記憶體這種編程活化石般 雙刃劍, 像 "redis" 這種分散式 ...
  • 在寫高併發交易代碼時要謹慎使用strncpy和sprintf 原因及建議實踐 ...
  • 1. 下載 下載地址,選擇穩定的版本,比如3.4.13,beta為在測版本 2. 複製到任意的目錄,解壓 3. 修改配置文件 配置文件位於conf目錄下,原配置文件為zoo_sample.cfg,更改為zoo.cfg才能被識別。 在配置文件末尾加上 : server.1=bogon:2888:388 ...
  • \動作標簽實例 之後補齊基礎知識 1. scope屬性 該屬性指定了所創建Bean實例的存取範圍,省略該屬性時的值為page.\標識被執行時,首先會在scope屬性指定的範圍來查找指定的Bean實例,如果該實例已經存在,則引用這個Bean,否則重新創建,並將其存儲在scope屬性指定的範圍內。 sc ...
  • C++程式設計要點總結 在編程的過程中呢我們總會遇到一些各種各樣的問題,就比如在寫方法的時候,我們一個同樣的方法要寫好幾種類型的呢,這讓我們很傷腦筋,但是呢C++有一個強大的功能就是模板機制,這個模板機制就可以讓我們少寫很多同樣的代碼,那麼什麼是模板呢,。我們舉一個小例子吧!比如我們要去寫交換函數, ...
  • 1.把功能類似的代碼放到一個目錄下 2.導入該模塊(直接導入該目錄名稱會報錯) 目錄結構: 模塊代碼展示: 導入測試代碼: 測試: 3.創建__init__.py文件(表示該目錄為一個模塊) 4.編輯__init__.py文件,添加代碼(集合裡面的內容表示為該模塊下要導入的文件名稱) 5.重新導入測 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...