c# - 在 Swagger 中使用字典式数据类型

标签 c# .net asp.net-web-api swagger-2.0

假设我有一个 WebAPI 操作定义如下:

[HttpGet]
public string GetFirstValue(KeyValuePair<string, string>[] data)
{
    data = data ?? new KeyValuePair<string, string>[0];

    return data.Any() ? data.ElementAt(0).Value : "No items supplied";
}

我有一个模型绑定(bind)器,可以将每个查询字符串参数转换为数组条目。

你可以这样调用它:

http://localhost/MyController/GetFirstValue?Fruit1=Apple&Fruit2=Banana

模型绑定(bind)器将其转换为一个数组,如 [{Fruit1=Apple},{Fruit2=Banana}] ,操作返回 Apple (因为这是第一个条目)。

我想使用 Swagger 记录这一点,但 Swagger UI 的默认实现最终会生成一个 URL,将所有数据放入多个名为 data 的查询字符串参数中。 ,这不是我想要公开 API 的方式。

http://localhost:9102/MyController/GetFirstValue?data=Fruit1%3DBanana&data=Fruit2%3DApple

有什么想法吗?我很高兴在操作参数中使用不同的数据类型,例如 Dictionary<string, string> ,或 IEnumerable 或类似的 - 只要它是提供任意键/值的可扩展机制。

最佳答案

您所描述的内容在 Swagger 中是不可能的。引用Swagger spec ,您需要为操作指定一个参数列表,并且每个参数需要一个固定的名称。 Swagger 中没有办法说“此操作接受任意数量的具有未指定名称的查询字符串参数”。

如果您删除了接受任意键的约束,那么这将很容易,您只需拥有一个 Array[string] 类型的“Fruit”参数并期望您的客户调用 http://localhost/MyController/GetFirstValue?Fruit=Apple&Fruit=Banana 等等(例如类似于 http://petstore.swagger.io/#!/pet/findPetsByStatus 操作)。

关于c# - 在 Swagger 中使用字典式数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36895785/

相关文章:

c# - .NET 的 GUID 结构

c# - 无法从 Visual Studio : System. AccessViolationException 运行控制台应用程序

asp.net-web-api - Web API ODataResult 总是序列化为 Atom

c# - 如何使用 InboundClaimTypeMap 进行声明映射?

c# - 注入(inject)通用的 getter 和 setter 以获得比反射更好的性能

c# - 慢正则表达式拆分

c# - 向 MS 语言团队建议语言改进的最佳地点在哪里?

java - 将 python 与其他语言(.Net、Java ....)集成的机制是什么

.net - 执行 .net 方法时如何重定向 Powershell 中的错误输出?

c# - .NET MVC 4 WebAPI POST 不工作