Кодировать параметр перед выполнением запроса

Мы используем .NET Core 3.1 и Swashbuckle.AspNetCore 5.6.3.

Некоторые из наших действий контроллера требуют отправки User-Identity HTTP-заголовка в запросе. Значение этого HTTP-заголовка User-Identity представляет собой объект JSON в кодировке base64. Пример:

JSON-объект

{
  "email": "[email protected]"
}

кодируется в base64 как:

ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9.

Мы реализовали следующую операцию фильтра, которая проверяет, имеет ли действие контроллера атрибут [RequireUserIdentityFilterAttribute], и соответственно добавляет параметр.

public class RequireUserIdentityOperationFilter : IOperationFilter
{
  public void Apply(OpenApiOperation operation, OperationFilterContext context)
  {
    // check if controller action has RequireUserIdentityFilterAttribute with reflection
    var hasRequireUserIdentityFilterAttribute = context.MethodInfo
      .GetCustomAttributes(true)
      .OfType<RequireUserIdentityFilterAttribute>()
      .Any();

    if (hasRequireUserIdentityFilterAttribute)
    {
      operation.Parameters.Add(new OpenApiParameter
      {
        Description = "Base-64 encoded user email object. Example: { \"Email\": \"[email protected]\" } => ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9",
        Name = "User-Identity",
        In = ParameterLocation.Header,
        Schema = new OpenApiSchema
        {
          Type = "string",
          Example = new OpenApiString("ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9")
        }
      });
    }
  }
}

Вот как это выглядит в SwaggerUI:

Кодировать параметр перед выполнением запроса

Он отлично работает как есть. User-Identity заголовок отправляется на сервер.

Однако это не очень удобно для пользователя, потому что пользователь должен вводить строку, которая должна быть закодирована в base64. Возможно ли упростить ввод, чтобы пользователю нужно было вводить только адрес электронной почты пользователя (например, [email protected]), а C# обрабатывал кодировку base64 перед отправкой запроса на сервер?

Если вы используете вложение MIME, вам не нужно кодировать. См.: learn.microsoft.com/en-us/previous-versions/office/developer‌​/… вложение MIME находится в теле сообщения и начинается с двух дефисов на новой строке.

jdweng 29.09.2022 15:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

SwaggerUI использует JavaScript для отправки запросов на сервер. Вы можете ввести скрипт, который перехватывает запрос и изменяет заголовок перед его передачей на сервер, например.

app.UseSwaggerUI(c =>
{
    // ...
    var adjustHeaders = @"(request) => {
        let header = request.headers["User-Identity"];
        if (header && header.length > 0) {
          // header is a JSON object
          if (header[0] == "{") header = 
            btoa(header);
          // header is an email address
          else if (header.indexOf("@") >= 0) 
            header = btoa(JSON.stringify({ email: header }));
          // Otherwise assume that it is already encoded
          request.headers["User-Identity"] = header;
        }
        return request;
    }";
    c.UseRequestInterceptor(adjustHeaders);
});

Вышеприведенный скрипт представляет собой псевдо-Javascript, который может дать вам отправную точку. Пожалуйста, проверьте его в браузере, работает ли он в вашей ситуации и для браузеров, на которые нацелен ваш SwaggerUI.

Это кажется правильным подходом, спасибо. Одно маленькое замечание: UseRequestInterceptor недоступен в 5.6.3, пришлось обновить пакет до 6.4.0.

Mark 30.09.2022 07:54

Другие вопросы по теме