In meiner "vereinfachten" API werden alle Antworten von einer Basisklasse "Antwort" abgeleitet ( geerbt ). Die Antwortklasse besteht aus einem mit Metadaten gefüllten Header und dem Textkörper, der die vom Benutzer angeforderten Kerndaten enthält. Die Antwort (in JSON) ist so angelegt, dass sich alle Metadaten auf der ersten "Ebene" befinden und der Körper ein einzelnes Attribut ist, das als solcher "Körper" bezeichnet wird
response
|--metadata attribute 1 (string/int/object)
|--metadata attribute 2 (string/int/object)
|--body (object)
|--body attribute 1 (string/int/object)
|--body attribute 2 (string/int/object)
Ich habe versucht, diese Beziehung in Prahlerei mit dem folgenden JSON zu definieren:
{
...
"definitions": {
"response": {
"allOf": [
{
"$ref": "#/definitions/response_header"
},
{
"properties": {
"body": {
"description": "The body of the response (not metadata)",
"schema": {
"$ref": "#/definitions/response_body"
}
}
}
}
]
},
"response_header": {
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "string",
"description": "value of 'success', for a successful response, or 'error' if there is an error",
"enum": [
"error",
"success"
]
},
"message": {
"type": "string",
"description": "A suitable error message if something went wrong."
}
}
},
"response_body": {
"type": "object"
}
}
}
Ich versuche dann, verschiedene Antworten zu erstellen, indem ich die verschiedenen Body- / Header-Klassen erstelle, die von Body / Header erben, und dann untergeordnete Antwortklassen erstelle, die aus den relevanten Header- / Body-Klassen bestehen (siehe Quellcode unten). Ich bin mir jedoch sicher, dass dies entweder die falsche Vorgehensweise ist oder dass meine Implementierung falsch ist. Ich konnte kein Beispiel für die Vererbung in der Swagger 2.0-Spezifikation (siehe unten) finden, habe aber ein Beispiel für die Zusammensetzung gefunden .
Ich bin mir ziemlich sicher, dass dieser "Diskriminator" eine große Rolle spielt, bin mir aber nicht sicher, was ich tun muss.
Frage
Könnte mir jemand zeigen, wie man Komposition + Vererbung in Swagger 2.0 (JSON) implementieren soll, vorzugsweise indem er meinen Beispielcode unten "repariert". Es wäre auch großartig, wenn ich eine ErrorResponse-Klasse angeben könnte, die von einer Antwort erbt, bei der das Attribut "result" im Header immer auf "error" gesetzt ist.
{
"swagger": "2.0",
"info": {
"title": "Test API",
"description": "Request data from the system.",
"version": "1.0.0"
},
"host": "xxx.xxx.com",
"schemes": [
"https"
],
"basePath": "/",
"produces": [
"application/json"
],
"paths": {
"/request_filename": {
"post": {
"summary": "Request Filename",
"description": "Generates an appropriate filename for a given data request.",
"responses": {
"200": {
"description": "A JSON response with the generated filename",
"schema": {
"$ref": "#/definitions/filename_response"
}
}
}
}
}
},
"definitions": {
"response": {
"allOf": [
{
"$ref": "#/definitions/response_header"
},
{
"properties": {
"body": {
"description": "The body of the response (not metadata)",
"schema": {
"$ref": "#/definitions/response_body"
}
}
}
}
]
},
"response_header": {
"type": "object",
"required": [
"result"
],
"properties": {
"result": {
"type": "string",
"description": "value of 'success', for a successful response, or 'error' if there is an error",
"enum": [
"error",
"success"
]
},
"message": {
"type": "string",
"description": "A suitable error message if something went wrong."
}
}
},
"response_body": {
"type": "object"
},
"filename_response": {
"extends": "response",
"allOf": [
{
"$ref": "#definitions/response_header"
},
{
"properties": {
"body": {
"schema": {
"$ref": "#definitions/filename_response_body"
}
}
}
}
]
},
"filename_response_body": {
"extends": "#/definitions/response_body",
"properties": {
"filename": {
"type": "string",
"description": "The automatically generated filename"
}
}
}
}
}
Diagrammaktualisierung
Um zu klären, was ich will, habe ich das folgende grundlegende Diagramm erstellt, das zeigen soll, dass alle Antworten Instanziierungen des "Antwort" -Objekts sind, die von (Komposition) unter Verwendung einer beliebigen Kombination von response_header- und response_body-Objekten erstellt wurden. Die Objekte response_header und response_body können erweitert und in jedes Antwortobjekt eingefügt werden. Dies erfolgt im Fall einer Dateinamenantwort, die das untergeordnete Element filename_response_body der Basisklasse response_body verwendet. Sowohl fehlerhafte als auch erfolgreiche Antworten verwenden das Objekt "response".
I have the properties of X and my own properties.
. Vererbung deutet auf eine Beziehung hinX is my parent. I have its properties and my own.
. Vererbung ist nützlich, wenn Sie sagen möchten, dass ein bestimmter Satz von Modellen für das verwendete übergeordnete Modell gilt.Antworten:
Als Anfänger in der Prahlerei finde ich die offizielle Dokumentation über Polimorphismus und Komposition nicht leicht zu verstehen, weil es kein Beispiel gibt . Als ich im Internet gesucht habe, gibt es viele gute Beispiele für Swagger 1.2, als
extends
es gültig war.Für Swagger 2.0 habe ich über diese Google-Gruppe ein gutes Beispiel in Swagger-Spezifikationsquellen auf Github gefunden
Basierend auf den oben genannten Quellen finden Sie hier ein kurzes gültiges Vererbungsbeispiel in YAML:
quelle
editor.swagger.io
sehe ich einen kleinen Fehler: ImPet
Modellbereich sehe ich das Modell mehrmals. Der Inhalt dieser Modelle ist in Ordnung. Nur die Namen sind falsch.editor2.swagger.io
Sie werden dieses Problem nicht sehenIch habe festgestellt, dass die Komposition auch ohne Definition von gut funktioniert
discriminator
.Zum Beispiel base
Response
:Wird gerendert als:
Und wir können es erweitern, um das benutzerdefinierte
result
Feldschema zu verfeinern :Und es wird korrekt gerendert als:
Beachten Sie, dass dies
allOf
ausreicht, damit dies funktioniert und keindiscriminator
Feld verwendet wird. Das ist gut, weil es funktioniert und dies wichtig ist, da Tools meiner Meinung nach Code ohnediscriminator
Feld generieren können .quelle
Alle Antworten hier sind bereits ausgezeichnet, aber ich möchte nur eine kleine Anmerkung zu Komposition und Vererbung hinzufügen . Laut der Swagger / OpenAPI-Spezifikation reicht es aus, die Eigenschaft zu verwenden , um die Komposition zu implementieren
allOf
, wie @oblalex richtig hervorhebt . Um jedoch zu implementieren Vererbung , müssen Sie verwendenallOf
mitdiscriminator
, wie im Beispiel von @ TomaszSętkowski .Außerdem habe ich bei API Handyman einige weitere Swagger-Beispiele für Zusammensetzung und Vererbung gefunden . Sie sind Teil einer exzellenten Swagger / OpenAPI-Tutorialserie von Arnaud Lauret, die meiner Meinung nach jeder ausprobieren sollte.
quelle
Das von Ihnen freigegebene Swagger 2.0-Standardbeispiel zeigt eine Kompositionsbeziehung, insbesondere erfasst es eine "ist eine Art" Supertyp / Subtyp-Beziehung, ist jedoch kein Polymorphismus an und für sich.
Wenn Sie auf die Basisdefinition von Pet als Eingabeparameter verweisen könnten, wählen Sie Cat aus oder geben Sie ein Cat-JSON-Objekt als Wert für die Eingabeanforderung ein und lassen Sie dies für die Swagger-Benutzeroberfläche akzeptabel sein.
Ich konnte das nicht direkt zum Laufen bringen.
Das Beste, was ich zum Arbeiten bringen konnte, war, zusätzliche Eigenschaften für das Basisobjekt (z. B. Pet) auf true zu setzen, Pet mithilfe der JSON-Zeigerreferenz als Eingabeschema anzugeben und schließlich mein Cat JSON-Wertobjekt zu kopieren und in die Swagger-Benutzeroberfläche einzufügen. Da die zusätzlichen Eigenschaften zulässig sind, hat die Swagger-Benutzeroberfläche eine gültige Eingabeanforderungsnutzlast generiert.
quelle