改装 - 如何拥有可选动态 headers
Refit - How to have OPTIONAL dynamic headers
我正在使用 Refit 并想为某些方法设置可选的动态 headers。例如,如果用户已登录,我希望有 header "UserId" 和 "AuthenticationToken",否则不要设置 headers
[Post("/search")]
Task<SearchResponse> Search([Body]SearchRequest request, [Header("UserId")] string userId,[Header("AuthorizationToken")] string token);
不确定我是否将空值传递给 userId 和令牌,这两个 header 将具有空值或只是被跳过(不包括在 header 中)?
谢谢。
使用改装,您可以实现 DelegatingHandler,然后在发送 http 请求之前注册它以执行您需要的任何操作。这里是为每个请求添加一个 origin header。改装界面不用担心
public class AddOriginHeaderToRequest : DelegatingHandler
{
private const string ServiceNameSettingLocation = "AppConfig:Logging:ServiceName";
private readonly IHttpContextAccessor httpContextAccessor;
private readonly IConfiguration configuration;
public AddOriginHeaderToRequest(IHttpContextAccessor httpContextAccessor, IConfiguration configuration)
{
this.httpContextAccessor = httpContextAccessor;
this.configuration = configuration;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var origin = this.configuration[AddOriginHeaderToRequest.SomethingThatShouldBeDefined];
if (!(request.Headers.Contains("origin") || request.Headers.Contains("Origin")) && origin != null)
{
request.Headers.Add("origin", origin);
}
return await base.SendAsync(request, cancellationToken);
}
}
然后这样注册:
services.AddTransient<AddOriginHeaderToRequest>();
然后可以像这样注册改装客户端(这是我们的一个 nuget 包的编辑版本,因此希望能了解它是如何工作的):
public static IHttpClientBuilder AddHttpClientWithDefaultHandlers(
this IServiceCollection services,
string name,
Action<HttpClient> configureClient)
{
return services.AddHttpClient(name, configureClient)
.AddHttpMessageHandler<AddOriginHeaderToRequest>();
}
然后在我们的服务中,我们像这样注册改装处理程序:
services.AddHttpClientWithRefitAndDefaultHandlers<ImyHttpClient>(
"myHttpClient",
c =>
{
c.BaseAddress = new Uri(appSettings.Value.AppConfig.SomeUrl);
});
这可以简化,但我们有许多不同的处理程序以标准方式处理我们的 http 请求。
我希望这能为您指明它是如何工作的。
我正在使用 Refit 并想为某些方法设置可选的动态 headers。例如,如果用户已登录,我希望有 header "UserId" 和 "AuthenticationToken",否则不要设置 headers
[Post("/search")]
Task<SearchResponse> Search([Body]SearchRequest request, [Header("UserId")] string userId,[Header("AuthorizationToken")] string token);
不确定我是否将空值传递给 userId 和令牌,这两个 header 将具有空值或只是被跳过(不包括在 header 中)?
谢谢。
使用改装,您可以实现 DelegatingHandler,然后在发送 http 请求之前注册它以执行您需要的任何操作。这里是为每个请求添加一个 origin header。改装界面不用担心
public class AddOriginHeaderToRequest : DelegatingHandler
{
private const string ServiceNameSettingLocation = "AppConfig:Logging:ServiceName";
private readonly IHttpContextAccessor httpContextAccessor;
private readonly IConfiguration configuration;
public AddOriginHeaderToRequest(IHttpContextAccessor httpContextAccessor, IConfiguration configuration)
{
this.httpContextAccessor = httpContextAccessor;
this.configuration = configuration;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var origin = this.configuration[AddOriginHeaderToRequest.SomethingThatShouldBeDefined];
if (!(request.Headers.Contains("origin") || request.Headers.Contains("Origin")) && origin != null)
{
request.Headers.Add("origin", origin);
}
return await base.SendAsync(request, cancellationToken);
}
}
然后这样注册:
services.AddTransient<AddOriginHeaderToRequest>();
然后可以像这样注册改装客户端(这是我们的一个 nuget 包的编辑版本,因此希望能了解它是如何工作的):
public static IHttpClientBuilder AddHttpClientWithDefaultHandlers(
this IServiceCollection services,
string name,
Action<HttpClient> configureClient)
{
return services.AddHttpClient(name, configureClient)
.AddHttpMessageHandler<AddOriginHeaderToRequest>();
}
然后在我们的服务中,我们像这样注册改装处理程序:
services.AddHttpClientWithRefitAndDefaultHandlers<ImyHttpClient>(
"myHttpClient",
c =>
{
c.BaseAddress = new Uri(appSettings.Value.AppConfig.SomeUrl);
});
这可以简化,但我们有许多不同的处理程序以标准方式处理我们的 http 请求。
我希望这能为您指明它是如何工作的。