Refactoing HttpClientApi
This commit is contained in:
parent
cb3f682872
commit
ddb03a0aa8
@ -14,15 +14,16 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
public class BasketService : IBasketService
|
||||
{
|
||||
private readonly IOptionsSnapshot<AppSettings> _settings;
|
||||
private HttpClientWrapper _apiClient;
|
||||
private IHttpClient _apiClient;
|
||||
private readonly string _remoteServiceBaseUrl;
|
||||
private IHttpContextAccessor _httpContextAccesor;
|
||||
|
||||
public BasketService(IOptionsSnapshot<AppSettings> settings, IHttpContextAccessor httpContextAccesor)
|
||||
public BasketService(IOptionsSnapshot<AppSettings> settings, IHttpContextAccessor httpContextAccesor, IHttpClient httpClient)
|
||||
{
|
||||
_settings = settings;
|
||||
_remoteServiceBaseUrl = _settings.Value.BasketUrl;
|
||||
_httpContextAccesor = httpContextAccesor;
|
||||
_apiClient = httpClient;
|
||||
}
|
||||
|
||||
public async Task<Basket> GetBasket(ApplicationUser user)
|
||||
@ -30,7 +31,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
var context = _httpContextAccesor.HttpContext;
|
||||
var token = await context.Authentication.GetTokenAsync("access_token");
|
||||
|
||||
var _apiClient = new HttpClientWrapper();
|
||||
_apiClient.Inst.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||||
|
||||
var basketUrl = $"{_remoteServiceBaseUrl}/{user.Id.ToString()}";
|
||||
@ -52,7 +52,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
var context = _httpContextAccesor.HttpContext;
|
||||
var token = await context.Authentication.GetTokenAsync("access_token");
|
||||
|
||||
_apiClient = new HttpClientWrapper();
|
||||
_apiClient.Inst.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||||
|
||||
var basketUrl = _remoteServiceBaseUrl;
|
||||
@ -119,7 +118,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
var context = _httpContextAccesor.HttpContext;
|
||||
var token = await context.Authentication.GetTokenAsync("access_token");
|
||||
|
||||
_apiClient = new HttpClientWrapper();
|
||||
_apiClient.Inst.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||||
var basketUrl = $"{_remoteServiceBaseUrl}/{user.Id.ToString()}";
|
||||
var response = await _apiClient.DeleteAsync(basketUrl);
|
||||
|
@ -13,20 +13,19 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
public class CatalogService : ICatalogService
|
||||
{
|
||||
private readonly IOptionsSnapshot<AppSettings> _settings;
|
||||
private HttpClientWrapper _apiClient;
|
||||
private IHttpClient _apiClient;
|
||||
private readonly string _remoteServiceBaseUrl;
|
||||
|
||||
public CatalogService(IOptionsSnapshot<AppSettings> settings, ILoggerFactory loggerFactory) {
|
||||
public CatalogService(IOptionsSnapshot<AppSettings> settings, ILoggerFactory loggerFactory, IHttpClient httpClient) {
|
||||
_settings = settings;
|
||||
_remoteServiceBaseUrl = $"{_settings.Value.CatalogUrl}/api/v1/catalog/";
|
||||
|
||||
_apiClient = httpClient;
|
||||
var log = loggerFactory.CreateLogger("catalog service");
|
||||
log.LogDebug(settings.Value.CatalogUrl);
|
||||
}
|
||||
|
||||
public async Task<Catalog> GetCatalogItems(int page,int take, int? brand, int? type)
|
||||
{
|
||||
_apiClient = new HttpClientWrapper();
|
||||
var itemsQs = $"items?pageIndex={page}&pageSize={take}";
|
||||
var filterQs = "";
|
||||
|
||||
@ -53,7 +52,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
|
||||
public async Task<IEnumerable<SelectListItem>> GetBrands()
|
||||
{
|
||||
_apiClient = new HttpClientWrapper();
|
||||
var url = $"{_remoteServiceBaseUrl}catalogBrands";
|
||||
var dataString = await _apiClient.GetStringAsync(url);
|
||||
|
||||
@ -72,7 +70,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
|
||||
public async Task<IEnumerable<SelectListItem>> GetTypes()
|
||||
{
|
||||
_apiClient = new HttpClientWrapper();
|
||||
var url = $"{_remoteServiceBaseUrl}catalogTypes";
|
||||
var dataString = await _apiClient.GetStringAsync(url);
|
||||
|
||||
|
@ -14,24 +14,23 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
{
|
||||
public class OrderingService : IOrderingService
|
||||
{
|
||||
private HttpClientWrapper _apiClient;
|
||||
private IHttpClient _apiClient;
|
||||
private readonly string _remoteServiceBaseUrl;
|
||||
private readonly IOptionsSnapshot<AppSettings> _settings;
|
||||
private readonly IHttpContextAccessor _httpContextAccesor;
|
||||
|
||||
public OrderingService(IOptionsSnapshot<AppSettings> settings, IHttpContextAccessor httpContextAccesor)
|
||||
public OrderingService(IOptionsSnapshot<AppSettings> settings, IHttpContextAccessor httpContextAccesor, IHttpClient httpClient)
|
||||
{
|
||||
_remoteServiceBaseUrl = $"{settings.Value.OrderingUrl}/api/v1/orders";
|
||||
_settings = settings;
|
||||
_httpContextAccesor = httpContextAccesor;
|
||||
_apiClient = httpClient;
|
||||
}
|
||||
|
||||
async public Task<Order> GetOrder(ApplicationUser user, string Id)
|
||||
{
|
||||
var context = _httpContextAccesor.HttpContext;
|
||||
var token = await context.Authentication.GetTokenAsync("access_token");
|
||||
|
||||
_apiClient = new HttpClientWrapper();
|
||||
_apiClient.Inst.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||||
|
||||
var ordersUrl = $"{_remoteServiceBaseUrl}/{Id}";
|
||||
@ -47,7 +46,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
var context = _httpContextAccesor.HttpContext;
|
||||
var token = await context.Authentication.GetTokenAsync("access_token");
|
||||
|
||||
_apiClient = new HttpClientWrapper();
|
||||
_apiClient.Inst.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||||
|
||||
var ordersUrl = _remoteServiceBaseUrl;
|
||||
@ -78,7 +76,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
var context = _httpContextAccesor.HttpContext;
|
||||
var token = await context.Authentication.GetTokenAsync("access_token");
|
||||
|
||||
_apiClient = new HttpClientWrapper();
|
||||
_apiClient.Inst.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
|
||||
_apiClient.Inst.DefaultRequestHeaders.Add("x-requestid", order.RequestId.ToString());
|
||||
|
||||
|
45
src/Web/WebMVC/Services/Utilities/HttpApiClient.cs
Normal file
45
src/Web/WebMVC/Services/Utilities/HttpApiClient.cs
Normal file
@ -0,0 +1,45 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace WebMVC.Services.Utilities
|
||||
{
|
||||
public class HttpApiClient : IHttpClient
|
||||
{
|
||||
private HttpClient _client;
|
||||
private ILogger _logger;
|
||||
public HttpClient Inst => _client;
|
||||
public HttpApiClient()
|
||||
{
|
||||
_client = new HttpClient();
|
||||
_logger = new LoggerFactory().CreateLogger(nameof(HttpApiClientWrapper));
|
||||
}
|
||||
|
||||
public async Task<string> GetStringAsync(string uri)
|
||||
{
|
||||
return await HttpInvoker(async () =>
|
||||
await _client.GetStringAsync(uri));
|
||||
}
|
||||
|
||||
public async Task<HttpResponseMessage> PostAsync<T>(string uri, T item)
|
||||
{
|
||||
var contentString = new StringContent(JsonConvert.SerializeObject(item), System.Text.Encoding.UTF8, "application/json");
|
||||
return await HttpInvoker(async () =>
|
||||
await _client.PostAsync(uri, contentString));
|
||||
}
|
||||
|
||||
public async Task<HttpResponseMessage> DeleteAsync(string uri)
|
||||
{
|
||||
return await HttpInvoker(async () =>
|
||||
await _client.DeleteAsync(uri));
|
||||
}
|
||||
|
||||
private async Task<T> HttpInvoker<T>(Func<Task<T>> action)
|
||||
{
|
||||
return await action();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -8,16 +8,16 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace WebMVC.Services.Utilities
|
||||
{
|
||||
public class HttpClientWrapper
|
||||
public class HttpApiClientWrapper : IHttpClient
|
||||
{
|
||||
private HttpClient _client;
|
||||
private PolicyWrap _policyWrapper;
|
||||
private ILogger _logger;
|
||||
public HttpClient Inst => _client;
|
||||
public HttpClientWrapper()
|
||||
public HttpApiClientWrapper()
|
||||
{
|
||||
_client = new HttpClient();
|
||||
_logger = new LoggerFactory().CreateLogger(nameof(HttpClientWrapper));
|
||||
_logger = new LoggerFactory().CreateLogger(nameof(HttpApiClientWrapper));
|
||||
|
||||
// Add Policies to be applied
|
||||
_policyWrapper = Policy.WrapAsync(
|
16
src/Web/WebMVC/Services/Utilities/IHttpClient.cs
Normal file
16
src/Web/WebMVC/Services/Utilities/IHttpClient.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace WebMVC.Services.Utilities
|
||||
{
|
||||
public interface IHttpClient
|
||||
{
|
||||
HttpClient Inst { get; }
|
||||
Task<string> GetStringAsync(string uri);
|
||||
Task<HttpResponseMessage> PostAsync<T>(string uri, T item);
|
||||
Task<HttpResponseMessage> DeleteAsync(string uri);
|
||||
}
|
||||
}
|
@ -14,6 +14,7 @@ using Microsoft.IdentityModel.Tokens;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using System.Threading;
|
||||
using Microsoft.Extensions.Options;
|
||||
using WebMVC.Services.Utilities;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.WebMVC
|
||||
{
|
||||
@ -46,11 +47,19 @@ namespace Microsoft.eShopOnContainers.WebMVC
|
||||
|
||||
// Add application services.
|
||||
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
||||
|
||||
services.AddTransient<ICatalogService, CatalogService>();
|
||||
services.AddTransient<IOrderingService, OrderingService>();
|
||||
services.AddTransient<IBasketService, BasketService>();
|
||||
services.AddTransient<IIdentityParser<ApplicationUser>, IdentityParser>();
|
||||
|
||||
if(Configuration.GetValue<string>("ActivateCircuitBreaker") == bool.TrueString)
|
||||
{
|
||||
services.AddSingleton<IHttpClient, HttpApiClientWrapper>();
|
||||
}
|
||||
else
|
||||
{
|
||||
services.AddSingleton<IHttpClient, HttpApiClient>();
|
||||
}
|
||||
}
|
||||
|
||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
||||
|
@ -4,6 +4,7 @@
|
||||
"BasketUrl": "http://localhost:5103",
|
||||
"IdentityUrl": "http://localhost:5105",
|
||||
"CallBackUrl": "http://localhost:5100/",
|
||||
"ActivateCircuitBreaker": "True",
|
||||
"Logging": {
|
||||
"IncludeScopes": false,
|
||||
"LogLevel": {
|
||||
|
Loading…
x
Reference in New Issue
Block a user