2016-04-27 12 views
2

Stellen Sie sich vor, dass ich eine WebAPI Aktion definiert haben, wie folgt:Mit Wörterbuch-Style-Daten-Typen in Swagger

[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"; 
} 

Ich habe ein Modell-Binder jede Abfrage-String-Parameter in einem Array-Eintrag zu konvertieren.

Sie würden es mögen nennen:

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

Die Modell-Bindemittel wandeln diese in eine Anordnung wie [{Fruit1=Apple},{Fruit2=Banana}], und die Aktion kehrt Apple (wie, dass der erste Eintrag ist).

Ich möchte dies mithilfe von Swagger dokumentieren, aber die Standardimplementierung von Swagger UI erzeugt am Ende eine URL, die alle Daten in mehrere Abfragezeichenfolgenparameter namens data legt, was meiner API nicht offen steht.

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

Irgendwelche Ideen? Ich bin froh, einen anderen Datentyp in meinem Aktionsparameter zu verwenden, z. B. Dictionary<string, string> oder IEnumerable oder ähnlich - solange es sich um einen erweiterbaren Mechanismus zur Bereitstellung beliebiger Schlüssel/Werte handelt.

Antwort

2

Was Sie beschreiben, ist in Swagger nicht möglich. Unter Bezugnahme auf die Swagger spec müssen Sie eine Liste von Parametern für eine Operation angeben und jeder Parameter erfordert einen festen Namen. Es gibt keine Möglichkeit, in Swagger zu sagen "Diese Operation akzeptiert eine beliebige Anzahl von Abfragezeichenfolgenparametern mit unspezifizierten Namen".

Wenn Sie die Einschränkung über die Annahme beliebige Schlüssel entfernt dann wäre es einfach, würden Sie nur noch einen „Frucht“ Parameter vom Typ Array [string] und erwarten, dass Ihre Kunden die http://petstore.swagger.io/#!/pet/findPetsByStatus http://localhost/MyController/GetFirstValue?Fruit=Apple&Fruit=Banana usw. (ähnlich nennen Operation zum Beispiel).

+0

Ja, das dachte ich mir. Wir brauchen jedoch die willkürliche Parameter-Sache - in unserem Fall ist es für die Angabe einer Liste von Filtern, wo die Datenschlüssel, die Sie filtern, zur Laufzeit definiert werden. Que Seren. –

+1

Hmm, bisschen klobig, aber wie wäre es mit einem "Schlüssel" -Parameter und einem "Werte" -Parameter, beide vom Typ Array [string]? Dann könnten die Leute http: // localhost/MyController/GetFirstValue aufrufen? Key = fruit1 & value = apple & key = fruit2 & value = banana –

+0

Ja, ich könnte auch "? Filter = key1% 3Dvalue1 & filter = key23Dvalue2" haben, aber beide scheinen bei der Abfrage sehr klobig zu sein Saiten sind schon KV-Paare! –