原文的連接:http://www.cnblogs.com/babycool/p/3922738.htmlhtml
這裏我使用Jquery 來發起異步請求實現數據調用。jquery
繼續使用上一文章中的示例,添加一個index.html頁面,添加對jquery的引用。ajax
1、無參數Get請求json
通常的get請求咱們可使用jquery提供的$.get() 或者$.ajax({type:"get"}) 來實現:api
請求的後臺Action方法仍爲上篇文章中的GetUser() :app
也能夠用$.ajax({type:"get"}) 方式,正確的得到了返回數據:異步
2、傳遞一個參數的Get請求post
一般咱們須要傳遞參數只須要指定ajax方法的data屬性便可: data:{"name":"趙大寶"} 測試
後臺正確的返回數據:編碼
3、傳遞兩個或多個參數的Get請求
按照上面的方法,對於多個參數咱們能夠很容易就寫出來: data:{"name":"趙大寶","age":12}
後臺正確的返回數據:
4、無參數的Post請求
咱們可使用$.post() 或$.ajax({type:"post"}) 來發起post請求:
後臺正確的返回了數據:
5、傳遞一個參數的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設置爲空,而後再次發送請求:
測試可見,後臺正確的接收到了數據:
6、傳遞兩個參數的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 :
此次,後臺正確的接收並返回了數據:
7、傳遞多個參數的Post請求
有了上面的經驗,傳遞多個參數的post請求咱們就很容易能寫出來了:
後臺接收並返回數據:
8、傳遞多個不一樣對象的Post請求
有時候咱們還會遇到須要傳遞多個不一樣對象參數的狀況,對於這種特殊的狀況在 Json.Net 中爲咱們提供了一個 名爲 JObject 的通用對象容器,咱們能夠經過 .對象名 的方式來動態的遍歷參數裏面的屬性的值,而後動態的轉換和json類型中對應的屬性類型。
好比:
後臺調試,經過dynamic 動態轉換獲取屬性的值:
後臺正確的返回了數據:
9、獲取不一樣類型的數據
通常咱們獲取到後臺返回的數據格式類型爲 json格式,咱們也能夠指定 請求頭中的輸出類型來得到不一樣的返回類型數據:
指定輸出類型爲xml格式:
指定輸出類型爲 json格式:
基本到這裏,這篇文章的主要內容也就算說完了,其中的重點仍是 Post請求中對於參數的處理是須要重點注意的。
上面咱們在測試的過程當中,都是經過本身建立的Controller控制器類來對參數進行接收處理,可能有人會問,咱們這麼寫究竟是否符合規範呢,Web API中默認是怎麼來處理的呢? 這裏,Visual Studio 中也爲咱們自帶了 Web API控制器類:
咱們能夠添加新建項選擇 Web API控制器類 便可:
這裏咱們能夠看到,默認建立的Controller控制器類中,對於Post請求的Action方法都自帶了 [FromBody] 屬性。 如今不用我說,你也已經知道爲何 它會爲參數默認帶一個 [FromBody]屬性吧!