add support for parameter building on ApiClient

This commit is contained in:
2024-12-07 08:21:50 +01:00
parent d333710a8f
commit 917e9edd80
2 changed files with 81 additions and 56 deletions

View File

@@ -1,4 +1,7 @@
using Castle.Core.Logging;
using Pilz.Extensions.Collections;
using System.Text.Encodings.Web;
using System.Web;
namespace Pilz.Net.Api;
@@ -14,64 +17,24 @@ public class ApiClient(string apiUrl) : IApiClient
public ILogger Log { get; set; } = NullLogger.Instance;
public virtual Task<ApiResponse> SendRequest(string route)
{
return SendRequest(route, HttpMethod.Post);
}
public virtual Task<ApiResponse> SendRequest(string route, HttpMethod method)
{
return SendRequest(route, method, null);
}
public virtual Task<ApiResponse> SendRequest(string route, ApiMessage? message)
{
return SendRequest(route, HttpMethod.Post, message);
}
public virtual Task<ApiResponse> SendRequest(string route, HttpMethod method, ApiMessage? message)
{
return SendRequest(route, method, message, null);
}
public virtual async Task<ApiResponse> SendRequest(string route, HttpMethod method, ApiMessage? message, IApiMessageSerializer? serializer)
public virtual async Task<ApiResponse> SendRequest(string route, HttpMethod method, ApiMessage? message, IDictionary<string, object>? @params, IApiMessageSerializer? serializer)
{
serializer ??= Serializer;
Log.InfoFormat("Send message to {0}", route);
var res = await Send(route, method, message, serializer);
var res = await Send(route, method, message, @params, serializer);
return new(res.StatusCode);
}
public virtual Task<ApiResponse<TResponse>> SendRequest<TResponse>(string route) where TResponse : ApiMessage
{
return SendRequest<TResponse>(route, HttpMethod.Post);
}
public virtual Task<ApiResponse<TResponse>> SendRequest<TResponse>(string route, HttpMethod method) where TResponse : ApiMessage
{
return SendRequest<TResponse>(route, method, null);
}
public virtual Task<ApiResponse<TResponse>> SendRequest<TResponse>(string route, ApiMessage? message) where TResponse : ApiMessage
{
return SendRequest<TResponse>(route, HttpMethod.Post, message);
}
public virtual Task<ApiResponse<TResponse>> SendRequest<TResponse>(string route, HttpMethod method, ApiMessage? message) where TResponse : ApiMessage
{
return SendRequest<TResponse>(route, method, message, null);
}
public virtual async Task<ApiResponse<TResponse>> SendRequest<TResponse>(string route, HttpMethod method, ApiMessage? message, IApiMessageSerializer? serializer) where TResponse : ApiMessage
public virtual async Task<ApiResponse<TResponse>> SendRequest<TResponse>(string route, HttpMethod method, ApiMessage? message, IDictionary<string, object>? @params, IApiMessageSerializer? serializer) where TResponse : ApiMessage
{
serializer ??= Serializer;
Log.InfoFormat("Send request to {0}", route);
var res = await Send(route, method, message, serializer);
var res = await Send(route, method, message, @params, serializer);
TResponse? result = null;
if (res.IsSuccessStatusCode)
@@ -80,9 +43,9 @@ public class ApiClient(string apiUrl) : IApiClient
return new(res.StatusCode, result);
}
protected virtual async Task<HttpResponseMessage> Send(string route, HttpMethod method, ApiMessage? message, IApiMessageSerializer serializer)
protected virtual async Task<HttpResponseMessage> Send(string route, HttpMethod method, ApiMessage? message, IDictionary<string, object>? @params, IApiMessageSerializer serializer)
{
var url = ApiUrl + route;
var url = ApiUrl + route + BuildParameters(@params);
HttpContent content;
Log.DebugFormat("Api endpoint url is {0}", url);
@@ -108,6 +71,24 @@ public class ApiClient(string apiUrl) : IApiClient
return await httpClient.SendAsync(httpmsg);
}
protected virtual string BuildParameters(IDictionary<string, object>? @params)
{
if (@params == null || @params.Count == 0)
return string.Empty;
return "?" + string.Join("&", @params.Select(kvp =>
{
var key = kvp.Key;
var value = HttpUtility.UrlEncode(ConvertParameter(kvp.Value));
return $"{key}={value}";
}));
}
protected virtual string ConvertParameter(object @param)
{
return (string)Convert.ChangeType(@param, typeof(string));
}
protected virtual string? EncodeAuthKey()
{
return AuthKey;