basics
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace WatchIt.Common.Services.HttpClient;
|
||||
|
||||
public class HttpClientService(System.Net.Http.HttpClient httpClient) : IHttpClientService
|
||||
{
|
||||
#region PUBLIC METHODS
|
||||
|
||||
public async Task<HttpResponse> SendRequestAsync(HttpRequest request)
|
||||
{
|
||||
HttpMethod method = request.MethodType switch
|
||||
{
|
||||
HttpMethodType.Get => HttpMethod.Get,
|
||||
HttpMethodType.Post => HttpMethod.Post,
|
||||
HttpMethodType.Put => HttpMethod.Put,
|
||||
HttpMethodType.Patch => HttpMethod.Patch,
|
||||
HttpMethodType.Delete => HttpMethod.Delete,
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
};
|
||||
|
||||
HttpRequestMessage httpRequest = new HttpRequestMessage(method, request.FullUrl);
|
||||
|
||||
if (request.Body is not null)
|
||||
{
|
||||
string json = JsonSerializer.Serialize(request.Body);
|
||||
HttpContent content = new StringContent(json);
|
||||
content.Headers.ContentType!.MediaType = "application/json";
|
||||
httpRequest.Content = content;
|
||||
}
|
||||
|
||||
foreach (KeyValuePair<string, string> header in request.Headers)
|
||||
{
|
||||
httpRequest.Headers.Add(header.Key, header.Value);
|
||||
}
|
||||
|
||||
HttpResponseMessage response = await httpClient.SendAsync(httpRequest);
|
||||
|
||||
return new HttpResponse(response);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace WatchIt.Common.Services.HttpClient;
|
||||
|
||||
public enum HttpMethodType
|
||||
{
|
||||
Get,
|
||||
Post,
|
||||
Put,
|
||||
Patch,
|
||||
Delete
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using WatchIt.Common.Query;
|
||||
|
||||
namespace WatchIt.Common.Services.HttpClient;
|
||||
|
||||
public class HttpRequest
|
||||
{
|
||||
#region PROPERTIES
|
||||
|
||||
public required HttpMethodType MethodType { get; set; }
|
||||
public required string Url { get; set; }
|
||||
public QueryParameters? Query { get; set; }
|
||||
public object? Body { get; set; }
|
||||
public Dictionary<string, string> Headers { get; } = new Dictionary<string, string>();
|
||||
|
||||
public string FullUrl => $"{Url}{(Query is not null ? Query.ToString() : string.Empty)}";
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region CONSTRUCTORS
|
||||
|
||||
[SetsRequiredMembers]
|
||||
public HttpRequest(HttpMethodType methodType, string url)
|
||||
{
|
||||
MethodType = methodType;
|
||||
Url = url;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace WatchIt.Common.Services.HttpClient;
|
||||
|
||||
public class HttpResponse
|
||||
{
|
||||
#region FIELDS
|
||||
|
||||
private HttpResponseMessage _message;
|
||||
|
||||
private Action? _2XXAction;
|
||||
private Action? _400Action;
|
||||
private Action? _401Action;
|
||||
private Action? _403Action;
|
||||
private Action? _404Action;
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region CONSTRUCTORS
|
||||
|
||||
internal HttpResponse(HttpResponseMessage message)
|
||||
{
|
||||
_message = message;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region PUBLIC METHODS
|
||||
|
||||
public HttpResponse RegisterActionFor2XXSuccess(Action action)
|
||||
{
|
||||
_2XXAction = action;
|
||||
return this;
|
||||
}
|
||||
|
||||
public HttpResponse RegisterActionFor2XXSuccess<T>(Action<T> action)
|
||||
{
|
||||
_2XXAction = () => Invoke(action);
|
||||
return this;
|
||||
}
|
||||
|
||||
public HttpResponse RegisterActionFor400BadRequest(Action<IDictionary<string, string[]>> action)
|
||||
{
|
||||
_400Action = () => Invoke(action);
|
||||
return this;
|
||||
}
|
||||
|
||||
public HttpResponse RegisterActionFor401Unauthorized(Action action)
|
||||
{
|
||||
_401Action = action;
|
||||
return this;
|
||||
}
|
||||
|
||||
public HttpResponse RegisterActionFor403Forbidden(Action action)
|
||||
{
|
||||
_403Action = action;
|
||||
return this;
|
||||
}
|
||||
|
||||
public HttpResponse RegisterActionFor404NotFound(Action action)
|
||||
{
|
||||
_404Action = action;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void ExecuteAction()
|
||||
{
|
||||
switch ((int)_message.StatusCode)
|
||||
{
|
||||
case >= 200 and <= 299: _2XXAction?.Invoke(); break;
|
||||
case 400: _400Action?.Invoke(); break;
|
||||
case 401: _401Action?.Invoke(); break;
|
||||
case 403: _403Action?.Invoke(); break;
|
||||
case 404: _404Action?.Invoke(); break;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region PRIVATE METHODS
|
||||
|
||||
private async void Invoke<T>(Action<T> action)
|
||||
{
|
||||
Stream streamData = await _message.Content.ReadAsStreamAsync();
|
||||
T? data = await JsonSerializer.DeserializeAsync<T>(streamData);
|
||||
action.Invoke(data!);
|
||||
}
|
||||
|
||||
private async void Invoke(Action<IDictionary<string, string[]>> action)
|
||||
{
|
||||
Stream streamData = await _message.Content.ReadAsStreamAsync();
|
||||
ValidationProblemDetails? data = await JsonSerializer.DeserializeAsync<ValidationProblemDetails>(streamData, new JsonSerializerOptions
|
||||
{
|
||||
PropertyNameCaseInsensitive = true,
|
||||
});
|
||||
action.Invoke(data!.Errors);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace WatchIt.Common.Services.HttpClient;
|
||||
|
||||
public interface IHttpClientService
|
||||
{
|
||||
Task<HttpResponse> SendRequestAsync(HttpRequest request);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\WatchIt.Common.Query\WatchIt.Common.Query.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
Reference in New Issue
Block a user