首页 > 解决方案 > 如何告诉 Swagger 不要将输入类中的某些字段显示为参数?

问题描述

我有一个 api 应用程序,其中控制器方法将类作为输入。我正在使用 Swagger 向用户展示该类中有哪些变量。我将该类用于其他目的,因此对于某些方法,我希望 Swagger 不显示某些对象。我尝试了这里提到的属性 [IgnoreDataMember] ,但它似乎没有做任何事情。如何防止 Swagger 显示输入类中的每个对象?

所以这里是方法定义:

[HttpPost("Receive")]
[Produces("application/json", Type = typeof(APIResponse))]
public APIResponse Receive(MyClass item)
{....}

MyClass 用 4 个对象定义:

public class MyClass
{
    [IgnoreDataMember]
    public int itemID { get; set; }
    [IgnoreDataMember]
    public int quantity { get; set; }
    public int vendor_id { get; set; }
    public string ship_name { get; set; }
}

现在,Swagger 将所有 4 个对象显示为参数:

在此处输入图像描述

对于这种方法,我只想将 4 个类对象中的 2 个显示为参数。对于其他方法,我需要展示所有 4 个。有没有办法做到这一点,或者我需要为每个方法创建一个类?

标签: c#apiswaggerswashbuckle

解决方案


默认情况下,Swagger不准备这样做,如果你想要一个参数,你可以添加一个默认值,比如

public void myMethod(string a = "abc", int a = 1)

但是,如果你想完全省略一个参数,你可以这样做:

添加一个名为CustomSchemaFilters的新文件

public class CustomSchemaFilters : ISchemaFilter
{
    public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
    {
        var excludeProperties = new[] {"name", "lastname, "token"};

        foreach(var prop in excludeProperties)
            if (schema.properties.ContainsKey(prop))
                schema.properties.Remove(prop);
    }
}

并在您的文件AppStart/SwaggerConfig.cs

并在同一个文件中添加这一行

c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

就在里面:

GlobalConfiguration.Configuration .EnableSwagger(c => { ...

添加行:

c.SchemaFilter<CustomSchemaFilters>();


推荐阅读