300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > C# 模拟浏览器发送post或get请求

C# 模拟浏览器发送post或get请求

时间:2019-05-18 15:21:57

相关推荐

C# 模拟浏览器发送post或get请求

一、基本示例

private string HttpPost(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr);request.CookieContainer = cookie;Stream myRequestStream = request.GetRequestStream();StreamWriter myStreamWriter = new StreamWriter(myRequestStream, Encoding.GetEncoding("gb2312"));myStreamWriter.Write(postDataStr);myStreamWriter.Close();HttpWebResponse response = (HttpWebResponse)request.GetResponse();response.Cookies = cookie.GetCookies(response.ResponseUri);Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}public string HttpGet(string Url, string postDataStr){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);request.Method = "GET";request.ContentType = "text/html;charset=UTF-8";HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream myResponseStream = response.GetResponseStream();StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));string retString = myStreamReader.ReadToEnd();myStreamReader.Close();myResponseStream.Close();return retString;}

在post的时候有时也用的到cookie,像登录163发邮件时候就需要发送cookie,所以在外部一个cookie属性随时保存 CookieContainer cookie = new CookieContainer();

注意:有时候请求会重定向,但我们就需要从重定向url获取东西,像QQ登录成功后获取sid,但上面的会自动根据重定向地址跳转。我们可以用:

request.AllowAutoRedirect = false;设置重定向禁用,你就可以从headers的Location属性中获取重定向地址。

二、post 调用时传参

string url = "/";

string result = string.Empty;

string param = string.Format("WechatOpenID={0}&Content={1}", webchatOpenID, content);

result = HttpPostData(url, param);

