ASP.NET MVC學習系列(二)-WebAPI請求

來源:互聯網
上載者:User

標籤:問題   webapi   多個   str   bind   bapi   url   標籤   images   

  繼續接著上文 ASP.NET MVC學習系列(一)-WebAPI初探 來看看對於一般前台頁面發起的get和post請求,我們在Web API中要如何來處理。

這裡我使用Jquery 來發起非同步請求實現資料調用。

  繼續使用上一文章中的樣本,添加一個index.html頁面,添加對jquery的引用。

 

一、無參數Get請求

  一般的get請求我們可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 來實現:

  請求的後台Action方法仍為上篇文章中的GetUser() :

  也可以用$.ajax({type:"get"}) 方式,正確的獲得了返回資料:

 

二、傳遞一個參數的Get請求

  通常我們需要傳遞參數只需要指定ajax方法的data屬性即可: data:{"name":"趙大寶"}

  後台正確的返回資料:

 

三、傳遞兩個或多個參數的Get請求

  按照上面的方法,對於多個參數我們可以很容易就寫出來: data:{"name":"趙大寶","age":12}

  後台正確的返回資料:

四、無參數的Post請求

  我們可以使用$.post() 或$.ajax({type:"post"}) 來發起post請求:

  後台正確的返回了資料:

五、傳遞一個參數的Post請求:

  首先這裡需要提醒大家一下,我們在修改完後台代碼後,如果沒有重建項目,那麼在請求時就會報錯:“未找到與請求***匹配的HTTP資源” :

  所以,我們只要我們修改了後台代碼,就一定要重建一下:

 

  不過,當我們重建項目,再次發送請求,看到的仍然是404錯誤,再次檢查一番代碼,也沒有發現是哪裡的問題。

  事實上,ASP.NET Web API能夠正確的識別我們的UserController控制器處理Post /api/user ,但卻不能找到一個可以接受的方法來處理請求。

也就是說,Web API接收到的請求能夠找到User控制器,但在該控制器中找不到名稱為Def 的這個Action。

那我們要怎麼來解決呢?

通過搜尋MSDN上Web API官網中的說明,我們可以找到下面的一段介紹:

在Action 方法中我們需要使用 [FromBody] 屬性標籤來標明屬性

  修改後,再次發送請求,我們可以看到,Status Code 為200,請求發送成功。

  可以看到,在post請求中,方法的參數必須要用 [FromBody] 屬性來修飾才可以, [FromBody] 就告訴Web API 要從post請求體重去擷取參數的值。

但讓我們詫異的卻是,後台返回的資料中name的值為空白。

  通過調試,我們可以看到,後台Action 中接收到的name值為null。

 

  通過上面的測試我就也能夠猜測到,Web API 要求請求傳遞的 [FromBody] 參數,肯定是有一個特定的格式,才能被正確的擷取到。而這種特定的格式並不是我們常見的 key=value 的索引值對形式。Web API 的模型繫結器希望找到 [FromBody] 裡沒有鍵名的值,也就是說, 不是 key=value ,而是 =value 。

現在,咱們把data中的key設定為空白,然後再次發送請求:

  測試可見,後台正確的接收到了資料:

 六、傳遞兩個參數的Post請求

  按理說,一個參數的請求實現了,那麼傳遞兩個或者多個參數也就很順利了,對於兩個參數的後台接收方法,我們可能會這樣來寫:

但事實證明,這樣是錯誤的。

 

那到底兩個或者多個參數我們要怎樣來定義呢?

再次查看官網中的介紹,我們瞭解到:

  也就是說,[FromBody] 修飾的參數只能有一個。我們需要對傳遞的多個參數進行封裝才行。

這裡,我們可以將 Name和 Age 封裝成一個Student 類:

  前台頁面再次發送請求:

  Status Code為200,請求成功,並正確擷取到後台返回的資料:

 

  這裡,我們通過上面圖片中的要求標頭資料可以看到,Form Data 的格式是 key=value&key=value 這種表單資料格式 Name=%E8%B5%B5%E5%A4%A7%E5%AE%9D&Age=13 ,我們平時使用的比較多的一般為json格式。 這裡,我們使用 JSON.stringify() 來序列化資料。

再次發送請求:

  可以看到,From Data 中資料的格式為json字串,Status Code為200,請求正確,但結果又出錯了,後台又沒有接收到資料參數:

那麼問題到底出在哪呢?

  我們再次查看中要求標頭內容,注意到,雖然我們傳遞的資料格式是json字串,但要求標頭中的Content-type 卻為

application/x-www-form-urlencoded ,並不是json格式對於的 application/json 。 而編碼格式 application/x-www-form-urlencoded 表示的是:表單資料被編碼為成對的名稱和數值。

  這裡,也就是我想要說的一個注意點。平時我們在使用json資料的時候,很容易就忘記了 要指定 Content-type 為 "application/json" ,所以就容易導致很多“想不到”的錯誤。

所以,我們在 $.ajax() 中指定 Content-type :

  這次,後台正確的接收並返回了資料:

 

七、傳遞多個參數的Post請求

  有了上面的經驗,傳遞多個參數的post請求我們就很容易能寫出來了:

後台接收並返回資料:

 

八、傳遞多個不同對象的Post請求

  有時候我們還會遇到需要傳遞多個不同對象參數的情況,對於這種特殊的情況在 Json.Net 中為我們提供了一個 名為 JObject 的通用對象容器,我們可以通過 .對象名 的方式來動態遍曆參數裡面的屬性的值,然後動態轉換和json類型中對應的屬性類型。

比如:

後台調試,通過dynamic 動態轉換擷取屬性的值:

後台正確的返回了資料:

 

九、擷取不同類型的資料

  一般我們擷取到後台返回的資料格式類型為 json格式,我們也可以指定 要求標頭中的輸出類型來獲得不同的傳回型別資料:

指定輸出類型為xml格式:

指定輸出類型為 json格式:

 

  基本到這裡,這篇文章的主要內容也就算說完了,其中的重點還是 Post請求中對於參數的處理是需要重點注意的。

  上面我們在測試的過程中,都是通過自己建立的Controller控制器類來對參數進行接收處理,可能有人會問,我們這麼寫到底是否符合規範呢,Web API中預設是怎麼來處理的呢? 這裡,Visual Studio 中也為我們內建了 Web API控制器類:

我們可以添加建立項選擇 Web API控制器類 即可:

  這裡我們可以看到,預設建立的Controller控制器類中,對於Post請求的Action方法都內建了 [FromBody] 屬性。 現在不用我說,你也已經知道為什麼 它會為參數預設帶一個 [FromBody]屬性吧!

好了,今天的內容就到這裡,下面附上我參考的幾篇文章:

MSDN中關於Web API 中 [FromBody] 的介紹: Parameter Binding in ASP.NET Web API | The ASP.NET Site 

關於[FromBody]屬性的介紹及Post參數說明(E文): Using jQuery to POST [FromBody] parameters to Web API | Encosia 

上面網頁文章的翻譯版本:【翻譯】使用JQuery POST表單到Web API | 北飄漂 

Post 多個參數到Web API的總結: POST多個參數到Web API控制器方法總結 | 北飄漂

附當前項目的代碼:XWebAPIDemo-WebAPI請求

轉載請註明出處。

 

轉載自 http://www.cnblogs.com/babycool/p/3922738.html

ASP.NET MVC學習系列(二)-WebAPI請求

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.