using System.Net.Http.Json;
using System.Text;
using System.Text.Json;
using Wex.Sdk.Tel;
namespace Wex.Sdk;
public class WexClient : IWexClient
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly ITokenManager _tokenManager;
public WexClient(IHttpClientFactory httpClientFactory, ITokenManager tokenManager)
{
_httpClientFactory = httpClientFactory;
_tokenManager = tokenManager;
}
///
/// 执行操作呼叫中心请求
///
///
///
///
///
///
public async Task ExecuteAsync(TRequest request, CancellationToken cancellationToken)
where TRequest : IWexRequest where TResponse : WexResponse
{
var httpClient = _httpClientFactory.CreateClient(Defaults.ServiceName);
var token = await _tokenManager.GetTokenAsync(cancellationToken);
httpClient.DefaultRequestHeaders.Add("token", token);
try
{
var rsp = await httpClient.PostAsJsonAsync(request.Url, request, cancellationToken: cancellationToken);
if (!rsp.IsSuccessStatusCode)
throw new HttpRequestException("请求呼叫中心服务失败");
var response = await rsp.Content.ReadFromJsonAsync(new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
}, cancellationToken);
if (response?.Code == 401)
{
await _tokenManager.RefreshTokenAsync(cancellationToken);
response = await rsp.Content.ReadFromJsonAsync(new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
}, cancellationToken);
}
if (response?.Code != 200)
throw new HttpRequestException(response?.Msg);
return response;
}
catch (Exception)
{
throw;
}
}
public async Task GetTokenAsync(TokenRequest request, CancellationToken cancellationToken)
{
var httpClient = _httpClientFactory.CreateClient(Defaults.ServiceName);
try
{
var rsp = await httpClient.PostAsJsonAsync(request.Url, request, cancellationToken: cancellationToken);
if (!rsp.IsSuccessStatusCode)
throw new HttpRequestException("请求呼叫中心token失败");
var response = await rsp.Content.ReadFromJsonAsync>(new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
}, cancellationToken);
if (response.Code != 200)
throw new HttpRequestException(response.Msg);
return response.Data;
}
catch (Exception e)
{
throw;
}
}
}