延迟建立请求

约翰尼5

我正在尝试创建第三方库来使用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();
}

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

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

恩科西

根据到目前为止的显示,端点似乎正在使用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);

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章