Files
WebNovelPortal/Shared/AccessLayers/ApiAccessLayer.cs

78 lines
2.6 KiB
C#

using Microsoft.AspNetCore.WebUtilities;
using Newtonsoft.Json;
using Shared.Models;
namespace Shared.AccessLayers;
public abstract class ApiAccessLayer
{
private readonly HttpClient _httpClient;
protected ApiAccessLayer(string apiBaseUrl)
{
_httpClient = new HttpClient();
_httpClient.BaseAddress = new Uri(apiBaseUrl);
}
private async Task<HttpResponseWrapper> SendRequest(HttpRequestMessage message)
{
var response = await _httpClient.SendAsync(message);
return new HttpResponseWrapper()
{
HttpResponseMessage = response
};
}
private async Task<HttpResponseWrapper<T>> SendRequest<T>(HttpRequestMessage message)
{
var wrapper = await SendRequest(message);
if (wrapper.HttpResponseMessage.IsSuccessStatusCode)
{
var parsedJson =
JsonConvert.DeserializeObject<T>(await wrapper.HttpResponseMessage.Content.ReadAsStringAsync());
return new HttpResponseWrapper<T>
{
HttpResponseMessage = wrapper.HttpResponseMessage,
ResponseObject = parsedJson
};
}
return new HttpResponseWrapper<T>
{
HttpResponseMessage = wrapper.HttpResponseMessage,
ResponseObject = default(T)
};
}
protected HttpRequestMessage CreateRequestMessage(string endpoint, HttpMethod method, Dictionary<string, string>? queryParams = null,
object? data = null)
{
HttpRequestMessage message = new HttpRequestMessage();
string uri = endpoint;
if (queryParams != null)
{
uri = QueryHelpers.AddQueryString(endpoint, queryParams);
}
message.RequestUri = new Uri(uri);
message.Method = method;
if (data != null)
{
message.Content = new StringContent(JsonConvert.SerializeObject(data));
}
return message;
}
protected async Task<HttpResponseWrapper> SendRequest(string endpoint, HttpMethod method, Dictionary<string, string>? queryParams = null, object? data = null)
{
HttpRequestMessage message = CreateRequestMessage(endpoint, method, queryParams, data);
return await SendRequest(message);
}
protected async Task<HttpResponseWrapper<T>> SendRequest<T>(string endpoint, HttpMethod method, Dictionary<string, string>? queryParams = null, object? data = null)
{
HttpRequestMessage message = CreateRequestMessage(endpoint, method, queryParams, data);
return await SendRequest<T>(message);
}
}