|
|
using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; using System.Net.Http; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text;
namespace NFine.Code { public class HttpMethods { #region POST
/// <summary>
/// HTTP POST方式请求数据
/// </summary>
/// <param name="url">URL.</param>
/// <param name="param">POST的数据</param>
/// <returns></returns>
public static string HttpPost(string url, string param = null) { HttpWebRequest request;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; }
request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false;
StreamWriter requestStream = null; WebResponse response = null; string responseStr = null;
try { requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close();
response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } finally { request = null; requestStream = null; response = null; }
return responseStr; }
private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //总是接受
} public static string BuildRequest(string strUrl, Dictionary<string, string> dicPara, string fileName) { string contentType = "image/jpeg"; //待请求参数数组
FileStream Pic = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); byte[] PicByte = new byte[Pic.Length]; Pic.Read(PicByte, 0, PicByte.Length); int lengthFile = PicByte.Length;
//构造请求地址
//设置HttpWebRequest基本信息
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(strUrl); //设置请求方式:get、post
request.Method = "POST"; //设置boundaryValue
string boundaryValue = DateTime.Now.Ticks.ToString("x"); string boundary = "--" + boundaryValue; request.ContentType = "\r\nmultipart/form-data; boundary=" + boundaryValue; //设置KeepAlive
request.KeepAlive = true; //设置请求数据,拼接成字符串
StringBuilder sbHtml = new StringBuilder(); foreach (KeyValuePair<string, string> key in dicPara) { sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"" + key.Key + "\"\r\n\r\n" + key.Value + "\r\n"); } sbHtml.Append(boundary + "\r\nContent-Disposition: form-data; name=\"pic\"; filename=\""); sbHtml.Append(fileName); sbHtml.Append("\"\r\nContent-Type: " + contentType + "\r\n\r\n"); string postHeader = sbHtml.ToString(); //将请求数据字符串类型根据编码格式转换成字节流
Encoding code = Encoding.GetEncoding("UTF-8"); byte[] postHeaderBytes = code.GetBytes(postHeader); byte[] boundayBytes = Encoding.ASCII.GetBytes("\r\n" + boundary + "--\r\n"); //设置长度
long length = postHeaderBytes.Length + lengthFile + boundayBytes.Length; request.ContentLength = length;
//请求远程HTTP
Stream requestStream = request.GetRequestStream(); Stream myStream = null; try { //发送数据请求服务器
requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length); requestStream.Write(PicByte, 0, lengthFile); requestStream.Write(boundayBytes, 0, boundayBytes.Length); HttpWebResponse HttpWResp = (HttpWebResponse)request.GetResponse(); myStream = HttpWResp.GetResponseStream(); } catch (WebException e) { //LogResult(e.Message);
return ""; } finally { if (requestStream != null) { requestStream.Close(); } }
//读取处理结果
StreamReader reader = new StreamReader(myStream, code); StringBuilder responseData = new StringBuilder();
String line; while ((line = reader.ReadLine()) != null) { responseData.Append(line); } myStream.Close(); Pic.Close();
return responseData.ToString(); } #endregion
#region Put
/// <summary>
/// HTTP Put方式请求数据.
/// </summary>
/// <param name="url">URL.</param>
/// <returns></returns>
public static string HttpPut(string url, string param = null) { HttpWebRequest request;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "PUT"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false;
StreamWriter requestStream = null; WebResponse response = null; string responseStr = null;
try { requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close();
response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } finally { request = null; requestStream = null; response = null; }
return responseStr; } #endregion
#region Delete
/// <summary>
/// HTTP Delete方式请求数据.
/// </summary>
/// <param name="url">URL.</param>
/// <returns></returns>
public static string HttpDelete(string url, string param = null) { HttpWebRequest request;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "Delete"; request.ContentType = "application/x-www-form-urlencoded"; request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false;
StreamWriter requestStream = null; WebResponse response = null; string responseStr = null;
try { requestStream = new StreamWriter(request.GetRequestStream()); requestStream.Write(param); requestStream.Close();
response = request.GetResponse(); if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } return responseStr; } #endregion
#region Get
/// <summary>
/// HTTP GET方式请求数据.
/// </summary>
/// <param name="url">URL.</param>
/// <returns></returns>
public static string HttpGet(string url, Hashtable headht = null) { HttpWebRequest request;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "GET"; //request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; WebResponse response = null; string responseStr = null; if (headht != null) { foreach (DictionaryEntry item in headht) { request.Headers.Add(item.Key.ToString(), item.Value.ToString()); } }
try { response = request.GetResponse();
if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } return responseStr; } public static string HttpGet(string url, Encoding encodeing, Hashtable headht = null) { HttpWebRequest request;
//如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "GET"; //request.ContentType = "application/x-www-form-urlencoded";
request.Accept = "*/*"; request.Timeout = 15000; request.AllowAutoRedirect = false; WebResponse response = null; string responseStr = null; if (headht != null) { foreach (DictionaryEntry item in headht) { request.Headers.Add(item.Key.ToString(), item.Value.ToString()); } }
try { response = request.GetResponse();
if (response != null) { StreamReader reader = new StreamReader(response.GetResponseStream(), encodeing); responseStr = reader.ReadToEnd(); reader.Close(); } } catch (Exception) { throw; } return responseStr; } #endregion
#region Post With Pic
private string HttpPost(string url, IDictionary<object, object> param, string filePath) { string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST"; wr.KeepAlive = true; wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
Stream rs = wr.GetRequestStream(); string responseStr = null;
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; foreach (string key in param.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, param[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; string header = string.Format(headerTemplate, "pic", filePath, "text/plain"); byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length);
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[4096]; int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { rs.Write(buffer, 0, bytesRead); } fileStream.Close();
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); rs.Write(trailer, 0, trailer.Length); rs.Close();
WebResponse wresp = null; try { wresp = wr.GetResponse(); Stream stream2 = wresp.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); responseStr = reader2.ReadToEnd(); //logger.Debug(string.Format("File uploaded, server response is: {0}", responseStr));
} catch (Exception ex) { //logger.Error("Error uploading file", ex);
if (wresp != null) { wresp.Close(); wresp = null; } throw; } return responseStr; } #endregion
#region Post With Pic
/// <summary>
/// HTTP POST方式请求数据(带图片)
/// </summary>
/// <param name="url">URL</param>
/// <param name="param">POST的数据</param>
/// <param name="fileByte">图片</param>
/// <returns></returns>
public static string HttpPost(string url, IDictionary<object, object> param, byte[] fileByte) { string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url); wr.ContentType = "multipart/form-data; boundary=" + boundary; wr.Method = "POST"; wr.KeepAlive = true; wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
Stream rs = wr.GetRequestStream(); string responseStr = null;
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; foreach (string key in param.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, param[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n"; string header = string.Format(headerTemplate, "pic", fileByte, "text/plain");//image/jpeg
byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length);
rs.Write(fileByte, 0, fileByte.Length);
byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); rs.Write(trailer, 0, trailer.Length); rs.Close();
WebResponse wresp = null; try { wresp = wr.GetResponse(); Stream stream2 = wresp.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); responseStr = reader2.ReadToEnd(); // logger.Error(string.Format("File uploaded, server response is: {0}", responseStr));
} catch (Exception ex) { //logger.Error("Error uploading file", ex);
if (wresp != null) { wresp.Close(); wresp = null; } throw; } return responseStr; } #endregion
#region HttpsClient
/// <summary>
/// 创建HttpClient
/// </summary>
/// <returns></returns>
public static HttpClient CreateHttpClient(string url) { HttpClient httpclient; //如果是发送HTTPS请求
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; httpclient = new HttpClient(); } else { httpclient = new HttpClient(); } return httpclient; } #endregion
} }
|