假设我有一个 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/