You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenAPI规范中隐藏指定DTO且保留其在元数据中?

如何在OpenAPI规范中隐藏指定DTO且保留其在元数据中?

我之前也碰到过类似的需求,既要在OpenAPI文档里隐藏某些DTO,又得让它们在元数据(比如TypeScript类型生成接口)里保持可用,这里分享几个可行的解决方案:


方案一:给DTO加自定义标识,在ApiDeclarationFilter中识别移除

这是最直接的方式:

  1. 给目标DTO打标记:在代码里给需要隐藏的DTO类添加自定义属性(比如[HideFromOpenApiSpec]),或者在OpenAPI注解里加上自定义的扩展字段(比如x-hide-from-spec: true)。
  2. 在ApiDeclarationFilter中过滤:实现ApiDeclarationFilter时,遍历api.Definitions集合,检查每个DTO是否带有你定义的标记,匹配上的就从集合里移除。

这样处理后,OpenAPI规范里就不会出现这些DTO的定义了,但元数据生成流程(比如/types/typescript)是直接读取系统元数据(比如反射类型信息),不会经过这个过滤器,所以元数据里的模型会完整保留。

举个伪代码示例(以C# Swashbuckle环境为例):

public class HideSpecificDtosFilter : IApiDeclarationFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        // 找出所有带有自定义隐藏属性的DTO
        var dtosToRemove = swaggerDoc.Definitions
            .Where(kv => 
                context.SchemaRepository.TryGetSchemaForType(kv.Value, out var type) &&
                type.GetCustomAttributes(typeof(HideFromOpenApiSpecAttribute), inherit: true).Any())
            .Select(kv => kv.Key)
            .ToList();

        // 从OpenAPI定义中移除这些DTO
        foreach (var dtoKey in dtosToRemove)
        {
            swaggerDoc.Definitions.Remove(dtoKey);
        }
    }
}

方案二:结合SchemaFilter做标记,再用ApiDeclarationFilter移除

如果你的场景不方便直接给类加自定义属性,可以先用SchemaFilter给目标DTO的OpenAPI schema打上自定义扩展标记,然后在ApiDeclarationFilter里根据这个标记来移除对应的定义:

  1. 在SchemaFilter中,给要隐藏的DTO的schema添加扩展字段,比如schema.Extensions.Add("x-hide-from-spec", true);
  2. 然后在ApiDeclarationFilter里遍历api.Definitions,检查每个schema的扩展字段,符合条件的就移除。

关键注意点

要确保你的元数据生成逻辑(比如生成TypeScript类型)是直接从系统元数据(如反射、代码模型)获取信息,而不是依赖处理后的OpenAPI文档。只有这样,移除OpenAPI里的DTO定义才不会影响元数据的完整性。


备注:内容来源于stack exchange,提问作者Barry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 02:44:41