原文地址: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 +=