c# - 在 Swagger 中隐藏参数的最佳方法

我正在构建一个 API,其中有几个端点需要用户 ID,所以在从这篇文章中投票最多的答案(不是被接受的答案)中得到想法后: ASP.NET MVC Pass object from Custom Action Filter to Action .

我创建了一个操作过滤器,我可以使用 [UserIdFromToken] 属性进行设置。

所以我基本上是通过这个 Action Filter 获取用户 ID,它以这种方式从授权 header 中获取它:

[Authorize]
[UserIdFromToken]
public IActionResult Get(Guid userId /* Got from the [UserIdFromToken] filter */)
{
   return Ok(_userService.Get(userId));
}

现在唯一的问题是它在我的 Swagger 文档中将参数 userId 显示为必需参数(我根本不想显示它),这显然是错误的,因为我不知道' 需要授权 header 之外的任何输入。

有什么方法可以让我的 swagger 文档更清晰,而不显示此参数?

您是否认为尝试另一种方法来获取 userId 会更好,例如我在上面发送的帖子中接受的选项?

最佳答案

我知道这是一篇旧帖子,但如果有人遇到类似问题,您可以通过扩展 Swashbuckle.AspNetCore.SwaggerGen.IOperationFilter 来创建自己的操作过滤器,如下所示:

public class HideUserIdOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var scopes = context.MethodInfo
            .GetCustomAttributes(true)
            .OfType<UserIdFromTokenAttribute>()
            .Distinct();

        if (scopes.Any())
        {
            operation.Parameters = operation.Parameters.Where(param => param.Name != "userId").ToList();
        }
    }
}

请记住将操作过滤器添加到您的 swagger 生成器中:

c.OperationFilter<HideUserIdOperationFilter>();

https://stackoverflow.com/questions/62050435/

相关文章:

reactjs - React Rich Text Editor 真的可以在移动设备上运行吗?

docker - 无法加载动态库 'libcuda.so.1'; dlerror : libcuda

python - psutil.AccessDenied : psutil. AccessDenie

ethereum - 返回错误 : The method web3_clientVersion do

javascript - 创建 React 应用程序 + React lazy + Absolute

docker - 如何处理 make missing from alpine docker imag

python - 在 tensorflow 2.0 中保存和加载模型

graphql-java - 读取通过 G​​raphQL Java 中的变量传递的字段参数

r - 在创建列表 tibble 列时在 "mutation"中使用 dplyr::sym() 会导

google-cloud-functions - GCP Console : console. lo