簡體   English   中英

在執行請求之前對參數進行編碼

[英]Encode parameter before executing the request

我們正在使用.NET Core 3.1Swashbuckle.AspNetCore 5.6.3

我們的一些 controller 操作需要在請求中發送User-Identity HTTP header。 User-Identity HTTP header 的值是 base64 編碼的 JSON object。示例:

JSON object

{
  "email": "test@test.com"
}

在 base64 中編碼為:

ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9

我們實現了以下過濾器操作,檢查 controller 操作是否具有[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\": \"test@test.com\" } => ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9",
        Name = "User-Identity",
        In = ParameterLocation.Header,
        Schema = new OpenApiSchema
        {
          Type = "string",
          Example = new OpenApiString("ewogICJFbWFpbCI6ICJ0ZXN0QHRlc3QuY29tIgp9")
        }
      });
    }
  }
}

這就是它在 SwaggerUI 中的樣子:

圖片

它按原樣工作正常。 User-Identity header 被發送到服務器。

但是,它不是很用戶友好,因為用戶必須輸入一個必須經過 base64 編碼的字符串。 我們是否可以簡化輸入,以便用戶只需輸入用戶 email(例如test@test.com ),而 C# 將在將請求發送到服務器之前處理 base64 編碼?

SwaggerUI 使用 JavaScript 將請求發送到服務器。 您可以注入一個腳本來攔截請求並在將其傳輸到服務器之前更改 header,例如

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 目標瀏覽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM