Используйте вид компонентов. По сути, они являются автономными функциональными модулями, которые возвращают представления, которые вы можете встраивать в другие представления, без необходимости просмотра какого-либо из них основного представления или действия.
Сначала создайте директорию вызова ViewComponents
. Внутри добавьте новый класс, например ProductsViewComponent
. Тогда вам нужно что-то вроде:
public class ProductsViewComponent : ViewComponent
{
private readonly HttpClient _client;
public ProductsViewComponent(HttpClient client)
{
_client = client ?? throw new ArgumentNullException(nameof(client));
}
public async Task<IViewComponentResult> InvokeAsync(string date)
{
using (var response = await _client.GetAsync($"/"product/get_products/{date}"))
{
response.EnsureSuccessStatusCode();
var products = await response.Content.ReadAsAsync<List<Product>>();
return View(products);
}
}
}
Затем создайте представление, Views\Shared\Components\Products\Default.cshtml
. Внутри добавьте HTML, чтобы отобразить список продуктов. Наконец, там, где вы хотите, чтобы появилась таблица продуктов, добавьте:
@await Component.InvokeAsync("Products", new { date = myDate })
В приведенном выше коде используется HttpClient
, а не RestClient
, поскольку, честно говоря, на данный момент совершенно не нужно иметь отдельную библиотеку для выполнения HTTP-вызовов. HttpClient
является встроенным и расширен в функциональности в Core, чтобы упростить это, например, метод ReadAsAsync
, использованный выше, который прозрачно десериализует ваш ответ JSON в аргумент универсального типа. Кроме того, теперь у вас есть такие вещи, как IHttpClientFactory
, что обеспечивает правильную область действия HttpClient
экземпляров. В результате приведенный выше код также предполагает добавление к вашему Startup.cs
чего-то вроде следующего:
services.AddHttpClient<ProductsViewComponent>(c =>
{
c.BaseAddress = new Uri('https://api.myservice.com');
// add default headers and such if you need them
});
Затем вы также можете использовать интеграцию Polly для настройки автоматических повторных попыток, автоматических выключателей и т. Д., Что позволяет обрабатывать все виды сценариев API, такие как временно недоступные, ограничения скорости и т. Д. См. Полную документацию для обоих IHttpClientFactory
и его интеграция Полли для получения дополнительной информации.
Наконец, если это сценарий, в котором вам не нужны данные в реальном времени, вы также можете внедрить экземпляр IDistributedCache
в ваш компонент представления и добавить логику, чтобы установить в нем результат вашего вызова API и извлечь его. сначала перед тем, как снова позвонить, что позволит вам значительно снизить нагрузку как на ваше приложение, так и на API (особенно, если есть что-то, где применяются ограничения скорости).