背景:1:有用戶反饋了關於跨域請求的問題。2:有用戶反饋了參數獲取的問題。3:JsonHelper的增強。在綜合上面的條件下,有了2.2版本的更新,也因此寫了此文,詳情如下...... ...
背景:
1:有用戶反饋了關於跨域請求的問題。
2:有用戶反饋了參數獲取的問題。
3:JsonHelper的增強。
在綜合上面的條件下,有了2.2版本的更新,也因此寫了此文。
開源地址:
https://github.com/cyq1162/taurus.mvc
下麵對增強的功能進行介紹:
1:跨域請求
除了常規的的JsonP跨域,Html5開始支持增強跨域,則變得更為方便,只需要服務端請求頭輸出:
1 if (context.Request.UrlReferrer != null && context.Request.Url.Host != context.Request.UrlReferrer.Host) 2 { 3 //跨域訪問 4 context.Response.AppendHeader("Access-Control-Allow-Origin", "*"); 5 context.Response.AppendHeader("Access-Control-Allow-Credentials", "true"); 6 }
如上代碼:
1:可以通過檢測來源的主機和請求的主機不一致判斷是否跨域,如果是,則返回允許跨域標識。 2:第一個*表示允許任意請求,當然你也可以指定多個“http://a.com,http://b.com”. 3:第二個true表示允許跨域操作cookie,反之,則一行都不要出現,而不是設置為false。
另外,網上有文章介紹說,跨域時,瀏覽器會發出一個OPTIONS的預請求,於是框架也做出了處理:
1 if (context.Request.HttpMethod == "OPTIONS") 2 { 3 context.Response.StatusCode = 204; 4 context.Response.AppendHeader("Access-Control-Allow-Method", "GET,POST,PUT,DELETE"); 5 context.Response.AppendHeader("Access-Control-Allow-Origin", "*"); 6 context.Response.AppendHeader("Access-Control-Allow-Headers", context.Request.Headers["Access-Control-Allow-Headers"]); 7 context.Response.End(); 8 }
狀態碼204,比起200的好處,是不需要返回Conent內容,只返回請求頭。
在Demo的時候,測試了一下Get請求,沒發現瀏覽器發出預請求,可能場景或環境不同。
下麵是一個簡單的測試:
在控制台(aries.cyqdata.com)發起一個跨域請求(http://localhost:13508/home/index):
如果把跨域關閉:
<add key="IsAllowCORS" value="false"/>
結果是:
於是:框架預設是支持跨域請求的,如果不想支持,可以關閉!
2:常規請求參數的獲取
發現有用戶在使用Taurus.MVC時,思維還在停留ASP.NET WebAPI。
比如請求:
http://localhost:13508/api/default?id=1
對方法定義的方法是:
public void Default(int id) { }
結果當然拋異常,找不到方法了,框架預設收集的都是無參數的方法名。
於是用戶就懵了,不知道怎麼拿參數,我也懵了,怎麼能不知道的,至少也應該知道Request吧。
下麵介紹框架封裝的獲取參數的方法:
1:Query<T>("欄位") (封裝自Request)
針對:a=1&b=2這種Get或Post的參數,用Query<T>("欄位")拿。
public override void Default() { int id = Query<int>("id"); }
2:Para參數
針對:/api/user/3這種參數,可以直接拿Action參數(user)、Para參數就是3了(按:Controller/Action/Para這麼個分隔方式)
public override void Default() { string para3 = Para; }
3:增強型的參數獲取:GetJson方法
1:有些場景,對方Post的數據,並不是key=value這種格式,而是:
直接就是一串Json:({a:"1","b":"2"})過來,這時候,常規的方法是拿不到數據。
原生的可以通過HttpInputStream流拿到,但框架進行了人性化的封裝:
通過GetJson()方法,可以獲取:
public override void Default() { Write(GetJson()); }
執行輸出的結果:
2:變態的GetJson():支持Get與Post的參數轉Json
該方法不僅可以拿到直接Post的Json,還可以將a=1&b=2這種方式直接轉Json返回,如:
發起請求:
請求結果:
對於Post請求處理結果一致,就不重覆截圖了!
4:增強型的GetEntity<T>()方法
1:對於Post或Get的常規參數:a=1&b=2這種類型的,除轉json,也可以轉實體:
發起請求:
請求結果:
演示為Get、Post的結果一致,不另截圖!
2:GetEntity支持無限級複雜嵌套
你可以Post複雜的Json:{a:{b:2,c:3},f:['1','2']}之類的,只要實體對應上,即可轉換,不另外截圖。
3:GetList<T>方法
暫未提供:對於Post的[{},{}]的Json數組轉換,可以用:
List<AB> list = JsonHelper.ToList<AB>(GetJson());
以上為獲取參數轉Json的相關方法,非常實用!!!
對於輸出Json,用Write方法,可將複雜對象轉換成Json。
上節:http://www.cnblogs.com/cyq1162/p/6069020.html 已介紹,不重覆了。
總結:
Taurus.MVC,在處理為WebAPI方面,仍遵行著簡單實用高效的原則。
歡迎加入金牛的行列!