// ***********************************************************************
// Assembly : Infrastructure
// Author : yubaolee
// Created : 06-21-2016
//
// Last Modified By : yubaolee
// Last Modified On : 06-21-2016
// Contact :
// File: HttpHelper.cs
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
namespace Infrastructure
{
///
/// WebApi请求帮助类
///
public class HttpHelper
{
private readonly HttpClient _httpClient;
private readonly string _baseUriAddress;
#region 构造
///
///
/// 请求的基地址
public HttpHelper(string baseAddress = "")
{
if (string.IsNullOrEmpty(baseAddress))
{
this._baseUriAddress = ConfigurationManager.AppSettings["CommonApiUriString"];
}
else
{
this._baseUriAddress = baseAddress;
}
_httpClient = new HttpClient {BaseAddress = new Uri(_baseUriAddress)};
}
///
/// 创建带用户信息的请求客户端
///
/// 用户账号
/// 用户密码,当WebApi端不要求密码验证时,可传空串
/// The URI string.
public HttpHelper(string userName, string pwd = "", string baseAddress = "")
: this(baseAddress)
{
if (!string.IsNullOrEmpty(userName))
{
_httpClient.DefaultRequestHeaders.Authorization = CreateBasicCredentials(userName, pwd);
}
}
#endregion
public string Post(string requestUrl)
{
var result = _httpClient.PostAsync(requestUrl, new StringContent(""));
return result.Result.Content.ReadAsStringAsync().Result;
}
///
/// Post数据 返回string类型
///
///
/// 实体
/// 例如/api/Files/UploadFile
///
public string Post(T entity, string requestUri)
{
HttpResponseMessage respsonse = RequestPost(entity, requestUri);
return respsonse.Content.ReadAsStringAsync().Result;
}
///
/// Post数据 返回byte[]类型 用于批量下载的时候请求接口就直接返回文件字节以供下载
///
///
public byte[] PostGetByte(T entity, string requestUri)
{
HttpResponseMessage respsonse = RequestPost(entity, requestUri);
return respsonse.Content.ReadAsByteArrayAsync().Result;
}
///
/// 以Post方式请求数据 返回HttpResponseMessage
///
/// 请求传入的对象类型
/// 请求传入的对象
/// 请求地址
///
private HttpResponseMessage RequestPost(T 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");
requestUri = string.Concat(_baseUriAddress, requestUri);
var result = _httpClient.PostAsync(requestUri, httpContent);
return result.Result;
}
///
/// Get请求数据
/// yubaolee 2016-3-3 重构与post同样异步调用
///
/// 参数字典
/// 例如/api/Files/UploadFile
///
public string Get(Dictionary parameters, string requestUri)
{
string strParam = String.Empty;
if (parameters != null)
{
strParam = string.Join("&", parameters.Select(o => o.Key + "=" + o.Value));
requestUri = string.Concat(_baseUriAddress, requestUri, '?', strParam);
}
else
{
requestUri = string.Concat(_baseUriAddress, requestUri);
}
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri))
{
return _httpClient.SendAsync(request).Result.Content.ReadAsStringAsync().Result;
}
}
///
/// 发送一个没有参数的HTTP请求
/// yubaolee 2016-3-3 重构引用现有的get方法
///
/// The request URI.
/// System.String.
public string Get(string requestUri)
{
return Get(null, requestUri);
}
///
/// Get请求数据
///
/// 参数字典
/// 例如/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);
}
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);
}
}
}