[轉發]MVC WebAPI get和post請求


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

來看看對於一般前台頁面發起的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請求

轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM