Beetlex服務框架之Webapi訪問限制和url重寫
- 2019 年 10 月 24 日
- 筆記
在新版本的BeetleX.FastHttpApi中集成了IP訪問策略和URL重寫兩個功能,通過IP訪問策略可以制定服務針對不同IP的訪問限制控制;而URL重寫則可以制定更好的URL訪問方式。以下介紹這兩的功能的使用:
IP策略
組件在1.6.7
開始集成了IP限制功能,可以通過配置白名單或黑名單的方式來配置可訪問的IP。該功能默認情況是禁用,如果有需要則打開此功能來對訪問進行限制(該功能暫只對IPv4有效,IPv6則暫時無效)。
配置
可以通過HttpApiServer.IPv4Tables.Type
配置IP訪問限制,默認值是None
不開啟,配置Black
開啟默名單限制,所有在黑名單中的IP不能訪問服務;配置White
開啟白名單,所有在白名單中的IP才能訪問服務。可以通過以下方法來添加IP
-
AddWhite
方法添加白名單IP
HttpApiServer.IPv4Tables.AddWhite("192.168.2.1/24","192.168.1.18");
-
AddBlack
方法添加黑名單IP
HttpApiServer.IPv4Tables.AddBlack("192.168.2.1/24","192.168.1.18");
配置文件
可以通過文件來配置,在目錄下編輯iptables.json
(如果文件不存在自行添加)
{ "Type": "White", "WhiteList": [ "192.168.2.1/24", "192.168.2.18" ], "BlackList": [ "192.168.2.1/24" ] }
Url重寫
通過Url重寫可以提高Url訪問友好性同時不需要調整原有服務的Url訪問地址,組件在新版本對Url重寫進行的優化調整,以支持更靈活的重寫功能。
配置
可以通過HttpApiServer.UrlRewrite.Add
方法來添加Url重寫規則.
server.UrlRewrite.Add("/cate/{0}.html", "/index.html");
以上重寫是把/cate/
下面的所有html重寫到index.html
.
配置文件
如果不想通過寫代碼來完成,可以配置目錄下的rewrite.json
文件(不存在則自行添加)
[ { "Url": "/cate/{0}.html", "Rewrite": "/index.html" } ]
詳細描述
組件對Url重寫的依據是BaseUrl
基礎訪問路徑進行匹配,匹配方式不匹分大小寫。通過{name}
來描述一個Url的可變部分,name
是一個變量名,這個變量可以在重寫Url部分使用,一個Url可以有多個變量描述.這些重寫的變量都會被寫入到HttpContext的請求數據中,更方便綁定到控制器參數上.
-
示例一
{ "Url": "/api/customers/{count}", "Rewrite": "/customers/{count}" }
-
示例二
{ "Url": "/api/{user}/{id}", "Rewrite": "/api/{user}?id={id}" }
-
官方blog
server.UrlRewrite.Add("/cate/{0}.html", "/index.html", "html") .Add("/search/{0}.html", "/index.html", "html") .Add("/tag/{0}.html", "/index.html", "html") .Add("/blog/{0}.html", "/blog.html", "html") .Add("/photos/{0}.html", "/photos.html", "html");
以上是 http://ikende.com/blog/ 的一個重寫規則,把分類,標籤和查詢都路由到index.html
頁面處理了。
動態重寫
靜態規則有時候很難滿足應用的需要,因此組件HttpRequest
提供UrlRewriteTo
方法用於重寫當前的請求Url。那什麼時候使用動態重寫呢?以下描述一個簡單的場景來表述動態重寫的作用,當一個API提供了一個V1版後又開發了V2版本,但希望用戶在不改變Url基礎規則的情況可以兼容兩種版本的調用;出現這情況一般會想到在前置代理做一些轉發規則來滿足需求,但組件提供動態重寫則可以滿足這樣的需求。
[Controller(BaseUrl = "Api")] public class Api { public object Hello(string name) { return $"hello {name} {DateTime.Now}"; } } [Controller(BaseUrl = "/v2/Api")] public class ApiV2 : IController { public object Hello(string name) { return $"hello {name} {DateTime.Now} v2"; } [NotAction] public void Init(HttpApiServer server, string path) { server.HttpRequesting += (o, e) => { if (e.Request.BaseUrl.IndexOf("/api", StringComparison.OrdinalIgnoreCase) >= 0) { if (e.Request.Data["version"] == "v2") { e.Request.UrlRewriteTo("/v2" + e.Request.Url); } } }; } }
只需要在實現V2版本中對HttpRequesting
進行一個監聽並根據情況進行處理即可以;而V1的代碼無須更改,已有的Url沒有變化,只需要在新的調用中添加對應的版本描述即實現。
Url重寫是BeetleX的webapi基礎功能,因此對應的服務網關也可以定義相關url重寫功能用於服務轉發上.服務網關重寫插件使用:https://github.com/IKende/Bumblebee/wiki/Url重寫