最近在寫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