zoukankan      html  css  js  c++  java
  • 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/wiki

  • 相关阅读:
    UVa 1364
    一个无向图博弈游戏
    poj 2777 Count Color (线段树)
    UVA 1660
    JS中的caller属性
    “给在读研究生+未来要读研同学们的一封受益匪浅的信”(摘录+整合)
    用cmd重命名.htaccess
    java Scoket的c\s结构聊天室
    log4j详解
    检查文本文件编码的Java程序
  • 原文地址:https://www.cnblogs.com/smark/p/11772069.html
Copyright © 2011-2022 走看看