public string HttpPostData(string url, string param){var result = string.Empty;//注意提交的编码 这边是需要改变的 这边默认的是Default:系统当前编码byte[] postData = Encoding.UTF8.GetBytes(param);// 设置提交的相关参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;Encoding myEncoding = Encoding.UTF8;request.Method = "POST";request.KeepAlive = false;request.AllowAutoRedirect = true;request.ContentType = "application/x-www-form-urlencoded";request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";request.ContentLength = postData.Length;// 提交请求数据 System.IO.Stream outputStream = request.GetRequestStream();outputStream.Write(postData, 0, postData.Length);outputStream.Close();HttpWebResponse response;Stream responseStream;StreamReader reader;string srcString;response = request.GetResponse() as HttpWebResponse;responseStream = response.GetResponseStream();reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding("UTF-8"));srcString = reader.ReadToEnd();result = srcString; //返回值赋值reader.Close();return result;}

三、Post传输图片等时的代码示例

Post多张图片和其他参数时,用此方法进行调用,调用方法如:

//imgDic是图片接收名称如media,图片本地完整路径或网络完整路径的键值对的集合

imgDesc是图片信息参数及其他参数的集合,图片信息如media1,media2,media3等,这个图片接收名字是由接收方确定的

注意:

FileStream只能用于本地完整路径,如C/xx.jpg等,如果是网路图片则无法使用它。

推荐使用

WebClient wc = new WebClient();

byte[] buffer = wc.DownloadData(filePath);

memStream.Write(buffer, 0, buffer.Length);

这种方式,这个类无论是网路图片还是本地图片都可以使用,但路径中要用/,而不是\,否则会出现不支持URI的错误。

if (openIDList != null && openIDList.Any() && imgDesc != null)

{

Dictionary<string, string> imgDic = new Dictionary<string, string>();

foreach (var item in imgDesc)

{

imgDic.Add(item.name, item.path);

}

NameValueCollection col = new NameValueCollection();

col.Add("imgDesc", Newtonsoft.Json.JsonConvert.SerializeObject(imgDesc));

col.Add("open_ids", string.Join(",", openIDList));

result = HttpPostData(url, 60000, imgDic, col);

}

private static string HttpPostData(string url, int timeOut, Dictionary<string, string> imgDic, NameValueCollection stringDict){LogEntry entry = new LogEntry("发送图片开始-HttpPostData -- " + stringDict["open_ids"], 1);LogStub.Log(entry);var firstImg = imgDic.FirstOrDefault();string fileKeyName = firstImg.Key;string filePath = firstImg.Value;string responseContent;var memStream = new MemoryStream();var webRequest = (HttpWebRequest)WebRequest.Create(url);// 边界符var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");// 边界符var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");//var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);// 最后的结束符var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");// 设置属性webRequest.Method = "POST";webRequest.Timeout = timeOut;webRequest.ContentType = "multipart/form-data; boundary=" + boundary;// 写入文件const string filePartHeader ="Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +"Content-Type: application/octet-stream\r\n\r\n";var header = string.Format(filePartHeader, fileKeyName, filePath);var headerbytes = Encoding.UTF8.GetBytes(header);memStream.Write(beginBoundary, 0, beginBoundary.Length);memStream.Write(headerbytes, 0, headerbytes.Length);//var buffer = new byte[1024];//int bytesRead; // =0//while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)//{// memStream.Write(buffer, 0, bytesRead);//}WebClient wc = new WebClient();byte[] buffer = wc.DownloadData(filePath);memStream.Write(buffer, 0, buffer.Length);//第二章图片//memStream.Write(beginBoundary, 0, beginBoundary.Length);//var aaa = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");//memStream.Write(aaa, 0, aaa.Length);string imgName = string.Empty;string imgPath = string.Empty;foreach (var img in imgDic.Where(p => p.Key != fileKeyName)){imgName = img.Key;imgPath = img.Value;string nxetFileFormat = "\r\n--" + boundary + "\r\n" + filePartHeader;header = string.Format(nxetFileFormat, imgName, imgPath);headerbytes = Encoding.UTF8.GetBytes(header);memStream.Write(headerbytes, 0, headerbytes.Length);//fileStream = new FileStream(imgPath, FileMode.Open, FileAccess.Read);//while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)//{// memStream.Write(buffer, 0, bytesRead);//}buffer = wc.DownloadData(imgPath);memStream.Write(buffer, 0, buffer.Length);}// 写入字符串的Keyvar stringKeyHeader = "\r\n--" + boundary +"\r\nContent-Disposition: form-data; name=\"{0}\"" +"\r\n\r\n{1}\r\n";foreach (byte[] formitembytes in from string key in stringDict.Keysselect string.Format(stringKeyHeader, key, stringDict[key])into formitemselect Encoding.UTF8.GetBytes(formitem)){memStream.Write(formitembytes, 0, formitembytes.Length);}// 写入最后的结束边界符memStream.Write(endBoundary, 0, endBoundary.Length);webRequest.ContentLength = memStream.Length;var requestStream = webRequest.GetRequestStream();memStream.Position = 0;var tempBuffer = new byte[memStream.Length];memStream.Read(tempBuffer, 0, tempBuffer.Length);memStream.Close();requestStream.Write(tempBuffer, 0, tempBuffer.Length);requestStream.Close();var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),Encoding.GetEncoding("utf-8"))){responseContent = httpStreamReader.ReadToEnd();}fileStream.Close();httpWebResponse.Close();webRequest.Abort();entry = new LogEntry("发送图片结束-HttpPostData -- " + responseContent, 1);LogStub.Log(entry);return responseContent;}

四、单张图片调用

NameValueCollection col = new NameValueCollection();

//col.Add("media", filePath);

col.Add("title", title);

col.Add("content", content);

col.Add("open_ids", string.Join(",", openIDList));

result = HttpPostData(url, 60000, "media", filePath, col);

filePath是客户端的图片完整路径,

media是服务端接受图片的参数,这个要看接收端接收图片的参数名,注意此方法是单张图片的post调用

private static string HttpPostData(string url, int timeOut, string fileKeyName,string filePath, NameValueCollection stringDict){string responseContent;var memStream = new MemoryStream();var webRequest = (HttpWebRequest)WebRequest.Create(url);// 边界符var boundary = "---------------" + DateTime.Now.Ticks.ToString("x");// 边界符var beginBoundary = Encoding.ASCII.GetBytes("--" + boundary + "\r\n");var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);// 最后的结束符var endBoundary = Encoding.ASCII.GetBytes("--" + boundary + "--\r\n");// 设置属性webRequest.Method = "POST";webRequest.Timeout = timeOut;webRequest.ContentType = "multipart/form-data; boundary=" + boundary;// 写入文件const string filePartHeader ="Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n" +"Content-Type: application/octet-stream\r\n\r\n";var header = string.Format(filePartHeader, fileKeyName, filePath);var headerbytes = Encoding.UTF8.GetBytes(header);memStream.Write(beginBoundary, 0, beginBoundary.Length);memStream.Write(headerbytes, 0, headerbytes.Length);var buffer = new byte[1024];int bytesRead; // =0while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0){memStream.Write(buffer, 0, bytesRead);}// 写入字符串的Keyvar stringKeyHeader = "\r\n--" + boundary +"\r\nContent-Disposition: form-data; name=\"{0}\"" +"\r\n\r\n{1}\r\n";foreach (byte[] formitembytes in from string key in stringDict.Keysselect string.Format(stringKeyHeader, key, stringDict[key])into formitemselect Encoding.UTF8.GetBytes(formitem)){memStream.Write(formitembytes, 0, formitembytes.Length);}// 写入最后的结束边界符memStream.Write(endBoundary, 0, endBoundary.Length);webRequest.ContentLength = memStream.Length;var requestStream = webRequest.GetRequestStream();memStream.Position = 0;var tempBuffer = new byte[memStream.Length];memStream.Read(tempBuffer, 0, tempBuffer.Length);memStream.Close();requestStream.Write(tempBuffer, 0, tempBuffer.Length);requestStream.Close();var httpWebResponse = (HttpWebResponse)webRequest.GetResponse();using (var httpStreamReader = new StreamReader(httpWebResponse.GetResponseStream(),Encoding.GetEncoding("utf-8"))){responseContent = httpStreamReader.ReadToEnd();}fileStream.Close();httpWebResponse.Close();webRequest.Abort();return responseContent;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。