В современной разработке программного обеспечения интеграция внешних API или веб-сервисов является обычной практикой. При выполнении таких вызовов важно писать чистый и удобный в сопровождении код, который эффективно обрабатывает исключения, отслеживает детали вызовов служб и обеспечивает возможность повторного использования. В этой статье мы рассмотрим весьма общий подход C# к управлению вызовами API и веб-служб с использованием метода ExecuteAsync. Мы предоставим примеры кода и пояснения, которые помогут вам понять и эффективно реализовать эту стратегию.

Введение

Метод ExecuteAsync упрощает процесс вызовов API или веб-службы, инкапсулируя общие функции, такие как обработка ошибок, отслеживание вызовов служб и обработка результатов. Он способствует чистоте кода и уменьшает избыточность, делая ваше приложение более надежным и удобным в обслуживании.

Начиная

Давайте начнем с определения метода ExecuteAsync и его основных компонентов в более общем виде:

public static async Task<TResult> ExecuteAsync<TRequest, TResult>(
    TRequest request,
    Func<TRequest, Task<TResult>> apiCall,
    Action<Exception> errorHandler = null) where TResult : class
{
    // Implementation goes here
}

Метод ExecuteAsync теперь принимает три параметра:

  1. request: общий входной параметр, представляющий данные, которые вы хотите отправить в API или веб-службу.
  2. apiCall: Делегат, указывающий на асинхронную функцию, представляющую вызов API или веб-службы. Он принимает параметр request и возвращает общий Task<TResult>.
  3. errorHandler (необязательно): Делегат действия, позволяющий указать пользовательскую логику обработки ошибок.

Ключевые компоненты

1. Обработка ошибок

try
{
    TResult result = await apiCall(request);
    return result;
}
catch (Exception ex)
{
    errorHandler?.Invoke(ex); // Custom error handling, if provided
    throw;
}
  • Мы используем блок try-catch для обработки исключений во время вызова API.
  • Если возникает ошибка, мы вызываем пользовательский errorHandler, если он предусмотрен, для обработки ошибки по мере необходимости.

Пример использования

Теперь давайте посмотрим, как использовать общий метод ExecuteAsync в вашем коде.

public async Task<IActionResult> GetApiResponseAsync()
{
    var request = new ApiRequest { /* Populate with data */ };
    
    try
    {
        var response = await ExecuteAsync(
            request,
            async (input) => await ApiService.SendRequestAsync(input),
            (ex) => { /* Custom error handling logic */ });
            
        return Ok(response);
    }
    catch (Exception ex)
    {
        return BadRequest(ex.Message);
    }
}

В этом примере мы создаем объект ApiRequest, представляющий входные данные для вызова API. Затем мы используем ExecuteAsync для вызова API, передачи данных запроса и корректной обработки любых исключений. При необходимости вы также можете предоставить собственную логику обработки ошибок.

Заключение

Управление вызовами API и веб-служб становится еще более эффективным и гибким благодаря универсальному методу ExecuteAsync. Используя возможности дженериков, вы можете создавать повторно используемый, чистый и удобный в сопровождении код, который беспрепятственно взаимодействует с различными API и сервисами, обеспечивая при этом надежную обработку ошибок. Такой подход упрощает вашу кодовую базу и повышает общее качество вашего программного обеспечения.

Стеккадемический

Спасибо, что дочитали до конца. Прежде чем уйти:

  • Пожалуйста, рассмотрите возможность аплодировать и следовать автору! 👏
  • Следуйте за нами в Twitter(X), LinkedIn и YouTube.
  • Посетите Stackademic.com, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.