天天看點

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity<T>()方法總結:

1:有使用者回報了關于跨域請求的問題。

2:有使用者回報了參數擷取的問題。

3:jsonhelper的增強。

在綜合上面的條件下,有了2.2版本的更新,也是以寫了此文。

<a href="https://github.com/cyq1162/taurus.mvc">https://github.com/cyq1162/taurus.mvc</a>

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

下面對增強的功能進行介紹:

除了正常的的jsonp跨域,html5開始支援增強跨域,則變得更為友善,隻需要服務端請求頭輸出:

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:
Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

如上代碼:

1

2

3

4

5

<code>1:可以通過檢測來源的主機和請求的主機不一緻判斷是否跨域,如果是,則傳回允許跨域辨別。</code>

<code>2:第一個*表示允許任意請求,當然你也可以指定多個“http://a.com,http://b.com”.</code>

<code>3:第二個true表示允許跨域操作cookie,反之,則一行都不要出現,而不是設定為false。</code>

另外,網上有文章介紹說,跨域時,浏覽器會發出一個options的預請求,于是架構也做出了處理:

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:
Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

狀态碼204,比起200的好處,是不需要傳回conent内容,隻傳回請求頭。

在demo的時候,測試了一下get請求,沒發現浏覽器發出預請求,可能場景或環境不同。

在控制台(aries.cyqdata.com)發起一個跨域請求(http://localhost:13508/home/index):

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

如果把跨域關閉:

結果是:

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

于是:架構預設是支援跨域請求的,如果不想支援,可以關閉!

發現有使用者在使用taurus.mvc時,思維還在停留asp.net webapi。

比如請求:

<code>http:</code><code>//localhost:13508/api/default?id=1</code>

對方法定義的方法是:

<code>public</code>  <code>void</code> <code>default(</code><code>int</code> <code>id)</code>

<code>{</code>

<code>          </code> 

<code>}</code>

結果當然抛異常,找不到方法了,架構預設收集的都是無參數的方法名。

于是使用者就懵了,不知道怎麼拿參數,我也懵了,怎麼能不知道的,至少也應該知道request吧。

針對:a=1&amp;b=2這種get或post的參數,用query&lt;t&gt;("字段")拿。

<code>public</code> <code>override</code> <code>void</code> <code>default()</code>

<code>   </code><code>int</code> <code>id = query&lt;</code><code>int</code><code>&gt;(</code><code>"id"</code><code>);</code>

針對:/api/user/3這種參數,可以直接拿action參數(user)、para參數就是3了(按:controller/action/para這麼個分隔方式)

<code>   </code><code>string</code> <code>para3 = para;</code>

<code>}</code>

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

直接就是一串json:({a:"1","b":"2"})過來,這時候,正常的方法是拿不到資料。

原生的可以通過httpinputstream流拿到,但架構進行了人性化的封裝:

通過getjson()方法,可以擷取:

執行輸出的結果:

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

該方法不僅可以拿到直接post的json,還可以将a=1&amp;b=2這種方式直接轉json傳回,如:

發起請求:

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

請求結果:

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

對于post請求處理結果一緻,就不重複截圖了!

Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:
Taurus.MVC 2.2 開源釋出:WebAPI 功能增強(請求跨域及Json轉換)背景:開源位址:1:跨域請求2:正常請求參數的擷取3:增強型的參數擷取:GetJson方法4:增強型的GetEntity&lt;T&gt;()方法總結:

示範為get、post的結果一緻,不另截圖!

你可以post複雜的json:{a:{b:2,c:3},f:['1','2']}之類的,隻要實體對應上,即可轉換,不另外截圖。

暫未提供:對于post的[{},{}]的json數組轉換,可以用:

<code>list&lt;ab&gt; list = jsonhelper.tolist&lt;ab&gt;(getjson());</code>

以上為擷取參數轉json的相關方法,非常實用!!!

對于輸出json,用write方法,可将複雜對象轉換成json。

taurus.mvc,在處理為webapi方面,仍遵行着簡單實用高效的原則。

歡迎加入金牛的行列!

本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/p/6144736.html