2016-01-26 4 views
31

Es gibt eine Funktion in meinem REST-Webdienst, die mit der GET-Methode arbeitet und zwei optionale Parameter besitzt.So definieren Sie einen optionalen Parameter im Pfad mithilfe von Swagger

ich versuchte, es in Swagger zu definieren, aber ich einen Fehler aufgetreten, keine gültigen Parameter Definition, nachdem ich die required als false eingestellt.

Ich fand heraus, dass, wenn ich den required Wert als true setzen, der Fehler weg sein wird. Hier ist ein Beispiel meines Swagger-Codes.

... 
paths: 
    '/get/{param1}/{param2}': 
    get: 
     ... 
     parameters: 
     - name: param1 
     in: path 
     description: 'description regarding param1' 
     required: false 
     type: string 
     - name: param2 
     in: path 
     description: 'description regarding param2' 
     required: false 
     type: string 

Ich habe dies nicht mit Parametern im Körper oder die in Abfragen erfahren. Ich denke, dieses Problem bezieht sich nur auf Parameter im Pfad. Ich konnte auch keine Lösung in Swagger-Spezifikationsdateien finden.

Gibt es eine andere Möglichkeit, optionale Parameter in Swagger zu definieren oder habe ich einen Fehler in meinem Code?

Jede Hilfe wäre willkommen.

Antwort

28

dass Pfadparameter Da muss entsprechend der OpenAPI/Swagger spec erforderlich sein, können Sie mit den folgenden Pfaden Hinzufügen 2 separate Endpunkte berücksichtigen:

  • /get/{param1}/{param2} (wenn param2 vorgesehen ist)
  • /get/{param1}/(wenn param2 nicht vorgesehen ist)
+1

Bitte beziehen Sie sich auf https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#fixed-fields-7 –

+0

@Hedeshy, wenn dies die richtige Antwort ist, bitte markieren Sie es als richtig. Vielen Dank. –

+0

Ich warte eigentlich auf eine bessere Antwort, weil du auf diese Weise alles wiederholen musst. Jedoch scheint dies die einzige Option für jetzt zu sein. – Hedeshy

17

Es wird wahrscheinlich in die Luft gehen, weil Sie nicht einen Basis-URI-Parameter optional haben können, nur Abfrage String-Werte (im Falle einer URL).

Zum Beispiel:

  • GET/products/{id}/Preis foo = bar
  • ** Wenn foo ist optional dann IN-Parameter sein "Abfrage" nicht "Pfad" muss
  • ** Wenn {id} optional ist, stimmt etwas nicht. {id} kann nicht optional sein, da es in der Basis-URI enthalten ist.

sollte diese Arbeit:

{ 
"in":"query", 
"required":false 
} 

Diese nicht

{ 
"in":"path", 
"required":false 
} 

Änderung Ihrer "in" Eigenschaft zu sein "Abfrage" anstelle von "Pfad" funktionieren sollte und es sollte funktionieren.

+0

Danke @Jerrod für Ihre Antwort, aber ich fürchte, es das Problem nicht lösen. Der Kunde wollte die Parameter im Pfad haben, ich kann sie nicht in die Abfrage einfügen, nur weil es nicht möglich ist, die Dokumentation ordnungsgemäß zu erstellen. – Hedeshy

+1

Leider glaube ich nicht, dass Sie einen optionalen Parameter im "Pfad" haben können. Es ist keine Swagger-Sache, sondern wie das URL-Schema funktioniert. Wenn Sie GET/products/{id} haben und sagen, dass {id} optional ist, haben Sie die URL, auf die die Ressource abzielt, vollständig geändert (d. H. Jetzt GET/products). Vielleicht könnten Sie das zurücknehmen und sie fragen, warum sie einen optionalen Parameter in der Basis-URI möchten. Ich arbeite viel mit REST-APIs und das klingt nach einem Fall, in dem die Anfrage/Ressource möglicherweise etwas mehr durchdacht werden muss, um das Problem zu lösen. Viel Glück! –

+0

Funktioniert die Abfrage, wenn ich folgende Endpunkte habe: /resource? Querystring und/resource/{id}? Kann {id} von Abfrageparametern unterschieden werden? – Gobliins

3

Ihre YAML schlägt fehl, weil, wie es auf der Spezifikation angegeben:

Bestimmt, ob dieser Parameter obligatorisch ist. Wenn sich der Parameter in "path" befindet, ist diese Eigenschaft erforderlich und ihr Wert muss TRUE sein.

Quelle: http://swagger.io/specification/#parameterObject (Look in festen Feldern Tabelle)