我正在尝试创建一个第三方库来使用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();
}
如果我要执行类似的操作,则必须记住在所有端点上都使用错误处理程序,这时我想有一种更好的方法来反转控件。 (或者,我可以生成虚拟接口并在其中包含包装逻辑,但这会产生与手动添加调用相同的问题)。
如何使用错误处理程序逻辑包装所有调用?
答案 0 :(得分:2)
根据到目前为止的显示,这些端点似乎正在使用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);
如果需要,甚至可以降级到客户端级别以更直接地访问客户端或消息处理程序。