一、基本示例
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 = "http://www.baidu.com/";
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);
}
// 写入字符串的Key
var 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.Keys
select string.Format(stringKeyHeader, key, stringDict[key])
into formitem
select 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; // =0
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
memStream.Write(buffer, 0, bytesRead);
}
// 写入字符串的Key
var 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.Keys
select string.Format(stringKeyHeader, key, stringDict[key])
into formitem
select 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;
}