Blazor & WASM in combination to get statistics from Spotify API for performing the song analysis. With separate microservices for auth, Spotify, user data tracking, and application, connected through gRPC with Polly.
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using Grpc.Core;
  2. using Grpc.Net.Client;
  3. using GrpcShared.DTO.Db;
  4. using GrpcShared.Interfaces;
  5. using Microsoft.Net.Http.Headers;
  6. using NemAnBlazor.Services.Interfaces;
  7. using Newtonsoft.Json;
  8. namespace SpotifyService.HttpUtils
  9. {
  10. public static class HttpUtils<T> where T : new()
  11. {
  12. public static async Task<T> GetData
  13. (IHttpClientFactory _httpClientFactory,
  14. string url,
  15. string userId,
  16. IIdentityService identityService,
  17. IAuthService authService)
  18. {
  19. try
  20. {
  21. var client = _httpClientFactory.CreateClient("HttpClient");
  22. var userResponse = await identityService.GetTokenByIdAsync(new DbRequestMessage { Id = userId });
  23. //add header
  24. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + userResponse.Token);
  25. //get request
  26. var req = await client.GetAsync(url);
  27. //read response
  28. var response = JsonConvert.DeserializeObject<T>(await req.Content.ReadAsStringAsync())!;
  29. if (req.StatusCode == System.Net.HttpStatusCode.Unauthorized)
  30. {
  31. string? newToken = await TryRefreshToken(authService, userResponse, identityService);
  32. if (newToken != null)
  33. {
  34. client.DefaultRequestHeaders.Remove(HeaderNames.Authorization);
  35. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + newToken);
  36. req = await client.GetAsync(url);
  37. response = JsonConvert.DeserializeObject<T>(await req.Content.ReadAsStringAsync())!;
  38. }
  39. //ako to ne radi to znaci da je refresh token isteko, treba da se refreshuje
  40. }
  41. return response;
  42. }
  43. catch (RpcException e)
  44. {
  45. if (e.StatusCode == StatusCode.Cancelled)
  46. {
  47. //vrati message sa status kodom?
  48. return new T();
  49. }
  50. throw;
  51. }
  52. }
  53. public static async Task PutData(HttpClient client,
  54. string url,
  55. string userId,
  56. IIdentityService identityService,
  57. IAuthService authService)
  58. {
  59. try
  60. {
  61. var tokenMessage = await identityService.GetTokenByIdAsync(new DbRequestMessage { Id = userId });
  62. //add header
  63. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + tokenMessage.Token);
  64. //get request
  65. var responseMessage = await client.PutAsync(url, null);
  66. if (responseMessage.StatusCode == System.Net.HttpStatusCode.Unauthorized)
  67. {
  68. string? newToken = await TryRefreshToken(authService, tokenMessage, identityService);
  69. if (newToken != null)
  70. {
  71. client.DefaultRequestHeaders.Remove(HeaderNames.Authorization);
  72. client.DefaultRequestHeaders.Add(HeaderNames.Authorization, "Bearer " + newToken);
  73. responseMessage = await client.PutAsync(url, null);
  74. }
  75. }
  76. }
  77. catch (RpcException e)
  78. {
  79. if (e.StatusCode == StatusCode.Cancelled)
  80. {
  81. //vrati message sa status kodom?
  82. return;
  83. }
  84. throw;
  85. }
  86. }
  87. public static async Task<string?> TryRefreshToken(
  88. IAuthService authService,
  89. UserResponse user,
  90. IIdentityService identityService)
  91. {
  92. var refreshResponse = await authService.RefreshAccessToken(user);
  93. if (refreshResponse.AccessToken != null)
  94. {
  95. await identityService.UpdateTokenAsync(new UserResponse
  96. {
  97. Id = user.Id,
  98. Token = refreshResponse.AccessToken,
  99. RefreshToken = user.RefreshToken
  100. });
  101. return refreshResponse.AccessToken;
  102. }
  103. else return null;
  104. }
  105. }
  106. }