|
|
@ -0,0 +1,174 @@ |
|
|
|
using eShopOnContainers.Core.Exceptions; |
|
|
|
using Newtonsoft.Json; |
|
|
|
using Newtonsoft.Json.Converters; |
|
|
|
using Newtonsoft.Json.Serialization; |
|
|
|
using System.Net; |
|
|
|
using System.Net.Http; |
|
|
|
using System.Net.Http.Headers; |
|
|
|
using System.Text; |
|
|
|
using System.Threading.Tasks; |
|
|
|
using System; |
|
|
|
|
|
|
|
// Taken from https://raw.githubusercontent.com/dotnet/eShopOnContainers/dev/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs
|
|
|
|
// TODO: DRY This
|
|
|
|
|
|
|
|
namespace eShopOnContainers.Core.Services.RequestProvider |
|
|
|
{ |
|
|
|
public class RequestProvider : IRequestProvider |
|
|
|
{ |
|
|
|
private readonly JsonSerializerSettings _serializerSettings; |
|
|
|
|
|
|
|
public RequestProvider() |
|
|
|
{ |
|
|
|
_serializerSettings = new JsonSerializerSettings |
|
|
|
{ |
|
|
|
ContractResolver = new CamelCasePropertyNamesContractResolver(), |
|
|
|
DateTimeZoneHandling = DateTimeZoneHandling.Utc, |
|
|
|
NullValueHandling = NullValueHandling.Ignore |
|
|
|
}; |
|
|
|
|
|
|
|
_serializerSettings.Converters.Add(new StringEnumConverter()); |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<TResult> GetAsync<TResult>(string uri, string token = "") |
|
|
|
{ |
|
|
|
HttpClient httpClient = CreateHttpClient(token); |
|
|
|
HttpResponseMessage response = await httpClient.GetAsync(uri); |
|
|
|
|
|
|
|
await HandleResponse(response); |
|
|
|
|
|
|
|
string serialized = await response.Content.ReadAsStringAsync(); |
|
|
|
|
|
|
|
TResult result = await Task.Run(() => |
|
|
|
JsonConvert.DeserializeObject<TResult>(serialized, _serializerSettings)); |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "", string header = "") |
|
|
|
{ |
|
|
|
HttpClient httpClient = CreateHttpClient(token); |
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(header)) |
|
|
|
{ |
|
|
|
AddHeaderParameter(httpClient, header); |
|
|
|
} |
|
|
|
|
|
|
|
var content = new StringContent(JsonConvert.SerializeObject(data)); |
|
|
|
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); |
|
|
|
HttpResponseMessage response = await httpClient.PostAsync(uri, content); |
|
|
|
|
|
|
|
await HandleResponse(response); |
|
|
|
|
|
|
|
string serialized = await response.Content.ReadAsStringAsync(); |
|
|
|
|
|
|
|
TResult result = await Task.Run(() => |
|
|
|
JsonConvert.DeserializeObject<TResult>(serialized, _serializerSettings)); |
|
|
|
|
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
public Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "") |
|
|
|
{ |
|
|
|
return PostAsync<TResult, TResult>(uri, data, token); |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data, string token = "") |
|
|
|
{ |
|
|
|
HttpClient httpClient = CreateHttpClient(token); |
|
|
|
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); |
|
|
|
var content = new StringContent(serialized, Encoding.UTF8, "application/json"); |
|
|
|
HttpResponseMessage response = await httpClient.PostAsync(uri, content); |
|
|
|
|
|
|
|
await HandleResponse(response); |
|
|
|
|
|
|
|
string responseData = await response.Content.ReadAsStringAsync(); |
|
|
|
|
|
|
|
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings)); |
|
|
|
} |
|
|
|
|
|
|
|
public Task<TResult> PutAsync<TResult>(string uri, TResult data, string token = "") |
|
|
|
{ |
|
|
|
return PutAsync<TResult, TResult>(uri, data, token); |
|
|
|
} |
|
|
|
|
|
|
|
public async Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data, string token = "") |
|
|
|
{ |
|
|
|
HttpClient httpClient = CreateHttpClient(token); |
|
|
|
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); |
|
|
|
HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json")); |
|
|
|
|
|
|
|
await HandleResponse(response); |
|
|
|
|
|
|
|
string responseData = await response.Content.ReadAsStringAsync(); |
|
|
|
|
|
|
|
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings)); |
|
|
|
} |
|
|
|
|
|
|
|
public async Task DeleteAsync(string uri, string token = "") |
|
|
|
{ |
|
|
|
HttpClient httpClient = CreateHttpClient(token); |
|
|
|
|
|
|
|
await httpClient.DeleteAsync(uri); |
|
|
|
} |
|
|
|
|
|
|
|
private HttpClient CreateHttpClient(string token = "") |
|
|
|
{ |
|
|
|
var httpClient = new HttpClient(); |
|
|
|
|
|
|
|
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); |
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(token)) |
|
|
|
{ |
|
|
|
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); |
|
|
|
} |
|
|
|
|
|
|
|
return httpClient; |
|
|
|
} |
|
|
|
|
|
|
|
private void AddHeaderParameter(HttpClient httpClient, string parameter) |
|
|
|
{ |
|
|
|
if (httpClient == null) |
|
|
|
return; |
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(parameter)) |
|
|
|
return; |
|
|
|
|
|
|
|
httpClient.DefaultRequestHeaders.Add(parameter, Guid.NewGuid().ToString()); |
|
|
|
} |
|
|
|
|
|
|
|
private async Task HandleResponse(HttpResponseMessage response) |
|
|
|
{ |
|
|
|
if (!response.IsSuccessStatusCode) |
|
|
|
{ |
|
|
|
var content = await response.Content.ReadAsStringAsync(); |
|
|
|
|
|
|
|
if (response.StatusCode == HttpStatusCode.Forbidden |
|
|
|
|| response.StatusCode == HttpStatusCode.Unauthorized) |
|
|
|
{ |
|
|
|
throw new ServiceAuthenticationException(content); |
|
|
|
} |
|
|
|
|
|
|
|
throw new HttpRequestException(content); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Taken from: https://raw.githubusercontent.com/dotnet/eShopOnContainers/dev/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Exceptions/ServiceAuthenticationException.cs
|
|
|
|
namespace eShopOnContainers.Core.Exceptions |
|
|
|
{ |
|
|
|
public class ServiceAuthenticationException : Exception |
|
|
|
{ |
|
|
|
public string Content { get; } |
|
|
|
|
|
|
|
public ServiceAuthenticationException() |
|
|
|
{ |
|
|
|
} |
|
|
|
|
|
|
|
public ServiceAuthenticationException(string content) |
|
|
|
{ |
|
|
|
Content = content; |
|
|
|
} |
|
|
|
} |
|
|
|
} |