using Castle.Core.Logging; namespace Pilz.Net.Api; public class ApiClient(string apiUrl) : IApiClient { protected readonly HttpClient httpClient = new(); public virtual string ApiUrl { get; } = apiUrl; public string? AuthKey { get; set; } public virtual IMessageSerializer Serializer { get; set; } = new DefaultMessageSerializer(); public ILogger Log { get; set; } = NullLogger.Instance; public virtual async Task SendMessage(string url, ApiMessage message, IMessageSerializer? serializer) { serializer ??= Serializer; Log.InfoFormat("Send message to {0}", url); var res = await Send(url, message, serializer); return new(res.StatusCode); } public virtual async Task> SendRequest(string url, ApiMessage message, IMessageSerializer? serializer) where TResponse : ApiMessage { serializer ??= Serializer; Log.InfoFormat("Send request to {0}", url); var res = await Send(url, message, serializer); TResponse? result = null; if (res.IsSuccessStatusCode) result = serializer.Deserialize(await res.Content.ReadAsStringAsync(), typeof(TResponse)) as TResponse; return new(res.StatusCode, result); } protected virtual async Task Send(string url, ApiMessage message, IMessageSerializer serializer) { var fullRequestUrl = ApiUrl + url; var content = new StringContent(serializer.Serialize(message)!, null, "application/json"); content.Headers.Add("API-AUTH-KEY", AuthKey); return await httpClient.PostAsync(fullRequestUrl, content); } }