日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

ASP.NET WebAPI Get和Post 传参总结

發(fā)布時間:2024/4/13 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET WebAPI Get和Post 传参总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這里我使用Jquery 來發(fā)起異步請求實現(xiàn)數(shù)據(jù)調(diào)用。

  繼續(xù)使用上一文章中的示例,添加一個index.html頁面,添加對jquery的引用。

?

一、無參數(shù)Get請求

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

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

  也可以用$.ajax({type:"get"}) 方式,正確的獲得了返回數(shù)據(jù):

?

二、傳遞一個參數(shù)的Get請求

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

  后臺正確的返回數(shù)據(jù):

?

三、傳遞兩個或多個參數(shù)的Get請求

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

?  后臺正確的返回數(shù)據(jù):

四、無參數(shù)的Post請求

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

  后臺正確的返回了數(shù)據(jù):

五、傳遞一個參數(shù)的Post請求:

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

  所以,我們只要我們修改了后臺代碼,就一定要重新生成一下:

?

  不過,當(dāng)我們重新生成項目,再次發(fā)送請求,看到的仍然是404錯誤,再次檢查一番代碼,也沒有發(fā)現(xiàn)是哪里的問題。

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

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

那我們要怎么來解決呢?

通過搜索MSDN上Web API官網(wǎng)中的說明,我們可以找到下面的一段介紹:

在Action 方法中我們需要使用 [FromBody] 屬性標(biāo)簽來標(biāo)明屬性

  修改后,再次發(fā)送請求,我們可以看到,Status Code 為200,請求發(fā)送成功。

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

但讓我們詫異的卻是,后臺返回的數(shù)據(jù)中name的值為空。

  通過調(diào)試,我們可以看到,后臺Action 中接收到的name值為null。

?

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

現(xiàn)在,咱們把data中的key設(shè)置為空,然后再次發(fā)送請求:

  測試可見,后臺正確的接收到了數(shù)據(jù):

?六、傳遞兩個參數(shù)的Post請求

  按理說,一個參數(shù)的請求實現(xiàn)了,那么傳遞兩個或者多個參數(shù)也就很順利了,對于兩個參數(shù)的后臺接收方法,我們可能會這樣來寫:

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

?

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

再次查看官網(wǎng)中的介紹,我們了解到:

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

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

  前臺頁面再次發(fā)送請求:

  Status Code為200,請求成功,并正確獲取到后臺返回的數(shù)據(jù):

?

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

再次發(fā)送請求:

  可以看到,From Data 中數(shù)據(jù)的格式為json字符串,Status Code為200,請求正確,但結(jié)果又出錯了,后臺又沒有接收到數(shù)據(jù)參數(shù):

那么問題到底出在哪呢?

  我們再次查看上圖中請求頭內(nèi)容,注意到,雖然我們傳遞的數(shù)據(jù)格式是json字符串,但請求頭中的Content-type 卻為?

application/x-www-form-urlencoded ,并不是json格式對于的 application/json 。 而編碼格式?application/x-www-form-urlencoded 表示的是:窗體數(shù)據(jù)被編碼為名稱/值對。?

  這里,也就是我想要說的一個注意點。平時我們在使用json數(shù)據(jù)的時候,很容易就忘記了 要指定 Content-type 為 "application/json" ,所以就容易導(dǎo)致很多“想不到”的錯誤。

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

  這次,后臺正確的接收并返回了數(shù)據(jù):

?

七、傳遞多個參數(shù)的Post請求

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

后臺接收并返回數(shù)據(jù):

?

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

  有時候我們還會遇到需要傳遞多個不同對象參數(shù)的情況,對于這種特殊的情況在 Json.Net 中為我們提供了一個 名為 JObject 的通用對象容器,我們可以通過 .對象名 的方式來動態(tài)的遍歷參數(shù)里面的屬性的值,然后動態(tài)的轉(zhuǎn)換和json類型中對應(yīng)的屬性類型。

比如:

后臺調(diào)試,通過dynamic 動態(tài)轉(zhuǎn)換獲取屬性的值:

后臺正確的返回了數(shù)據(jù):

?

九、獲取不同類型的數(shù)據(jù)

  一般我們獲取到后臺返回的數(shù)據(jù)格式類型為 json格式,我們也可以指定 請求頭中的輸出類型來獲得不同的返回類型數(shù)據(jù):

指定輸出類型為xml格式:

指定輸出類型為 json格式:

?

  基本到這里,這篇文章的主要內(nèi)容也就算說完了,其中的重點還是 Post請求中對于參數(shù)的處理是需要重點注意的。

  上面我們在測試的過程中,都是通過自己創(chuàng)建的Controller控制器類來對參數(shù)進行接收處理,可能有人會問,我們這么寫到底是否符合規(guī)范呢,Web API中默認(rèn)是怎么來處理的呢? 這里,Visual Studio 中也為我們自帶了 Web API控制器類:

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

  這里我們可以看到,默認(rèn)創(chuàng)建的Controller控制器類中,對于Post請求的Action方法都自帶了 [FromBody] 屬性。 現(xiàn)在不用我說,你也已經(jīng)知道為什么 它會為參數(shù)默認(rèn)帶一個 [FromBody]屬性吧!

?

轉(zhuǎn)載:http://www.cnblogs.com/babycool/p/3922738.html

轉(zhuǎn)載于:https://www.cnblogs.com/lkd3063601/p/4798466.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET WebAPI Get和Post 传参总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。