11

我有一个包含以下端点的 ASP.NET Core Web API。

[HttpGet]
[Route("models/{ids}")]
[Produces(typeof(IEnumerable<Model>))]
public IActionResult Get
(
    [ModelBinder(typeof(CsvModelBinder<string>))] IEnumerable<string> ids
)
{
    // Get models

    return Ok(models);
}

此端点采用 CSV 的 Id 列表(例如/models/a,b,c)并返回相应Model对象的 JSON 数组。 CsvModelBinder<string>IModelBinder我编写的一个自定义实现,它将 Id 的 CSV 列表拆分为一个IEnumerable<string>我可以在我的查询中使用的来查找对象。这一切都很好。

我现在要做的是使用 NSwag 生成客户端库,但这证明是有问题的,因为 Swashbuckle 正在生成 Swagger,它将ids参数描述为IEnumerable<string>,而不是string.

选项 A:有没有办法告诉 Swashbuckle 将参数描述为 astring而不是 a IEnumerable<string>

选项 B:有没有办法告诉 NSwagIEnumerable<string>在生成请求 URL 时应该将此参数编组为 CSV?

4

2 回答 2

9

我想到了。我需要在 Startup.cs 中使用 MapType() 创建自定义模型

CSV文件

public class Csv<T> : List<T> where T : IConvertible
{
    public Csv<T> Append(string delimitedValues)
    {
        var splitValues = delimitedValues
            .Split(',', StringSplitOptions.RemoveEmptyEntries)
            .Cast<string>();

        var convertedValues = splitValues
            .Select(str => Convert.ChangeType(str, typeof(T)))
            .Cast<T>();

        this.AddRange(convertedValues);

        return this;
    }

    public override string ToString()
    {
        return this.Aggregate("", (a,s) => $"{a},{s}").Trim(',');
    }
}

启动.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddSwaggerGen(c =>
    {
        c.IncludeXmlComments(() => new XPathDocument(new FileStream(Path.Combine(PlatformServices.Default.Application.ApplicationBasePath, "MyApi.xml"), FileMode.Open)));
        c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1"});
        c.MapType<Csv<string>>(() => new Schema { Type = "string", Format = "string" });

    });
}
于 2018-03-27T17:15:09.340 回答
0

您可以编写自定义操作过滤器 (Swashbuckle) 或操作处理器 (NSwag) 将规范中的给定参数转换为纯字符串。

于 2018-03-26T19:49:23.903 回答