WexClient.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Net.Http.Json;
  2. using System.Text;
  3. using System.Text.Json;
  4. using Wex.Sdk.Tel;
  5. namespace Wex.Sdk;
  6. public class WexClient : IWexClient
  7. {
  8. private readonly IHttpClientFactory _httpClientFactory;
  9. private readonly ITokenManager _tokenManager;
  10. public WexClient(IHttpClientFactory httpClientFactory, ITokenManager tokenManager)
  11. {
  12. _httpClientFactory = httpClientFactory;
  13. _tokenManager = tokenManager;
  14. }
  15. /// <summary>
  16. /// 执行操作呼叫中心请求
  17. /// </summary>
  18. /// <typeparam name="TRequest"></typeparam>
  19. /// <typeparam name="TResponse"></typeparam>
  20. /// <param name="request"></param>
  21. /// <param name="cancellationToken"></param>
  22. /// <returns></returns>
  23. public async Task<TResponse?> ExecuteAsync<TRequest, TResponse>(TRequest request, CancellationToken cancellationToken)
  24. where TRequest : IWexRequest where TResponse : WexResponse
  25. {
  26. var httpClient = _httpClientFactory.CreateClient(Defaults.ServiceName);
  27. var token = await _tokenManager.GetTokenAsync(cancellationToken);
  28. httpClient.DefaultRequestHeaders.Add("token", token);
  29. try
  30. {
  31. var rsp = await httpClient.PostAsJsonAsync(request.Url, request, cancellationToken: cancellationToken);
  32. if (!rsp.IsSuccessStatusCode)
  33. throw new HttpRequestException("请求呼叫中心服务失败");
  34. var response = await rsp.Content.ReadFromJsonAsync<TResponse>(new JsonSerializerOptions
  35. {
  36. PropertyNamingPolicy = JsonNamingPolicy.CamelCase
  37. }, cancellationToken);
  38. if (response?.Code == 401)
  39. {
  40. await _tokenManager.RefreshTokenAsync(cancellationToken);
  41. response = await rsp.Content.ReadFromJsonAsync<TResponse>(new JsonSerializerOptions
  42. {
  43. PropertyNamingPolicy = JsonNamingPolicy.CamelCase
  44. }, cancellationToken);
  45. }
  46. if (response?.Code != 200)
  47. throw new HttpRequestException(response?.Msg);
  48. return response;
  49. }
  50. catch (Exception)
  51. {
  52. throw;
  53. }
  54. }
  55. public async Task<WexToken> GetTokenAsync(TokenRequest request, CancellationToken cancellationToken)
  56. {
  57. var httpClient = _httpClientFactory.CreateClient(Defaults.ServiceName);
  58. try
  59. {
  60. var rsp = await httpClient.PostAsJsonAsync(request.Url, request, cancellationToken: cancellationToken);
  61. if (!rsp.IsSuccessStatusCode)
  62. throw new HttpRequestException("请求呼叫中心token失败");
  63. var response = await rsp.Content.ReadFromJsonAsync<WexResponse<WexToken>>(new JsonSerializerOptions
  64. {
  65. PropertyNamingPolicy = JsonNamingPolicy.CamelCase
  66. }, cancellationToken);
  67. if (response.Code != 200)
  68. throw new HttpRequestException(response.Msg);
  69. return response.Data;
  70. }
  71. catch (Exception e)
  72. {
  73. throw;
  74. }
  75. }
  76. }