2016-04-27 70 views
2

想象一下,我有一个动作的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"; 
} 

我有一个模型,粘合剂,每一个查询字符串参数转换为数组条目。

你会这样称呼它:

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

的模型粘结剂将其转换成类似[{Fruit1=Apple},{Fruit2=Banana}]一个数组,动作返回Apple(因为这是第一个条目)。

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

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

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

回答

2

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

如果删除有关接受任意键约束,则这将是容易的,你只需有型数组[字符串]的“水果”参数,并希望您的客户打电话 http://localhost/MyController/GetFirstValue?Fruit=Apple&Fruit=Banana 等(类似于http://petstore.swagger.io/#!/pet/findPetsByStatus操作)。

+0

是的,这就是我的想法。我们确实需要任意参数的东西 - 在我们的例子中,它是用来指定一个过滤器列表,在过滤器上的数据键在运行时被定义。阙血清。 –

+1

嗯,有点笨重,但如何有一个“键”参数和“价值”参数,这两种类型的数组[字符串]?然后,人们可以调用http:// localhost/MyController/GetFirstValue?key = fruit1&value = apple&key = fruit2&value = banana –

+0

是的,我也可以使用“?filter = key1%3Dvalue1&filter = key23Dvalue2”,但这两种查询在查询时看起来都很笨重字符串已经是KV对! –