public enum HttpMethod { Get, Post }
/// <summary>HttpClient</summary>
public class HttpClient
{
public Encoding encoding { get; set; }
public HttpClient()
{
this.encoding = Encoding.Default;
}
public HttpClient(Encoding encoding)
{
this.encoding = encoding;
}
/// <summary>
/// Get请求
/// </summary>
public HttpResponse get(string url, HttpParameter[] parameters = null, Dictionary<string, string> headers = null)
{
return this.request(url, HttpMethod.Get, parameters, headers);
}
/// <summary>
/// Post请
/// </summary>
public HttpResponse post(string url, HttpParameter[] parameters = null, Dictionary<string, string> headers = null, string postData = null)
{
return this.request(url, HttpMethod.Post, parameters, headers, postData);
}
/// <summary>
/// 请求
/// </summary>
public HttpResponse request(string url, HttpMethod method = HttpMethod.Get, HttpParameter[] parameters = null, Dictionary<string, string> headers = null, string postData = null, string contentType = null)
{
if (method == HttpMethod.Get && parameters != null)
url += (url.IndexOf("?") == -1 ? "?" : "&") + this.buildStringParameters(parameters);
HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.ServicePoint.Expect100Continue = false;
http.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)";
if (headers != null)
{
foreach (var key in headers.Keys)
{
http.Headers[key] = headers[key];
}
}
switch (method)
{
case HttpMethod.Get:
{
http.Method = "GET";
break;
}
case HttpMethod.Post:
{
http.Method = "POST";
if (!string.IsNullOrEmpty(contentType))
{
http.ContentType = contentType;
using (StreamWriter request = new StreamWriter(http.GetRequestStream()))
{
try
{
if (postData == null)
request.Write(this.buildStringParameters(parameters));
else
request.Write(postData);
}
finally
{
request.Close();
}
}
}
else
{
if (parameters != null && parameters.Count(p => p.isBinary) > 0)
{
string boundary = this.getBoundary();
http.ContentType = string.Format("multipart/form-data; boundary={0}", boundary);
http.AllowWriteStreamBuffering = true;
using (Stream request = http.GetRequestStream())
{
try
{
var raw = this.buildBinaryParameters(boundary, parameters);
request.Write(raw, 0, raw.Length);
}
finally
{
request.Close();
}
}
}
else
{
http.ContentType = "application/x-www-form-urlencoded";
using (StreamWriter request = new StreamWriter(http.GetRequestStream()))
{
try
{
if (postData == null)
request.Write(this.buildStringParameters(parameters));
else
request.Write(postData);
}
finally
{
request.Close();
}
}
}
}
break;
}
}
var httpResponse = new HttpResponse();
try
{
using (WebResponse response = http.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream(), this.encoding))
{
httpResponse.content = reader.ReadToEnd().Trim();
reader.Close();
}
response.Close();
}
}
catch (WebException e)
{
httpResponse.status = e.Status;
httpResponse.Message = e.Message;
httpResponse.StackTrace = e.StackTrace;
httpResponse.TotalMessage=e.Status+"======"+ e.Message+"=====" + e.StackTrace;
}
return httpResponse;
}
/// <summary>
/// hash值
/// </summary>
private string getBoundary()
{
string pattern = "abcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder boundaryBuilder = new StringBuilder();
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
var index = rnd.Next(pattern.Length);
boundaryBuilder.Append(pattern[index]);
}
return boundaryBuilder.ToString();
}
/// <summary>
/// 生成字符参数
/// </summary>
private string buildStringParameters(HttpParameter[] parameters)
{
if (parameters == null) return "";
var s = new StringBuilder("");
bool first = true;
foreach (var item in parameters)
{
if (first) first = false;
else s.Append("&");
var value = string.Format("{0}", item.value);
s.Append(Uri.EscapeDataString(item.name)).Append("=").Append(Uri.EscapeDataString(value));
}
return s.ToString();
}
/// <summary>
/// 生成二进制参数
/// </summary>
/// <param name="boundary"></param>
/// <param name="parameters">参数</param>
/// <returns></returns>
private byte[] buildBinaryParameters(string boundary, params HttpParameter[] parameters)
{
List<HttpParameter> pairs = new List<HttpParameter>(parameters);
MemoryStream buff = new MemoryStream();
byte[] headerBuff = Encoding.ASCII.GetBytes(string.Format("\r\n--{0}\r\n", boundary));
byte[] footerBuff = Encoding.ASCII.GetBytes(string.Format("\r\n--{0}--", boundary));
StringBuilder contentBuilder = new StringBuilder();
foreach (HttpParameter p in pairs)
{
if (!p.isBinary)
{
var value = string.Format("{0}", p.value);
if (string.IsNullOrEmpty(value))
{
continue;
}
buff.Write(headerBuff, 0, headerBuff.Length);
byte[] dispositonBuff = Encoding.UTF8.GetBytes(string.Format("content-disposition: form-data; name=\"{0}\"\r\n\r\n{1}", p.name, p.value.ToString()));
buff.Write(dispositonBuff, 0, dispositonBuff.Length);
}
else
{
buff.Write(headerBuff, 0, headerBuff.Length);
string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: \"image/unknow\"\r\nContent-Transfer-Encoding: binary\r\n\r\n";
byte[] fileBuff = System.Text.Encoding.UTF8.GetBytes(string.Format(headerTemplate, p.name, string.Format("upload{0}", BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0))));
buff.Write(fileBuff, 0, fileBuff.Length);
byte[] file = (byte[])p.value;
buff.Write(file, 0, file.Length);
}
}
buff.Write(footerBuff, 0, footerBuff.Length);
buff.Position = 0;
byte[] contentBuff = new byte[buff.Length];
buff.Read(contentBuff, 0, contentBuff.Length);
buff.Close();
buff.Dispose();
return contentBuff;
}
}