Задержка построения запроса - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь создать стороннюю библиотеку для использования API.

Я создал несколько классов, которые разрешают различные вызовы API, например:

public class AccountsEndpoint: IAccountsEndpoint
{
    public async Task<Account> GetAsync(id)
    {
        return await this.BuildUrl(id).GetJsonAsync();
    }
    //etc...
}

public class NotificationsEndpoint: INotificationsEndpoint
{
    public async Task<Notification> SetPrimary(id)
    {
        return await this.BuildUrl(id).AppendSegment("Primary")
                         .PostJsonAsync(null, cancellationToken)
                         .ReceiveJson<Notification>())();
    }
}

У меня есть большое количество этих конечных точек, и я хотел бы запустить дополнительный код перед каждым из этих вызовов,

например, если мой токен oauth недействителен, я бы хотел получить новый токен доступа и повторить запрос автоматически.

Я бы предпочел НЕ , чтобы обернуть все вызовы API с помощью такого обработчика, как:

public async Task<Notification> SetPrimary(id)
{
    return await new CustomErrorHandler(() => 
                     this.BuildUrl(id).AppendSegment("Primary")
                       .PostJsonAsync(null, cancellationToken)
                       .ReceiveJson<Notification>())()).ExecuteAsync();
}

Если бы я сделал что-то подобное, мне пришлось бы помнить об использовании обработчика ошибок на всех конечных точках, когда я чувствую, что есть лучший способ инвертировать элемент управления. (В качестве альтернативы я мог бы создать фиктивный интерфейс и использовать там логику переноса, но при этом возникают те же проблемы, что и при добавлении вызовов вручную).

Как мне обернуть все вызовы логикой обработчика ошибок?

1 Ответ

0 голосов
/ 13 ноября 2018

Исходя из того, что было показано до сих пор, кажется, что конечные точки используют Flurl.

В рамках этого фреймворка используется HttpClient, что должно обеспечить точку расширения для использования преимуществ конвейера запросов.

В соответствии с документацией вы должны иметь возможность настроить глобальные параметры для достижения желаемого поведения.

Например

У меня есть большое количество этих конечных точек, и я хотел бы запустить дополнительный код перед каждым из этих вызовов

например, если мой токен oauth недействителен, я бы хотел получить новый токен доступа и повторить запрос автоматически.

private async Task HandleOAuthAsync(HttpCall call) {
    //...check response and if token expired perform some action or trigger some event
}

//...


//register globally
FlurlHttp.Configure(settings => settings.AfterCallAsync = HandleOAuthAsync);

Существует даже возможность перейти на уровень клиента для более прямого доступа к клиенту или обработчикам сообщений, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...