gpt4 book ai didi

c# - 向所有传出的 Refit 请求添加动态 header

转载 作者:行者123 更新时间:2023-12-02 02:47:20 27 4
gpt4 key购买 nike

我在使用 IHttpClientFactory 的 .NET Core 3.1 应用程序中使用 Refit (5.1.67) 作为我的 HttpClient 包装器。

我正在调用的 API 使用客户端凭证 token 进行保护。

我正在用这个注册客户端:

services.AddRefitClient<ISomeApiClient>().ConfigureHttpClient(c =>
c.BaseAddress = new Uri(Configuration["BaseUrlFromConfig"]));

客户端有如下所示的方法:

public interface ISomeApiClient
{
[Get("/api/somewhere")]
Task<IEnumerable<MyResponseObject>> GetItems([Header("X-User-Id")] string userId, [Header("Authorization")] string accessToken);

[Get("/api/somewhere-else")]
Task<MyResponseObject> GetItem([Header("X-User-Id")] string userId, [Header("Authorization")] string accessToken, int id);
}

我想避免的是每次调用端点时都必须显式传递 accessToken 和 userId(如上)。理想情况下,我想让我的客户看起来像这样:

public interface ISomeApiClient
{
[Get("/api/somewhere")]
Task<IEnumerable<MyResponseObject>> GetItems();

[Get("/api/somewhere")]
Task<IEnumerable<MyResponseObject>> GetItems(int id);
}

感觉我需要某种请求中间件来处理传出请求,我可以在其中添加这两个 header 。如果它们是静态的,我会装饰整个界面,但因为这些是运行时值,将不起作用。

我在文档中找不到任何关于这方面的帮助,非常感谢任何指点。

最佳答案

retrofit 文档现在解释了如何做到这一点

https://github.com/reactiveui/refit#reducing-header-boilerplate-with-delegatinghandlers-authorization-headers-worked-example

添加 header 处理程序:

class AuthHeaderHandler : DelegatingHandler
{
private readonly IAuthTokenStore authTokenStore;

public AuthHeaderHandler(IAuthTokenStore authTokenStore)
{
this.authTokenStore = authTokenStore;
}

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = await authTokenStore.GetToken();

//potentially refresh token here if it has expired etc.

request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
}
}

然后在注册客户端的时候在Startup.cs中注册:

services.AddTransient<AuthHeaderHandler>();

services.AddRefitClient<ISomeThirdPartyApi>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri("https://api.example.com"))
.AddHttpMessageHandler<AuthHeaderHandler>();

关于c# - 向所有传出的 Refit 请求添加动态 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62599737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com