標籤:問題 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請求