(三)Asp.net web api中的坑-【http post請求中的參數】


接上篇,

HttpPost 請求

1、post請求,單參數

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["Phone"] = "phone13880825221";
para["UID"] = "uid287572292";
$.post(url, para, function () { }, "application/json");

后端

[HttpPost]
        public IHttpActionResult GetData2(string phone)
        {
            string result = "接口通了";
            return Ok<string>(result);
        }

 

image

這個,這個他媽的又來一個妖怪,為啥呢,這跟get差不多呀,咋就接不到了,

哦,還記得上篇的知識點麽?HTTP協議中get請求的數據會附在URL之后(就是把數據放置在HTTP協議頭中),而post請求則是放在http協議包的包體中

image

上篇的get請求中,傳遞實體時,[FromUri]-因為get請求,參數數據放置在HTTP協議頭中,而post放在http協議包的包體中,如上圖,推斷出肯定有個[FromBody]之類的,事實勝於吹牛,試試再說,

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["Phone"] = "phone13880825221";
para["UID"] = "uid287572292";
$.post(url, para, function () { }, "application/json");

后端

[HttpPost]
        public IHttpActionResult GetData2([FromBody]string phone)
        {
            string result = "接口通了";
            return Ok<string>(result);
        }

yeah,斷點進action,but,phone=null,為啥呢,查閱相關大神寫的博客,通過url取參數的機制是鍵值對,即某一個key等於某一個value,而這里的FromBody和我們一般通過url取參數的機制則不同,它的機制是=value,單個參數,大神說要這么改,

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para[""] = "phone13880825221";
$.post(url, para, function () { }, "application/json");

后端不變,好吧,phone確實能收到值了。

 

************************************************************************************

2、post請求,多個參數

既然post從請求主體中取參數的機制與get從url中取參數的機制不同,post為=value,

請求多參數-轉換為請求實體-轉換為請求單參數問題,

多參數包裝成實體類,實體類包裝成json字符串格式

前端

var url = 'api/EnterOrExit/GetData2';


var para = {};


para["phone"] = "13880825221";

 

para["UID"] = "uid287572292";

 

var str = JSON.stringify(para);

 

var data= {“”,str }

$.post(url, data, function () { }, "application/json");

后端

[HttpPost]
        public IHttpActionResult GetData2([FromBody]string requestStr)
        {

            var model= Newtonsoft.Json.JsonConvert.DeserializeObject<TB_RequestModel>(requestStr);
            string result = "接口通了";
            return Ok<string>(result);
        }

requestStr獲取到json格式字符串,再反序列化為實體,即可。

如果我們前后台每次傳遞多個參數的post請求,每次都需要修改實體,對於不經常修改的參數,當然上面的方法已經足夠,每次參數在變化,大神提供了一種解決方法,

前端

var url = 'api/EnterOrExit/GetData2';
var para = {};
para[""] = "phone13880825221";

para["UID"] = "uid287572292";

var data= JSON.stringify(para);

$.post(url, data, function () { }, "application/json");

后端

[HttpPost]
 public object GetData2(dynamic obj)
 {
     var UID= Convert.ToString(obj.UID);          
        string result = "接口通了";
        return Ok<string>(result);
 }

有一點需要注意的是這里在ajax的請求里面需要加上參數類型為Json,即 contentType: 'application/json', 這個屬性,這是ajax請求,request content-type,后面我還會講到response的content-type。

---------------------------------------------------------------------------------------------------------------------

3、post請求,實體參數

使用實體作為參數的時候,前端直接傳遞普通json,后台直接使用對應的類型去接收即可,不用FromBody。但是這里需要注意的一點就是,這里不能指定contentType為appplication/json,否則,參數無法傳遞到后台。httppost,request請求中默認的contentType:application/x-www-form-urlencoded,form表單數據被編碼為key/value格式發送到服務器(表單默認的提交數據的格式)

前端:

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "phone13880825221";

para["UID"] = "uid287572292";

 

var data= para;

 

$.post(url, data, function () { });

后端:

[HttpPost]
public IHttpActionResult test(RequestModel model)
{
           string msg = "";
           string code = "";
           string result = "接口通了";
           return Ok<string>(result);
}

model不為空,且各屬性有值

ps,留意上面前端代碼,$.post(url, data, function () { });沒有指定request的content-type,

post請求默認是將表單里面的數據的key/value形式發送到服務,而我們的服務器只需要有對應的key/value屬性值的對象就可以接收到。而如果使用application/json,則表示將前端的數據以序列化過的json傳遞到后端,后端要把它變成實體對象,還需要一個反序列化的過程。按照這個邏輯,那我們如果指定contentType為application/json,然后傳遞序列化過的對象應該也是可以的啊。

所以下面這種方式,也是可以的,

前端:

var url = 'api/EnterOrExit/GetData2';
var para = {};
para["phone"] = "13880825221";

para["UID"] = "uid287572292";

var data= JSON.stringify(para);

$.post(url, data, function () { },"application/json”);

后端:

[HttpPost]
public IHttpActionResult test(RequestModel model)
{
           string msg = "";
           string code = "";
           string result = "接口通了";
           return Ok<string>(result);
}

總結知識點:在http請求中,如果你指定了contentType為application/json,則必須要傳遞序列化過的對象;如果使用post請求的默認參數類型,則前端直接傳遞json類型的對象即可。

Post請求api,還有幾種特別的,數組,集合,但是由於本人沒有在工作中使用,所以沒有發言權,不過使用方式都是上面的基本參數演變過來的,搞清楚原理和門路,相信使用的人可以應付多種參數請求的需求。

 

Post請求api,有時候,你會發現,方法什么的都對,還是會報

WebAPI Post類型傳參報錯“找不到與該請求匹配的操作”   參考博文http://www.cnblogs.com/xiaoerlang90/p/5420030.html


免責聲明!

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



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