Beetlex服務框架之Webapi訪問限制和url重寫

在新版本的BeetleX.FastHttpApi中集成了IP訪問策略和URL重寫兩個功能,經過IP訪問策略能夠制定服務針對不一樣IP的訪問限制控制;而URL重寫則能夠制定更好的URL訪問方式。如下介紹這兩的功能的使用:html

IP策略git

組件在1.6.7開始集成了IP限制功能,能夠經過配置白名單或黑名單的方式來配置可訪問的IP。該功能默認狀況是禁用,若是有須要則打開此功能來對訪問進行限制(該功能暫只對IPv4有效,IPv6則暫時無效)。github

配置

能夠經過HttpApiServer.IPv4Tables.Type配置IP訪問限制,默認值是None不開啓,配置Black開啓默名單限制,全部在黑名單中的IP不能訪問服務;配置White開啓白名單,全部在白名單中的IP才能訪問服務。能夠經過如下方法來添加IPweb

  • AddWhite方法添加白名單IPjson

HttpApiServer.IPv4Tables.AddWhite("192.168.2.1/24","192.168.1.18");
  • AddBlack方法添加黑名單IPapi

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訪問地址,組件在新版本對Url重寫進行的優化調整,以支持更靈活的重寫功能spa

配置

能夠經過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重寫

相關文章
相關標籤/搜索