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".