【问题标题】:Delay Building Of a Request延迟构建请求
【发布时间】:2019-04-14 18:45:39
【问题描述】:

我正在尝试创建一个第三方库来使用 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 令牌无效,我希望获得一个新的访问令牌并自动重试请求。

我希望 NOT 必须使用以下处理程序包装所有 api 调用:

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

如果我要做类似的事情,我必须记住在所有端点上使用错误处理程序,当我觉得有更好的方法来反转控件时。 (或者,我可以生成虚拟接口并在那里有包装逻辑,但这会产生与手动添加调用相同的问题)。

如何使用错误处理程序逻辑包装所有调用?

【问题讨论】:

  • 我对呈现的代码有点困惑,因为它没有提供足够的上下文让我清楚地了解它应该做什么。尽管如此,您提到了管道和中间件模式。如果您有一个管理请求的管道,那么您可以在管道的早期插入一个满足您寻求的行为的中间件
  • 类似于 Web API 中消息处理程序的使用方式
  • @nkosi 感谢您的回复,我会检查一下
  • 您似乎在使用 Flurl。您可能会对这些内容感兴趣。 flurl.io/docs/configurationflurl.io/docs/extensibility
  • 如果您在全球范围内应用它,则不会。

标签: c# .net rest architecture


【解决方案1】:

根据目前显示的情况,端点似乎正在使用 Flurl。

在框架使用 HttpClient 的底层,它应该提供一个可扩展点来利用请求管道。

根据documentation,您应该能够配置全局设置以实现所需的行为。

例如

我有大量这样的端点,我想在每次调用之前运行一些额外的代码

例如,如果我的 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);

如果需要,甚至可以进入客户端级别,以便更直接地访问客户端或消息处理程序。

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 1970-01-01
    • 2021-01-08
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多