Переоснащение - Как иметь ДОПОЛНИТЕЛЬНЫЕ динамические c заголовки - PullRequest
0 голосов
/ 10 января 2020

Я использую Refit и хотел бы установить НЕОБЯЗАТЕЛЬНЫЕ динамические c заголовки для некоторых методов. Например, если пользователь вошел в систему, я хочу иметь заголовки «UserId» и «AuthenticationToken», в противном случае НЕ устанавливайте заголовки

[Post("/search")]
Task<SearchResponse> Search([Body]SearchRequest request, [Header("UserId")] string userId,[Header("AuthorizationToken")] string token);

Не уверен, если я передам нулевое значение userId и токену, два заголовка будут иметь нулевое значение или будут пропущены (не включены в заголовок)?

Спасибо.

1 Ответ

1 голос
/ 13 марта 2020

Используя refit, вы можете реализовать DelegatingHandler, а затем зарегистрировать его, чтобы сделать все, что вам нужно, с http-запросом перед его отправкой. Здесь добавляется заголовок источника к каждому запросу. Интерфейс Refit не должен беспокоиться об этом.

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>();

Тогда клиент refit может быть зарегистрирован следующим образом (это отредактированная версия один из наших пакетов nuget, поэтому мы надеемся дать представление о том, как он работает):

public static IHttpClientBuilder AddHttpClientWithDefaultHandlers(
            this IServiceCollection services,
            string name,
            Action<HttpClient> configureClient)
        {
            return services.AddHttpClient(name, configureClient)
                .AddHttpMessageHandler<AddOriginHeaderToRequest>();
        }

Затем в нашем сервисе мы регистрируем наш обработчик refit следующим образом:

services.AddHttpClientWithRefitAndDefaultHandlers<ImyHttpClient>(
                "myHttpClient",
                c =>
                {
                    c.BaseAddress = new Uri(appSettings.Value.AppConfig.SomeUrl);
                });

Это может быть упрощенный, но у нас есть несколько различных обработчиков, которые стандартно массируют наши http-запросы.

Я надеюсь, что это даст вам указатель на то, как это может работать.

...