From 8f3f572c28062c176c30535659f3a666c936cbab Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 16 Aug 2024 09:52:48 +0200 Subject: [PATCH] more work on api --- Pilz.Net/Api/ApiClient.cs | 35 ++++++++++++++++++++++++++++++---- Pilz.Net/Api/ApiRequestInfo.cs | 2 +- Pilz.Net/Api/ApiServer.cs | 29 +++++++++++++++++++--------- Pilz.Net/Api/IApiClient.cs | 12 ++++++++++-- 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/Pilz.Net/Api/ApiClient.cs b/Pilz.Net/Api/ApiClient.cs index dad7c58..67fcb93 100644 --- a/Pilz.Net/Api/ApiClient.cs +++ b/Pilz.Net/Api/ApiClient.cs @@ -14,7 +14,17 @@ public class ApiClient(string apiUrl) : IApiClient public ILogger Log { get; set; } = NullLogger.Instance; - public virtual async Task SendMessage(string route, ApiMessage message, IMessageSerializer? serializer = null) + public virtual Task SendRequest(string route) + { + return SendRequest(route, null); + } + + public virtual Task SendRequest(string route, ApiMessage? message) + { + return SendRequest(route, message, null); + } + + public virtual async Task SendRequest(string route, ApiMessage? message, IMessageSerializer? serializer) { serializer ??= Serializer; @@ -25,7 +35,17 @@ public class ApiClient(string apiUrl) : IApiClient return new(res.StatusCode); } - public virtual async Task> SendRequest(string route, ApiMessage message, IMessageSerializer? serializer = null) where TResponse : ApiMessage + public virtual Task> SendRequest(string route) where TResponse : ApiMessage + { + return SendRequest(route, null); + } + + public virtual Task> SendRequest(string route, ApiMessage? message) where TResponse : ApiMessage + { + return SendRequest(route, message, null); + } + + public virtual async Task> SendRequest(string route, ApiMessage? message, IMessageSerializer? serializer) where TResponse : ApiMessage { serializer ??= Serializer; @@ -40,11 +60,18 @@ public class ApiClient(string apiUrl) : IApiClient return new(res.StatusCode, result); } - protected virtual async Task Send(string route, ApiMessage message, IMessageSerializer serializer) + 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"); + HttpContent content; + + if (message is not null) + content = new StringContent(serializer.Serialize(message)!, null, "application/json"); + else + content = new StringContent(string.Empty, null, "application/json"); + content.Headers.Add("API-AUTH-KEY", EncodeAuthKey()); + return await httpClient.PostAsync(url, content); } diff --git a/Pilz.Net/Api/ApiRequestInfo.cs b/Pilz.Net/Api/ApiRequestInfo.cs index 2fe5e85..e14a5be 100644 --- a/Pilz.Net/Api/ApiRequestInfo.cs +++ b/Pilz.Net/Api/ApiRequestInfo.cs @@ -3,7 +3,7 @@ namespace Pilz.Net.Api; public record class ApiRequestInfo( - ApiMessage Message, + ApiMessage? Message, [property: MemberNotNullWhen(true, "AuthKey")] bool IsAuthenticated, string? AuthKey); diff --git a/Pilz.Net/Api/ApiServer.cs b/Pilz.Net/Api/ApiServer.cs index 95e41f8..d54577d 100644 --- a/Pilz.Net/Api/ApiServer.cs +++ b/Pilz.Net/Api/ApiServer.cs @@ -61,7 +61,7 @@ public class ApiServer(string apiUrl) : IApiServer throw new NotSupportedException("The first parameter needs to be of type ApiMessage and must return an ApiResult object and the method must have the MessageHandlerAttribute."); // Add handler - var fullUrl = ApiUrl + attribute.Route; + var fullUrl = attribute.Route; Log.InfoFormat("Added handler for {0}", fullUrl); handlers.Add(fullUrl, handler); } @@ -94,17 +94,23 @@ public class ApiServer(string apiUrl) : IApiServer // Parse url Log.Debug("Parse url"); var path = context.Request.Url?.PathAndQuery.Replace(ApiUrl, string.Empty); - if (string.IsNullOrWhiteSpace(path) || context.Request.ContentLength64 <= 0) + if (string.IsNullOrWhiteSpace(path)) { - Log.Info("Request has no content"); + Log.Info("Request has no path"); close(); return; } // Read input content Log.Debug("Read input content"); - using StreamReader input = new(context.Request.InputStream); - var contentJson = input.ReadToEnd(); + string? contentJson; + if (context.Request.ContentLength64 > 0) + { + using StreamReader input = new(context.Request.InputStream); + contentJson = input.ReadToEnd(); + } + else + contentJson = null; // Get auth key Log.Debug("Get auth key"); @@ -138,7 +144,7 @@ public class ApiServer(string apiUrl) : IApiServer close(); } - protected virtual PrivateApiResult? HandleMessage(string url, string json, string? authKey) + protected virtual PrivateApiResult? HandleMessage(string url, string? json, string? authKey) { // Get handler Log.Debug("Find handler"); @@ -161,8 +167,11 @@ public class ApiServer(string apiUrl) : IApiServer // Deserialize Log.Debug("Deserialize message"); - if (serializer.Deserialize(json, targetType) is not ApiMessage message) - return null; + ApiMessage? message; + if (json != null) + message = serializer.Deserialize(json, targetType); + else + message = null; // Invoke handler Log.Debug("Invoke handler"); @@ -185,7 +194,7 @@ public class ApiServer(string apiUrl) : IApiServer return new(result, resultStr); } - protected virtual object?[]? BuildParameters(Delegate handler, Func getMessage, Func getRequestInfo) + protected virtual object?[]? BuildParameters(Delegate handler, Func getMessage, Func getRequestInfo) { var infos = handler.Method.GetParameters(); var objs = new List(); @@ -196,6 +205,8 @@ public class ApiServer(string apiUrl) : IApiServer objs.Add(getMessage()); else if (info.ParameterType.IsAssignableTo(typeof(ApiRequestInfo))) objs.Add(getRequestInfo()); + else + objs.Add(null); } return [.. objs]; diff --git a/Pilz.Net/Api/IApiClient.cs b/Pilz.Net/Api/IApiClient.cs index 0475e66..0282f76 100644 --- a/Pilz.Net/Api/IApiClient.cs +++ b/Pilz.Net/Api/IApiClient.cs @@ -12,7 +12,15 @@ public interface IApiClient ILogger Log { get; set; } - Task SendMessage(string route, ApiMessage message, IMessageSerializer? serializer = null); + Task SendRequest(string route, IMessageSerializer? serializer = null); - Task> SendRequest(string route, ApiMessage message, IMessageSerializer? serializer = null) where TResponse : ApiMessage; + Task SendRequest(string route, ApiMessage? message); + + Task SendRequest(string route, ApiMessage? message, IMessageSerializer? serializer); + + Task> SendRequest(string route, IMessageSerializer? serializer = null) where TResponse : ApiMessage; + + Task> SendRequest(string route, ApiMessage? message) where TResponse : ApiMessage; + + Task> SendRequest(string route, ApiMessage? message, IMessageSerializer? serializer) where TResponse : ApiMessage; }