在应用服务中 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
来源: https://www.cnblogs.com/smark/p/11772069.html