TrClient.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System.Net.Http.Json;
  2. using System.Text.Json;
  3. using Microsoft.Extensions.Logging;
  4. using RestSharp;
  5. namespace Tr.Sdk;
  6. public class TrClient : ITrClient, IDisposable
  7. {
  8. private RestClient _client;
  9. private readonly string _baseUrl;
  10. private readonly string _apiKey;
  11. private readonly string _apiSecret;
  12. public TrClient(string baseUrl, string apiKey, string apiSecret)
  13. {
  14. _baseUrl = baseUrl;
  15. _apiKey = apiKey;
  16. _apiSecret = apiSecret;
  17. var options = new RestClientOptions(baseUrl)
  18. {
  19. Authenticator = new TrAuthenticator(baseUrl, apiKey, apiSecret)
  20. };
  21. _client = new RestClient(options);
  22. }
  23. /// <summary>
  24. /// 执行操作呼叫中心请求
  25. /// </summary>
  26. /// <typeparam name="TRequest"></typeparam>
  27. /// <typeparam name="TResponse"></typeparam>
  28. /// <param name="request"></param>
  29. /// <param name="cancellationToken"></param>
  30. /// <returns></returns>
  31. public async Task<TResponse> ExecuteAsync<TRequest, TResponse>(TRequest request, CancellationToken cancellationToken)
  32. where TRequest : TrRequest
  33. {
  34. var req = new RestRequest(request.Path(), request.HttpMethod())
  35. .AddObject(request);
  36. try
  37. {
  38. var response = await _client.ExecuteAsync<TResponse>(req, cancellationToken);
  39. if (response?.StatusCode == System.Net.HttpStatusCode.Unauthorized)
  40. {
  41. _client.Dispose();
  42. var options = new RestClientOptions(_baseUrl)
  43. {
  44. Authenticator = new TrAuthenticator(_baseUrl, _apiKey, _apiSecret)
  45. };
  46. _client = new RestClient(options);
  47. response = await _client.ExecuteAsync<TResponse>(req, cancellationToken);
  48. }
  49. if (!response?.IsSuccessful ?? false)
  50. throw new HttpRequestException($"请求呼叫中心服务失败, HttpCode: {response.StatusCode}, Error: {response.ErrorMessage}");
  51. return response.Data;
  52. }
  53. catch (Exception e)
  54. {
  55. throw new HttpRequestException($"呼叫中心请求失败,Error: {e.Message}");
  56. }
  57. }
  58. /// <summary>
  59. /// 执行操作呼叫中心请求
  60. /// </summary>
  61. /// <typeparam name="TRequest"></typeparam>
  62. /// <param name="request"></param>
  63. /// <param name="cancellationToken"></param>
  64. /// <returns></returns>
  65. /// <exception cref="HttpRequestException"></exception>
  66. public async Task ExecuteAsync<TRequest>(TRequest request, CancellationToken cancellationToken)
  67. where TRequest : TrRequest
  68. {
  69. var req = new RestRequest(request.Path(), request.HttpMethod())
  70. .AddObject(request);
  71. try
  72. {
  73. var response = await _client.ExecuteAsync(req, cancellationToken);
  74. if (!response?.IsSuccessful ?? false)
  75. throw new HttpRequestException($"请求呼叫中心服务失败, HttpCode: {response.StatusCode}, Error: {response.ErrorMessage}");
  76. }
  77. catch (Exception e)
  78. {
  79. throw new HttpRequestException($"呼叫中心请求失败,Error: {e.Message}");
  80. }
  81. }
  82. /// <summary>Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.</summary>
  83. public void Dispose()
  84. {
  85. _client?.Dispose();
  86. GC.SuppressFinalize(this);
  87. }
  88. }