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 route, ApiMessage message, IMessageSerializer? serializer = null) { serializer ??= Serializer; Log.InfoFormat("Send message to {0}", route); var res = await Send(route, message, serializer); return new(res.StatusCode); } public virtual async Task> SendRequest(string route, ApiMessage message, IMessageSerializer? serializer = null) where TResponse : ApiMessage { serializer ??= Serializer; Log.InfoFormat("Send request to {0}", route); var res = await Send(route, 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 route, ApiMessage message, IMessageSerializer serializer) { var url = ApiUrl + route; var content = new StringContent(serializer.Serialize(message)!, null, "application/json"); content.Headers.Add("API-AUTH-KEY", EncodeAuthKey()); return await httpClient.PostAsync(url, content); } protected virtual string? EncodeAuthKey() { return AuthKey; } }