程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Taurus.MVC 2.2 開源發布:WebAPI 功能增強(請求跨域及Json轉換),webapijson

Taurus.MVC 2.2 開源發布:WebAPI 功能增強(請求跨域及Json轉換),webapijson

編輯:關於.NET

Taurus.MVC 2.2 開源發布:WebAPI 功能增強(請求跨域及Json轉換),webapijson


背景:

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方面,仍遵行著簡單實用高效的原則。

歡迎加入金牛的行列!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved