Beetlex服務框架之Webapi版本訪問控制

在應用服務中API更新是很廣泛的事情,爲了服務良好地運做不少時候須要新舊版本同時兼容;爲了應對這一系列的需求FastHttpApi在新版中強化了Url重寫機制來支持API訪問版本控制,由原來固定的重寫規則調整成支持動態數據的重寫規則,主要支持域名,header和querystring等不一樣值進一個重寫的定義。接下來說解如何經過FastHttpApi來控制不一樣版本的API訪問git

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/hellogithub

 

其實有不少時候但願不改變Url路徑的狀況來對不一樣版原本進行一訪問,這樣在使用調整上就比較方便簡單。FastHttpApi支持經過域名,請求頭和請求參數來應對不一樣狀況的重寫,這樣就可讓調用者沒法關注訪問的路徑統一設置相關參數便可。web

依據域名重寫

組件支持依據域名來重寫Url,針對這狀況能夠定義一個V2.beetlex.com來訪問/Api/v2/hello,在程序啓動的時候加入一個重寫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("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請求數據中獲取。使用效果以下:ui

因爲瀏覽器不方便添加header,經過Postman添加版本頭來測試spa

版本替換

若是服務是一個新舊版本替換的狀況下則能夠重寫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/wiki

相關文章
相關標籤/搜索