/// <summary>
/// Http客户端接口
/// </summary>
public interface IHttpClient
{
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="T">请求参数类型</typeparam>
/// <typeparam name="TResult">返回结果类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="value">请求参数</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
Task<TResult> PostAsync<T, TResult>(string url, T value, string authorizationToken = null, string authorizationMethod = "Bearer");
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="T">请求参数类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="value">请求参数</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
Task PostAsync<T>(string url, T value, string authorizationToken = null, string authorizationMethod = "Bearer");
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="TResult">返回结果类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
Task<TResult> PostAsync<TResult>(string url, string authorizationToken = null, string authorizationMethod = "Bearer");
/// <summary>
/// Get请求
/// </summary>
/// <typeparam name="TResult">返回结果类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
Task<TResult> GetAsync<TResult>(string url, string authorizationToken = null, string authorizationMethod = "Bearer");
}
/// <summary>
/// 简单的Http客户端
/// </summary>
public class StandardHttpClient : IHttpClient
{
private readonly HttpClient _httpClient;
public StandardHttpClient(HttpClient httpClient)
{
_httpClient = httpClient;
}
/// <summary>
/// 返回AjaxResponse
/// </summary>
/// <typeparam name="TResult">结果类型</typeparam>
/// <param name="response">Response</param>
/// <returns></returns>
private static async Task<TResult> AjaxResponseResult<TResult>(HttpResponseMessage response)
{
if (response.IsSuccessStatusCode)
{
var contentString = await response.Content.ReadAsStringAsync();
var ajaxResponse = JsonConvert.DeserializeObject<AjaxResponse<TResult>>(contentString);
if (ajaxResponse.Success)
{
return ajaxResponse.Result;
}
throw new Exception(ajaxResponse.Error?.Message ?? "您当前网络已断开,请网络正常后再试");
}
if (response.StatusCode == HttpStatusCode.BadRequest)
{
var contentString = await response.Content.ReadAsStringAsync();
var ajaxResponse = JsonConvert.DeserializeObject<AjaxResponse<TResult>>(contentString);
if (!ajaxResponse.Success)
{
throw new Exception(string.Join(Environment.NewLine,
ajaxResponse.Error.ValidationErrors.Select(t => t.Message)));
}
throw new Exception("数据异常");
}
if (response.StatusCode == HttpStatusCode.InternalServerError)
{
throw new Exception("您当前网络已断开,请网络正常后再试");
}
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
throw new Exception("用户未授权或者授权已经过期,请重新登录。");
}
throw new Exception("您当前网络已断开,请网络正常后再试");
}
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="T">请求参数类型</typeparam>
/// <typeparam name="TResult">返回结果类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="value">请求参数</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
public async Task<TResult> PostAsync<T, TResult>(string url, T value, string authorizationToken = null, string authorizationMethod = "Bearer")
{
var requestMessage = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = new StringContent(JsonConvert.SerializeObject(value), System.Text.Encoding.UTF8,
"application/json")
};
if (authorizationToken != null)
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken);
}
var response = await _httpClient.SendAsync(requestMessage);
return await AjaxResponseResult<TResult>(response);
}
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="T">请求参数类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="value">请求参数</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
public async Task PostAsync<T>(string url, T value, string authorizationToken = null, string authorizationMethod = "Bearer")
{
var requestMessage = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = new StringContent(JsonConvert.SerializeObject(value), System.Text.Encoding.UTF8,
"application/json")
};
if (authorizationToken != null)
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken);
}
var response = await _httpClient.SendAsync(requestMessage);
await AjaxResponseResult<object>(response);
}
/// <summary>
/// Post请求
/// </summary>
/// <typeparam name="TResult">返回结果类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
public async Task<TResult> PostAsync<TResult>(string url, string authorizationToken = null, string authorizationMethod = "Bearer")
{
var requestMessage = new HttpRequestMessage(HttpMethod.Post, url);
if (authorizationToken != null)
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken);
}
var response = await _httpClient.SendAsync(requestMessage);
return await AjaxResponseResult<TResult>(response);
}
/// <summary>
/// Get请求
/// </summary>
/// <typeparam name="TResult">返回结果类型</typeparam>
/// <param name="url">请求地址</param>
/// <param name="authorizationToken">验证Token</param>
/// <param name="authorizationMethod">验证方法</param>
/// <returns></returns>
public async Task<TResult> GetAsync<TResult>(string url, string authorizationToken = null, string authorizationMethod = "Bearer")
{
var requestMessage = new HttpRequestMessage(HttpMethod.Get, url);
if (authorizationToken != null)
{
requestMessage.Headers.Authorization = new AuthenticationHeaderValue(authorizationMethod, authorizationToken);
}
var response = await _httpClient.SendAsync(requestMessage);
return await AjaxResponseResult<TResult>(response);
}
}