ApiInterface.cs (2884B)
1 using Shared.Contracts; 2 using System.Diagnostics; 3 using System.Net.Http; 4 using System.Text.Json; 5 6 namespace Client.Utilities; 7 8 public interface IApiInterface 9 { 10 Task<GetMessagesContract?> GetMessagesAsync(); 11 Task<GetUsersContract?> GetUsersAsync(); 12 Task<HttpResponseMessage?> PostMessageAsync(string message); 13 Task<HttpResponseMessage> PostUserAsync(string name); 14 Guid ServerKey { get; set; } 15 } 16 17 public class ApiInterface : IApiInterface 18 { 19 private readonly HttpClient _httpClient; 20 public Guid ServerKey { get; set; } = Guid.Empty; 21 22 public ApiInterface(Uri baseUrl) 23 { 24 _httpClient = new HttpClient(); 25 _httpClient.BaseAddress = baseUrl; 26 } 27 28 public async Task<GetMessagesContract?> GetMessagesAsync() 29 { 30 return await getContract<GetMessagesContract>(Shared.Endpoints.Messages); 31 } 32 33 public async Task<GetUsersContract?> GetUsersAsync() 34 { 35 return await getContract<GetUsersContract>(Shared.Endpoints.Users); 36 } 37 38 public async Task<HttpResponseMessage?> PostMessageAsync(string message) 39 { 40 var messageContract = new MessageContract { Content = message, Key = ServerKey }; 41 return await postContract(messageContract, Shared.Endpoints.Messages); 42 } 43 44 public async Task<HttpResponseMessage?> PostUserAsync(string name) 45 { 46 var userContract = new UserContract { Username = name }; 47 return await postContract(userContract, Shared.Endpoints.Users); 48 } 49 50 private async Task<HttpResponseMessage> postContract<T>(T content, string endpoint) 51 { 52 try 53 { 54 var json = JsonSerializer.Serialize(content); 55 HttpContent httpContent = new StringContent(json); 56 httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json"); 57 var response = await _httpClient.PostAsync(endpoint, httpContent); 58 Debug.WriteLine(await response.Content.ReadAsStringAsync()); 59 return response; 60 } 61 catch (Exception e) 62 { 63 Debug.WriteLine(e.Message); 64 return default; 65 } 66 } 67 68 private async Task<T?> getContract<T>(string endpoint) 69 { 70 int attempts = 0; 71 do 72 { 73 try 74 { 75 var response = await _httpClient.GetAsync(endpoint); 76 var responseContent = await response.Content.ReadAsStringAsync(); 77 Debug.WriteLine(responseContent); 78 return JsonSerializer.Deserialize<T>(responseContent, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); 79 } 80 catch (Exception e) 81 { 82 attempts++; 83 Debug.WriteLine($"Failed after {attempts} tries.\n{e.Message}"); 84 } 85 } 86 while (attempts < 10); 87 88 return default; 89 } 90 }