原文地址:https://www.zhaimaojun.top/Note/5475297(我自己的博客網站)
各種Post方式上傳參數到服務器,服務器接收各種參數的示例
webapi可以說是很常用了,內容也很多,get方式用的多而且很簡單,沒有說的必要了,但是post方式中,數據從數據體中提取是總是會遇到一些妖魔現象。對此,就我知道的我說一些吧。
作為懶漢,一切繁瑣的代碼,邏輯,都是累贅,都是看不順眼的,拖泥帶水的代碼,邏輯就像強迫症眼里的不規則擺放,總是要解決掉心里才能舒坦的懶。天天幻想着一條代碼解決所有問題~
最近有點想注冊個bilibili的up主發點代碼講解的視頻,我想我能將的比較細致,碼字太累了,不符合懶漢的生活習慣,就這短短的文章也是碼了一下午才寫完的,所以還是講話來的快,還不耽誤玩游戲。
webapi的url組成我就不詳細說了,一般都是http://XXX/api/控制器名?參數名=參數值&參數名=參數值
第一種:
接收參數:
[httppost] public string Get(string p1,[frombody]string p2){ return p1+p2; }
c#發送參數:
var p2 = "param2";//p2是需要post傳輸的 var url = "http://XXX/api/XXX?p1=param1";//p2是來自於post體,所以不再url中 var req= (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded";//你沒有看錯,就是這個 var bts = Encoding.Utf8.GetBytes("="+p2);//划重點!!post方式中application/x-www-form-urlencoded傳輸方式下,frombody的參數只能有一個!而在body中你要是用key=value方式傳遞參數,那么接收端收到的全都是null。 req.ContentLenth = bts.Lenth;//划重點!!post方式必須設置這個值 var st = req.GetResquestStream(); st.Write(bts,0,bts.Lenth);//划重點!!post方式必須要往body中寫入數據 var res= (HttpWebResponse)req.GetResponse();
ajax提交參數:
var url = "http://XXX/api/XX?p1=param1" var p2 = "param2" $.post(url, "="+p2, function(res){ alert(res); });
微信小程序提交參數(JavaScript):
var p2 = "param2"; wx.request({ url: 'http://XXX/api/XX?p1=param1', method: 'POST', header: {'content-type': 'application/x-www-form-urlencoded'},//或者不寫這行 data: "=" + p2, success(re){ console.log(re); } });
這種方式的注意點:
很早前我學習api的時候就遇到了參數始終為null的苦惱,當時也沒有相關的資料可以查閱,百度到的內容都七七八八,都說不到重點上,最后不知道在哪個網站上看見了有個人也是同樣的問題,有人提到說是=號前面不要參數名,我嘗試了,還真就解決問題了,於是我寫了哪一篇博文,到現在三年多了,被好多人轉載了。說明大家都被這個問題折磨了很久啊哈哈哈,其實要點很簡單,就是body中只要一個參數的值,且=號開始,=號前面不寫參數名,=號后面的所有內容都會被讀取為唯一的那個frombody的參數內容。就是這樣的。要知道api只能有一個參數是frombody的!
第二種:
接收參數:
[httppost] public string Post(string p1){ var p2 = HttpContext.Current.Request.Form["p2"]; var p3 = HttpContext.Current.Request.Form["p3"]; if(HttpContext.Current.Request.Files.Lenth > 0){ var fs = HttpContext.Current.Request.Files[0]; fs.SaveAs(HttpContext.Current.Server.MapPath("~/data.txt")); } return p1+p2+p3;//上傳的混合參數 }
c#發送參數:
private string UploadFileAndParams(string serverIp, int serverPort, string rowurl, string filename, Dictionary<string, string> otherparams) { try { //打開socket連接 Socket httpsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); httpsocket.Connect(serverIp, serverPort); //計算得出總的一個請求 //請求的頭部 string httprequestheader = "POST " + rowurl + " HTTP/1.1\r\n"; httprequestheader += "Host: " + serverIp + ":" + serverPort + "\r\n"; //httprequestheader += "Content-Length: " + "\r\n";//計算並添加數據長度,這里的數據長度是總的長度 httprequestheader += "Content-Type: multipart/form-data; boundary=OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp\r\n"; httprequestheader += "Connection: Keep-Alive\r\n"; //發送文件 string httpFileheader = "--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp\r\n"; httpFileheader += "Content-Disposition: attachment; name=text; filename=" + Path.GetFileName(filename) + "\r\n"; httpFileheader += "Content-Type: application/octet-stream\r\n"; httpFileheader += "Content-Transfer-Encoding: binary\r\n"; httpFileheader += "\r\n"; byte[] Bfileheader = Encoding.UTF8.GetBytes(httpFileheader); //這里需要發送文件的內容,二進制 FileStream localfile = new FileStream(filename, FileMode.Open); //發送其他參數 var lBParamheaders = new List<byte[]>(); foreach (var item in otherparams) { string paramstr = "--OCqxMF6-JxtxoMDHmoG5W5eY9MGRsTBp\r\n"; paramstr += "Content-Disposition: form-data; name=" + item.Key + "\r\n"; paramstr +=