// *********************************************************************** // 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); } } }