如何为HTTP配置路由复杂匹配
实现切换为 https://github.com/fs7744/Lmzzz
http 路由匹配规则可以配置 Hosts / Paths / Methods
虽然可以满足大部分简单场景,但是只能过滤交集以及header等等其他场景无法过滤,
而为了大家能更加语义化描述如何过滤,并且最好降低大家学习成本,所以尝试实现了一套简单的类似 sql 中 where 部分表达式解析实现
其表达式定义为 ([Http字段] [比较操作符] [比较值]) [可选: [AND/&&/OR/|| ([Http字段] [比较操作符] [比较值])] ...]
比如大家就可以描述为 Request.Method == 'GET' 或者 Request.Method == 'GET' || Request.Method == 'POST'
其实现为 解析 表达式字符串然后生成 Func<HttpContext, bool>, 所以虽然性能不是最优,但理论上也不算太差
Warning
Http字段 既为 HttpContext的属性, 所以大家可以任意使用对应属性进行比较, 不过文档以下描述字段做过一些优化,在简单场景会有性能优势,复杂比较或者过于动态的属性可能对性能会存在不小影响
比较值
支持以下三种格式
bool
如
trueorfalsenumber
如
12323or1.324or-44.4string
如
'sdsdfa'or'sds\'dfa'or"dsdsdsd"or"fs\"dsf"
Http字段
由于是用于路由匹配,所以只支持 HttpContext 部分字段
支持如下:
Request.Path获取或设置标识所请求资源的请求路径部分。
如果 PathBase 包含完整路径,则该值可以是 Empty ;对于“OPTIONS *”请求,该值可以是 。 除“%2F”外,服务器将完全解码路径,该路径将解码为“/”并更改路径段的含义。 “%2F”只能在将路径拆分为段后替换。
Request.Method获取或设置 HTTP 方法。
Request.Scheme获取或设置 HTTP 请求方案。
Request.IsHttps如果 RequestScheme 为 https,则返回 true。
Request.Protocol获取或设置请求协议 (例如 HTTP/1.1) 。
Request.ContentType获取或设置 Content-Type 标头。
Request.ContentLength获取或设置 Content-Length 标头。
Request.Host获取或设置 Host 标头。 可以包含端口。
Request.QueryString获取或设置用于在 Request.Query 中创建查询集合的原始查询字符串。
Request.HasFormContentType检查表单类型的 Content-Type 标头。
如下为动态集合字段,需要再指定Key, 格式为 [Http字段]([Key]), 如获取User-Agent则为Request.Headers.[''User-Agent']
Request.Headers.['xxxKey']获取请求标头。
Request.Query.['xxxKey']获取从 Request.QueryString 分析的查询值集合。
Request.Cookies.['xxxKey']获取此请求的 Cookie 集合。
Request.Form.['xxxKey']获取或设置窗体形式的请求正文。
比较操作符
==Equal
如
Request.ContentType == 'sky'<=LessThan or Equal
如
Request.ContentLength <= 30<LessThan
如
Request.ContentLength < 30>=GreaterThan or Equal
如
Request.ContentLength >= 30>GreaterThan
如
Request.ContentLength > 30!=Not Equal
如
Request.ContentLength != 30not取反
如
!( ContentLength <= 30 )and如
ContentLength <= 30 && ContentLength > 60or如
ContentLength <= 30 || ContentLength > 60()如
(ContentLength <= 30 || ContentLength > 60) && ContentType == 'killer''正则表达式'正则匹配
如
Regex(Request.Path,'[/]test.*')in(xxxField,)in array (bool/number/string)
如
in(xxxField,1,2,3)orin(xxxField,'sdsdfa','sdfa')orin(xxxField,true,false)EqualIgnoreCasestring 比较忽略大小写
如
EqualIgnoreCase(Request.Path, '/testp/DSD/fsdfx/fadasd3/中')