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
原文地址:https://www.cnblogs.com/smark/p/11772069.html
- 厚土Go学习笔记 | 36. web服务指定路径下的get参数接收与处理
- 用R进行文本分析初探——包含导入词库和和导入李白语句
- Golang事务模型
- 厚土Go学习笔记 | 35. web服务器实现动态路径
- 过滤器Filter精华知识点,怎能不看
- JavaMail开发示例,学习要看对资料
- 厚土Go学习笔记 | 34. 一个简单的 web 服务器实现
- sqlplus / as sysdba无法登录的奇怪报错 (r8笔记第36天)
- JSP与EL表达式重点学习笔记(1)
- R语言读CSV、txt文件方式以及read.table read.csv 和readr(大数据读取包)
- JSP与EL表达式重点学习笔记(2)
- Node.js真的无所不能?那些不适用的应用领域分析
- #!/bin/bash 与#!/bin/sh
- 客户端无法连接数据库的小问题(r8笔记第53天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法