如何只显示应该实际发送的字段的Swashbuckle参数对象?

时间:2018-08-08 13:05:04

标签: asp.net-core swagger swashbuckle

我开始使用Swagger的AspNetCore库使用Swashbuckle

当我将一个带有引用的对象放入我的API时,当只有标识符(Id)时,它就好像有必要发送引用的所有字段一样

这里有个例子:

模型结构:

public class Cidade
{
    public long Id { get; set; }
    public string Nome { get; set; }
    public Uf Uf { get; set; }
}

public class Uf
{
    public long Id { get; set; }
    public string Nome { get; set; }
    public Pais Pais { get; set; }
}

public class Pais
{
    public long Id { get; set; }
    public string Nome { get; set; }
}

以及以下API:

[Produces("application/json")]
[Route("api/Cidade")]
public class CidadeController : Controller
{        
    // POST: api/Cidade
    [HttpPost]
    public void Post([FromBody]Cidade value)
    {
    }
}

Swagger中的结果如下:

enter image description here

以下是我想要的(最多uf.id):

enter image description here

如何获得此结果?

2 个答案:

答案 0 :(得分:1)

我正在查看样本,我想我发现了可以使用的东西:
http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=P#/PolygonVolume/PolygonVolume_Post

就我而言,我添加的更多,您需要的更少,但仍然需要的只是一个自定义示例...

JSON如下所示:

"PolygonVolumeInsideParameter": {
  "properties": {
    "Points": {
      "items": {
        "$ref": "#/definitions/Location"
      },
      "xml": {
        "name": "Location",
        "wrapped": true
      },
      "example": [
        {
          "Lat": 1.0,
          "Lon": 2.0
        },
        {
          "Lat": 5.0,
          "Lon": 6.0
        }
      ],
      "type": "array"
    },
    "PlanId": {
      "type": "string"
    }
  },
  "xml": {
    "name": "PolygonVolumeInsideParameter"
  },
  "type": "object"
},

在swashbuckle上,我在示例中添加了ISchemaFilter,我的代码在这里:
https://github.com/heldersepu/Swagger-Net-Test/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs#L891

答案 1 :(得分:1)

我遵循@HelderSepu answer的逻辑来获取我的解决方案,如下所示:

我构建了一个架构过滤器,将示例添加到引用属性(Ref)中,该属性具有一个名为“ Id”的属性:

public class ApplySchemaRefIdExtensions : ISchemaFilter
{
    public void Apply(Schema schema, SchemaFilterContext context)
    {
        if (schema.Properties != null)
        {
            foreach (var p in schema.Properties)
            {
                if (p.Value.Example == null && p.Value.Ref != null)
                {
                    var reference = context.SystemType.GetProperty(p.Value.Ref.Split("/").LastOrDefault());
                    if (reference != null)
                    {
                        var id = reference.PropertyType.GetProperty("Id");
                        if (id != null)
                        {
                            p.Value.Example = new
                            {
                                Id = 123
                            };
                            p.Value.Ref = null;
                        }
                    }
                }
            }
        }
    }
}

Startup.cs上:

services.AddSwaggerGen(c =>
{
    // ...
    c.SchemaFilter<ApplySchemaRefIdExtensions>();
});

相同example of the question的结果:

enter image description here