[英]Encode parameter before executing the request
我們正在使用.NET Core 3.1
和Swashbuckle.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.