Asp.net Core + Swagger:如何显示 GET 类型的 API

Asp.net Core + Swagger : How to show APIs of type GET

如何在 Swagger 页面中只显示 API 类型的 GET 并隐藏其他? 我发现属性 [ApiExplorerSettings(IgnoreApi = true)] 可以从 Swagger 页面隐藏 API,
但我有很多 API 要隐藏,我需要一种方法来根据其 HTTP 类型隐藏 API。 我试过这种方法:

 public class SwaggerFilter : IDocumentFilter
    {
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            var nonGetPaths = swaggerDoc.Paths.Where(x => x.Value.Operations.First().Key != OperationType.Get);
            var count=nonGetPaths.Count();
            foreach (var item in nonGetPaths)
            {
                swaggerDoc.Paths.Remove(item.Key);
            }
        }
    }

但是没用

像这样写一个自定义过滤器:

public class SwaggerFilter : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        
        foreach (var path in swaggerDoc.Paths)
        {
          foreach (var key in path.Value.Operations.Keys )
          {
            if (key != OperationType.Get)
            {
                swaggerDoc.Paths.Remove(path.Key);
            }
          }
       }
       
    }
}

然后在program.cs(.Net 6)

中配置
//.......
builder.Services.AddSwaggerGen(x=>x.DocumentFilter<SwaggerFilter>());
//......

我没有在我的 apicontroller 中添加 [ApiExplorerSettings(IgnoreApi = true)],它工作正常。

但是,请确保 Get 端点和其他类型的端点在同一控制器中具有不同的路由,您可以在 Get 端点上添加属性路由,如 [HttpGet("/get")]。如果你只是在同一个控制器中这样写:

       [HttpPost]
        public IActionResult Post()
        {
            return Ok();
        }

        [HttpGet]
        public IActionResult Get()
        {
            return NotFound();
        }

GetPost 端点将具有相同的路径。 swaggerDoc.Paths.Remove(xxx); 将删除所有这些。

结果:

之前

之后