Beetlex服務框架之Webapi訪問限制和url重寫
在新版本的BeetleX.FastHttpApi中集成了IP訪問策略和URL重寫兩個功能,通過IP訪問策略可以制定服務針對不同IP的訪問限制控制;而URL重寫則可以制定更好的URL訪問方式。以下介紹這兩的功能的使用:
IP策略
元件在1.6.7
開始集成了IP限制功能,可以通過配置白名單或黑名單的方式來配置可訪問的IP。該功能預設情況是禁用,如果有需要則開啟此功能來對訪問進行限制(該功能暫只對IPv4有效,IPv6則暫時無效)。
配置
可以通過HttpApiServer.IPv4Tables.Type
配置IP訪問限制,預設值是None
不開啟,配置Black
開啟默名單限制,所有在黑名單中的IP不能訪問服務;配置White
-
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