37

BeetleX之Webapi版本访问控制

 4 years ago
source link: https://www.tuicool.com/articles/6J3IV3I
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在应用服务中 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

vIJzema.png!web

其实有很多时候希望不改变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} ,重写后访问的结果如下:

yq2EjuV.png!web

一般情况很少会用域名来区分,用域名区分的场更多是正式和测试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请求数据中获取。使用效果如下:

ZFZJBzr.png!web

由于浏览器不方便添加header,通过Postman添加版本头来测试

UNzEfqZ.png!web

版本替换

如果服务是一个新旧版本替换的情况下则可以重写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();
}

UbIFRr3.png!web

提醒

其实组件UrlRewrite是支持运行时动态更新,只需要做个管理页即可随时调整API路由来进行不同版本的访问处理。

关注公众号

NR3Yn27.jpg!web

https://github.com/IKende/

高性能的服务通讯框架  Beetlex(http,rpc,gateway的详细实现


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK