public sealed class HttpHelper
{
public static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{ // 总是接受
return true;
}
/// <summary>
/// 最原始的请求,包括常用的参数 字符串参数
/// </summary>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="encoding"></param>
/// <param name="contentType"></param>
/// <param name="headers"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string RequestUrl(string url, string method = "", string encoding = "", string contentType = "", NameValueCollection headers = null, string data = "")
{
Encoding code = Encoding.UTF8;
if (!string.IsNullOrWhiteSpace(encoding))
{
code = Encoding.GetEncoding(encoding);
}
try
{
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);//验证服务器证书回调自动验证
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Proxy = null;
req.KeepAlive = true;
//req.Timeout = 10000;
//req.ContinueTimeout
if (!string.IsNullOrWhiteSpace(method))
req.Method = method;
else
req.Method = "GET";
if (!string.IsNullOrWhiteSpace(contentType))
req.ContentType = contentType;
else
req.ContentType = "application/x-www-form-urlencoded";
if (headers != null)
{
foreach (string item in headers)
{
req.Headers.Add(item, headers[item]);
}
}
if (!string.IsNullOrWhiteSpace(data))
{
byte[] buffer = code.GetBytes(data);
req.ContentLength = buffer.Length;
Stream stream = req.GetRequestStream();
stream.Write(buffer, 0, buffer.Length);
stream.Close();
}
WebResponse res = req.GetResponse();
Stream sr = res.GetResponseStream();
StreamReader reader = new StreamReader(sr, code);
string result = reader.ReadToEnd();
reader.Close();
sr.Close();
res.Dispose();
return result;
}
catch (WebException ep)
{
SocketException se = ep.InnerException as SocketException;
if (se != null && se.ErrorCode == 10061)
throw new Exception(string.Format("远程服务器{0}连不上了了...", url));
throw;
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 最原始的请求,包括常用的参数 键值对参数
/// </summary>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="encoding"></param>
/// <param name="contentType"></param>
/// <param name="headers"></param>
/// <param name="dicData"></param>
/// <returns></returns>
public static string RequestUrlWithKeyValue(string url, string method = "", string encoding = "", string contentType = "", NameValueCollection headers = null, IDictionary<string, string> dicData = null)
{
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> item in dicData)
{
sb.AppendFormat("{0}={1}", item.Key, item.Value);
}
return RequestUrl(url, method, encoding, contentType, headers, sb.ToString());
}
/// <summary>
/// 下载文件
/// </summary>
/// <param name="url"></param>
/// <param name="fileFullName">指定的文件全路经,包括文件名</param>
/// <param name="useOriginName">默认从请求中获取原生的文件名,如果没有取到就用参数中的文件名</param>
/// <returns></returns>
public static string GetHttpRequestFile(string url, string fileFullName, bool useOriginName = true)
{
try
{
Encoding code = Encoding.GetEncoding("utf-8");
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Proxy = null;
req.KeepAlive = true;
req.Method = "GET";
WebResponse res = req.GetResponse();
if (useOriginName)
{
string dis = res.Headers["Content-Disposition"];
int index = dis.IndexOf("filename=");
if (index >= 0)
{
index += 9;
string name = dis.Substring(index);
if (!string.IsNullOrWhiteSpace(name))
{
string dir = Path.GetDirectoryName(fileFullName);
fileFullName = Path.Combine(dir, name);
}
}
}
Stream sr = res.GetResponseStream();
FileStream fs = File.Create(fileFullName);
byte[] buffer = new byte[1024 * 4];
int n = 0;
while ((n = sr.Read(buffer, 0, buffer.Length)) > 0)
fs.Write(buffer, 0, n);
fs.Close();
sr.Close();
res.Dispose();
}
catch (WebException ep)
{
SocketException se = ep.InnerException as SocketException;
if (se != null && se.ErrorCode == 10061)
throw new Exception(string.Format("远程服务器{0}连不上了了...", url));
throw;
}
catch (Exception)
{
throw;
}
return fileFullName;
}
/// <summary>
/// http上传带其它参数的文件
/// 说明:enter=\r\n
/// 上传格式 "--" + boundary + enter + "Content-Disposition: form-data; name=\"jid\"" + enter + enter + roomId + enter;
/// 每一条都是这种格式,
/// 每行开头一定是"--" + boundary + enter 中间加协议属性和值,再加字段属性和值,先加属性名字,然后加两个enter再加属性值,然后再加一个enter做为一行的结束
/// 字段上传完之后,最后一定还要加上一条 "--" + boundary 代表整个上传数据的结束
/// 如果最后一个字段上传的是文件(二进制)那还最后的时候就是加enter+"--" + boundary,保证每一行是以enter结束
/// 二进制先上传文件名字,然后再上传文件的byte[],分两步走
/// </summary>
/// <param name="filePath">上传一个文件</param>
/// <param name="roomId">一个房间号,这只是一个演示参数,实际根据需要变化</param>
/// <param name="url"></param>
public static string PostHttpRequestFile(string filePath, string roomId, string url = @"http://upload.wechatim.vip/upload/GroupAvatarServlet")
{
string fileName = Path.GetFileName(filePath);
string boundary = "slash";//边界,分割符
string enter = "\r\n";
string jid = "--" + boundary + enter + "Content-Disposition: form-data; name=\"roomId\"" + enter + enter + roomId + enter;
string file = "--" + boundary + enter
+ "Content-Type:application/octet-stream" + enter
+ "Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"" + enter + enter;
byte[] buffer = File.ReadAllBytes(filePath);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "multipart/form-data;boundary=" + boundary;
Stream req = request.GetRequestStream();//定义请求流
byte[] jidBuffer = Encoding.UTF8.GetBytes(jid);
byte[] fileBuffer = Encoding.UTF8.GetBytes(file);
byte[] splitBuffer = Encoding.UTF8.GetBytes(enter + "--" + boundary);
req.Write(jidBuffer, 0, jidBuffer.Length);
req.Write(fileBuffer, 0, fileBuffer.Length);
req.Write(buffer, 0, buffer.Length);
req.Write(splitBuffer, 0, splitBuffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream sm = response.GetResponseStream();
StreamReader reader = new StreamReader(sm, Encoding.GetEncoding("utf-8"));
string result = reader.ReadToEnd();
reader.Close();
sm.Close();
return result;
}
/// <summary>
/// 全部系统默认的http请求
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetHttpRequest(string url)
{
return RequestUrl(url);
}
/// <summary>
/// 带编码的http请求,默认是utf-8
/// </summary>
/// <param name="url"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static string GetHttpRequestWithEncode(string url, string encoding = "utf-8")
{
return RequestUrl(url, "GET", encoding);
}
/// <summary>
/// 带编码的http请求,默认是utf-8
/// </summary>
/// <param name="url"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static string GetHttpRequestWithData(string url, string data)
{
return RequestUrl(url, "GET", "", "", null, data);
}
/// <summary>
/// 全部系统默认的http post请求
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string PostHttpRequest(string url)
{
return RequestUrl(url, "POST");
}
/// <summary>
/// 全部系统默认的带参数的http post请求
/// </summary>
/// <param name="url"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string PostHttpRequestWithData(string url, string data)
{
return RequestUrl(url, "POST", "", "", null, data);
}
/// <summary>
/// 全部系统默认的带参数以及编码的的http post请求
/// </summary>
/// <param name="url"></param>
/// <param name="encoding"></param>
/// <param name="data"></param>
/// <returns></returns>
public static string PostHttpRequestWithEncode(string url, string encoding, string data)
{
return RequestUrl(url, "POST", encoding, "", null, data);
}
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <param name="dicData">传入的数据</param>
/// <returns></returns>
public static string PostUrlWithKeyValue(string url, IDictionary<string, string> dicData = null)
{
StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> item in dicData)
{
sb.AppendFormat("{0}={1}", item.Key, item.Value);
}
return RequestUrl(url, "POST", "", "", null, sb.ToString());
}
}
HttpHelper上传下载请求,表单的提交
于 2018-05-31 14:15:27 首次发布