Beetlex服務框架之Webapi版本訪問控制
在應用服務中API
更新是很普遍的事情,為了服務良好地運作很多時候需要新舊版本同時相容;為了應對這一系列的需求FastHttpApi
在新版中強化了Url重寫機制來支援API
訪問版本控制,由原來固定的重寫規則調整成支援動態資料的重寫規則,主要支援域名,header和querystring等不同值進一個重寫的定義。接下來講解如何通過FastHttpApi
來控制不同版本的API
訪問
API示例
[Controller(BaseUrl = "Api")] public class Api { public object Hello(string name) { return $"hello {name} at {DateTime.Now}"; } } [Controller(BaseUrl = "Api/v2")] public class ApiV2 { public object Hello(string name) { return $"hello {name} at {DateTime.Now}[v2]"; } }
以上是兩個不同版本的API功能,訪問的Url分別是/Api/hello
和/Api/v2/hello
其實有很多時候希望不改變Url路徑的情況來對不同版本來進行一訪問,這樣在使用調整上就比較方便簡單。FastHttpApi
支援通過域名,請求頭和請求引數來應對不同情況的重寫,這樣就可以讓呼叫者無法關注訪問的路徑統一設定相關引數即可。
依據域名重寫
元件支援依據域名來重寫Url,針對這情況可以定義一個V2.beetlex.com
來訪問/Api/v2/hello
,在程式啟動的時候加入一個重寫
static void Main(string[] args) { var builder = new HostBuilder() .ConfigureServices((hostContext, services) => { services.UseBeetlexHttp(o => { o.AddFilter<DefaultJsonResultFilter>(); o.LogToConsole = true; o.Port = 80; o.SetDebug(); o.LogLevel = BeetleX.EventArgs.LogType.Info; }, b => { b.UrlRewrite .Add("v2.beetlex.com", "/api/{action}", "/api/v2/{action}"); }, typeof(Program).Assembly); }); builder.Build().Run(); }
只要是通過V2.beetlex.com
訪問的/api/{action}
重寫到/api/v2/{action}
,重寫後訪問的結果如下:
一般情況很少會用域名來區分,用域名區分的場更多是正式和測試API的相容部署,測試完成後會替換原則有的API;後面會講述如何接管舊的請求到新的版本中。
依據Header或QueryString值來重寫
其實在Header中新增則是對整個Url是沒有任何影響的,元件可以這樣定義這個重寫規則
static void Main(string[] args) { var builder = new HostBuilder() .ConfigureServices((hostContext, services) => { services.UseBeetlexHttp(o => { o.AddFilter<DefaultJsonResultFilter>(); o.LogToConsole = true; o.Port = 80; o.SetDebug(); o.LogLevel = BeetleX.EventArgs.LogType.Info; }, b => { b.UrlRewrite .Add("version=v2", "/api/{action}", "/api/v2/{action}") }, typeof(Program).Assembly); }); builder.Build().Run(); }
以上是配置一個version
變數,只要這個變數是等於v2
的情況則會觸發這個重寫規則;元件會先從請求頭中獲取,獲取不了的情況再從Url請求資料中獲取。使用效果如下:
由於瀏覽器不方便新增header,通過Postman新增版本頭來測試
版本替換
如果服務是一個新舊版本替換的情況下則可以重寫Url,把訪問舊的api路徑指向新的api路徑。
static void Main(string[] args) { var builder = new HostBuilder() .ConfigureServices((hostContext, services) => { services.UseBeetlexHttp(o => { o.AddFilter<DefaultJsonResultFilter>(); o.LogToConsole = true; o.Port = 80; o.SetDebug(); o.LogLevel = BeetleX.EventArgs.LogType.Info; }, b => { b.UrlRewrite .Add("/api/{action}", "/api/v2/{action}"); }, typeof(Program).Assembly); }); builder.Build().Run(); }
提醒
其實元件UrlRewrite是支援執行時動態更新,只需要做個管理頁即可隨時調整API不同版本的訪問處理。
瞭解更多框架webapi功能可以訪問https://github.com/IKende/FastHttpApi/