2016-04-27 71 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對! –