webapi 之 post參數傳遞

最近在寫webapi,在寫post請求接口時遇到了很多的問題,在此記錄下來。javascript

post請求的參數和get請求有點不同,咱們知道get請求的參數是經過url來傳遞的,而post請求則是經過http的請求體中傳過來的,WebApi的post請求也須要從http的請求體裏面去取參數。java

單個參數錯誤寫法

//錯誤的js ajax post寫法 $.ajax({ type:"post", url:"http://localhost:44670/IOF/test/Test1", data:{name:"張三丰"}, success:function(data,status){ console.log(data); console.log(status); } }); 
//錯誤的webapi寫法 [HttpPost] public string Test1(string name) { return name; } 

上面的寫法看似很正確,實際上結果這這樣的程序員

 
 

並且咱們在asp.net webapi裏打上斷點是沒法跳轉到斷點的。web

咱們更改asp.net webapi(在參數中添加 [FromBody] ),以下ajax

[HttpPost]
        public string Test1([FromBody] string name) { return name; } 

咱們仍然用上面的js來調用接口Test1
此時就能夠看到程序跳轉到了斷點處,可是咱們發現name是空值json

 
 

單個參數正確寫法

//正確的js寫法 $.ajax({ type:"post", url:"http://localhost:44670/IOF/test/Test1", data:{"":"張三丰"}, success:function(data,status){ console.log(data); console.log(status); } }); 
//正確的webapi寫法 [HttpPost] public string Test1([FromBody] string name) { return name; } 

此時咱們就看到Status Code是200OK了,webapi也拿到了傳遞過來的name值了
api

 
 

 

 
 

咱們通常的經過url取參數的機制是鍵值對,即某一個key等於某一個value,而這裏的FromBody和咱們通常經過url取參數的機制則不一樣,它的機制是=value,沒有key的概念,而且若是你寫了key(好比ajax參數寫的{name:"張三丰"}),後臺反而獲得的name等於null。app


上面是傳遞1個參數,那若是是多個呢?是否是ajax能夠這樣寫{" ":"張三丰"," ":"13200000000"},後臺能夠這樣寫[FromBody] string name,[FromBody] string phoneasp.net

多個參數錯誤寫法

//錯誤的寫法 $.ajax({ type:"post", url:"http://localhost:44670/IOF/test/Test1", data:{"":"張三丰","":"13200000000"}, success:function(data,status){ console.log(data); console.log(status); } }); 
//錯誤的寫法 [HttpPost] public string Test1([FromBody] string name, [FromBody] string phone) { return name + ":" + phone; } 
 
 

說明這樣是行不通的。函數

多個參數正確寫法

//正確寫法 $.ajax({ type:"post", url:"http://localhost:44670/IOF/test/Test1", data:{name:"張三丰",phone:"13200000000"}, success:function(data,status){ console.log(data); console.log(status); } }); 
//test:新建一個類如包涵全部的參數 public class test { private string name; private string phone; public string Name { get{return name;} set{ name = value;} } public string Phone { get{return phone;} set{phone = value;} } } 
//正確寫法 [HttpPost] public string Test1([FromBody] test model) { return model.Name; } 
 
 
 
 

若是咱們的webapi都是post,並且每一個都是多個參數,那豈不是要建立不少的類來接收post過來的值?做爲一個愛偷懶的程序員,那怎麼能夠!!

最優寫法

// JSON.stringify():這個函數的做用主要是爲了序列化對象的。 $.ajax({ type:"post", url:"http://localhost:44670/IOF/test/Test1", contentType: 'application/json', data:JSON.stringify({name:"張三丰",phone:"13200000000"}), success:function(data,status){ console.log(data); console.log(status); } }); 
//webapi 要換個寫法,dynamic:序列化 [HttpPost] public string Test1(dynamic obj) { return obj.name; } 

咱們把js要傳遞的參數序列化,而後經過後來dynamic來接收序列化的值。

 
 

總結

以上就是post請求參數傳遞的幾種方法,推薦使用最好一種【最優寫法】。

轉自:https://www.jianshu.com/p/26999e75cfba

相關文章
相關標籤/搜索