using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
namespace Common.Helpers
{
///
/// http请求类
///
public class HttpHelper
{
private HttpClient _httpClient;
private string _baseIPAddress;
/// 请求的基础IP,例如:http://192.168.0.33:8080/
public HttpHelper(string ipaddress = "")
{
this._baseIPAddress = ipaddress;
_httpClient = new HttpClient { BaseAddress = new Uri(_baseIPAddress) };
}
///
/// 创建带用户信息的请求客户端
///
/// 用户账号
/// 用户密码,当WebApi端不要求密码验证时,可传空串
/// The URI string.
public HttpHelper(string userName, string pwd = "", string uriString = "")
: this(uriString)
{
if (!string.IsNullOrEmpty(userName))
{
_httpClient.DefaultRequestHeaders.Authorization = CreateBasicCredentials(userName, pwd);
}
}
///
/// Get请求数据
/// /// 最终以url参数的方式提交
/// yubaolee 2016-3-3 重构与post同样异步调用
///
/// 参数字典,可为空
/// 例如/api/Files/UploadFile
///
public string Get(Dictionary parameters, string requestUri)
{
if (parameters != null)
{
var strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
requestUri = string.Concat(ConcatURL(requestUri), '?', strParam);
}
else
{
requestUri = ConcatURL(requestUri);
}
var result = _httpClient.GetStringAsync(requestUri);
return result.Result;
}
///
/// Get请求数据
/// 最终以url参数的方式提交
///
/// 参数字典
/// 例如/api/Files/UploadFile
/// 实体对象
public T Get(Dictionary parameters, string requestUri) where T : class
{
string jsonString = Get(parameters, requestUri);
if (string.IsNullOrEmpty(jsonString))
return null;
return JsonHelper.Instance.Deserialize(jsonString);
}
///
/// 以json的方式Post数据 返回string类型
/// 最终以json的方式放置在http体中
///
/// 实体
/// 例如/api/Files/UploadFile
///
public string Post(object entity, string requestUri)
{
string request = string.Empty;
if (entity != null)
request = JsonHelper.Instance.Serialize(entity);
HttpContent httpContent = new StringContent(request);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
return Post(requestUri, httpContent);
}
///
/// 提交字典类型的数据
/// 最终以formurlencode的方式放置在http体中
/// 李玉宝于2016-07-20 19:01:59
///
/// System.string.
public string PostDicObj(Dictionary para, string requestUri)
{
Dictionary temp = new Dictionary();
foreach (var item in para)
{
if (item.Value != null)
{
if (item.Value.GetType().Name.ToLower() != "string")
{
temp.Add(item.Key, JsonHelper.Instance.Serialize(item.Value));
}
else
{
temp.Add(item.Key, item.Value.ToString());
}
}
else
{
temp.Add(item.Key, "");
}
}
return PostDic(temp, requestUri);
}
///
/// Post Dic数据
/// 最终以formurlencode的方式放置在http体中
/// 李玉宝于2016-07-15 15:28:41
///
/// System.string.
public string PostDic(Dictionary temp, string requestUri)
{
HttpContent httpContent = new FormUrlEncodedContent(temp);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
return Post(requestUri, httpContent);
}
public string PostByte(byte[] bytes, string requestUrl)
{
HttpContent content = new ByteArrayContent(bytes);
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
return Post(requestUrl, content);
}
private string Post(string requestUrl, HttpContent content)
{
var result = _httpClient.PostAsync(ConcatURL(requestUrl), content);
return result.Result.Content.ReadAsStringAsync().Result;
}
///
/// 把请求的URL相对路径组合成绝对路径
/// 李玉宝于2016-07-21 9:54:07
///
private string ConcatURL(string requestUrl)
{
return new Uri(_httpClient.BaseAddress, requestUrl).OriginalString;
}
private AuthenticationHeaderValue CreateBasicCredentials(string userName, string password)
{
string toEncode = userName + ":" + password;
// The current HTTP specification says characters here are ISO-8859-1.
// However, the draft specification for the next version of HTTP indicates this encoding is infrequently
// used in practice and defines behavior only for ASCII.
Encoding encoding = Encoding.GetEncoding("utf-8");
byte[] toBase64 = encoding.GetBytes(toEncode);
string parameter = Convert.ToBase64String(toBase64);
return new AuthenticationHeaderValue("Basic", parameter);
}
}
}