using Bowin.Common.JSON;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
namespace Bowin.Common
{
public class HttpClient
{
#region //字段
private ArrayList bytesArray;
private Encoding encoding = Encoding.UTF8;
private string boundary = String.Empty;
private WebHeaderCollection headers = new WebHeaderCollection();
#endregion
#region //构造方法
public HttpClient()
{
bytesArray = new ArrayList();
string flag = DateTime.Now.Ticks.ToString("x");
boundary = "---------------------------" + flag;
headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
}
#endregion
#region //方法
///
/// 合并请求数据
///
///
private byte[] MergeContent()
{
int length = 0;
int readLength = 0;
string endBoundary = "--" + boundary + "--\r\n";
byte[] endBoundaryBytes = encoding.GetBytes(endBoundary);
bytesArray.Add(endBoundaryBytes);
foreach (byte[] b in bytesArray)
{
length += b.Length;
}
byte[] bytes = new byte[length];
foreach (byte[] b in bytesArray)
{
b.CopyTo(bytes, readLength);
readLength += b.Length;
}
return bytes;
}
public bool Download(String requestUrl, Dictionary parameters, out String responseText)
{
WebClient webClient = new WebClient();
if (this.headers != null && this.headers.Count > 0)
{
webClient.Headers = this.headers;
}
string fullUrl = requestUrl;
for (int i = 0; i < parameters.Count; i++)
{
if (i == 0 && !requestUrl.Contains("?"))
{
fullUrl += "?";
}
else
{
fullUrl += "&";
}
fullUrl += parameters.Keys.ElementAt(i) + "=" + parameters.Values.ElementAt(i);
}
var response = new byte[0];
try
{
response = webClient.DownloadData(fullUrl);
responseText = System.Text.Encoding.UTF8.GetString(response);
return true;
}
catch (WebException ex)
{
Stream responseStream = ex.Response.GetResponseStream();
response = new byte[ex.Response.ContentLength];
responseStream.Read(response, 0, response.Length);
}
responseText = System.Text.Encoding.UTF8.GetString(response);
return false;
}
///
/// 上传
///
/// 请求url
/// 响应
///
public bool Upload(String requestUrl, out String responseText)
{
WebClient webClient = new WebClient();
if (this.headers != null && this.headers.Count > 0)
{
webClient.Headers = this.headers;
var contentType = webClient.Headers.AllKeys.Where(x => x.ToLower() == "content-type").Select(x => webClient.Headers[x]).FirstOrDefault();
if (contentType != null)
{
if (!contentType.TrimEnd().EndsWith(";"))
{
contentType += ";";
}
contentType += "boundary=" + boundary;
webClient.Headers.Set("Content-Type", contentType);
}
else
{
webClient.Headers.Add("Content-Type", "multipart/form-data; boundary=" + boundary);
}
}
byte[] responseBytes;
byte[] bytes = MergeContent();
try
{
responseBytes = webClient.UploadData(requestUrl, bytes);
responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
return true;
}
catch (WebException ex)
{
Stream responseStream = ex.Response.GetResponseStream();
responseBytes = new byte[ex.Response.ContentLength];
responseStream.Read(responseBytes, 0, responseBytes.Length);
}
responseText = System.Text.Encoding.UTF8.GetString(responseBytes);
return false;
}
public void SetHeaders(WebHeaderCollection headers)
{
if (this.headers != null && headers != null && headers.Count > 0)
{
this.headers = headers;
}
}
///
/// 设置表单数据字段
///
/// 字段名
/// 字段值
///
public void SetFieldValue(String fieldName, String fieldValue)
{
string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}\r\n";
string httpRowData = String.Format(httpRow, fieldName, fieldValue);
bytesArray.Add(encoding.GetBytes(httpRowData));
}
///
/// 设置表单文件数据
///
/// 字段名
/// 字段值
/// 内容内型
/// 文件字节流
///
public void SetFieldValue(FormFile formFile)
{
string end = "\r\n";
string httpRow = "--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
string httpRowData = String.Format(httpRow, formFile.FieldName, formFile.Filename, formFile.ContentType);
byte[] headerBytes = encoding.GetBytes(httpRowData);
byte[] endBytes = encoding.GetBytes(end);
byte[] fileDataBytes = new byte[headerBytes.Length + formFile.FileBytes.Length + endBytes.Length];
headerBytes.CopyTo(fileDataBytes, 0);
formFile.FileBytes.CopyTo(fileDataBytes, headerBytes.Length);
endBytes.CopyTo(fileDataBytes, headerBytes.Length + formFile.FileBytes.Length);
bytesArray.Add(fileDataBytes);
}
#endregion
public static Dictionary GetFromCollections(T source) where T : class
{
JObject sourceObj = source.ToJson().ToObject();
Dictionary result = new Dictionary();
foreach (var key in sourceObj.Properties())
{
result.Add(key.Name, key.Value.Value());
}
return result;
}
}
public class FormFile
{
public string FieldName { get; set; }
public string Filename { get; set; }
public string ContentType { get; set; }
public Byte[] FileBytes { get; set; }
}
}