Ich kämpfe mit der Syntax von swagger, um einen Antworttyp zu beschreiben. Was ich versuche zu modellieren, ist eine Hash-Map mit dynamischen Schlüsseln und Werten. Dies ist erforderlich, um eine Lokalisierung zu ermöglichen. Die Sprachen können variieren, es sollte jedoch immer Englisch angegeben werden.
Die Antwort würde in JSON folgendermaßen aussehen:
{
id: "1234",
name: {
en: "english text",
de: "Deutscher Text"
}
}
Mein erster Versuch sah so aus, aber ich habe keine Ahnung, wie ich den Namen für den Namen schreiben soll. AdditionalProperties scheint ein Schlüssel zu sein, aber ich kann meinen Kopf nicht darum wickeln. Auch die Anforderung an englischen Text ist mir in dieser Syntax ein Rätsel, und das Beispiel scheint auch nicht wie erwartet zu funktionieren. Es erzeugt ein leeres $ fold: in der Benutzeroberfläche.
delayReason:
type: object
properties:
id:
type: string
description: Identifier for a delay reason.
name:
type: object
additionalProperties:
type: string
required: [id, name]
example:
id: 123
name:
en: english text
de: Deutscher Text
Es gibt auch keinen Hinweis darauf, dass das Ergebnis einen Sprachcode als Schlüssel und den Text als Wert der Hash-Map haben wird.
Es scheint, dass Sie mindestens drei verschiedene Fehler und/oder Einschränkungen haben:
Weder der Swagger-Editor noch die Swagger-UI geben im Dokumentationsformat Hinweise darauf, dass additionalProperties
in Ihrem Objektschema zulässig ist. Selbst wenn Sie additionalProperties
korrekt verwendet haben und vom Swagger-Parser erkannt werden, wird dies in diesen Dokumentationsformaten nicht angezeigt. Sie müssen dieses Detail zu Ihrem Schema description
hinzufügen, damit Benutzer verstehen, dass sie zusätzliche Zeichenfolgeeigenschaften hinzufügen können.
Anmerkung: Sie erwarten wahrscheinlich auch, dass die zusätzlichen Eigenschaftsnamen einer Konvention folgen, z. ein aus zwei Buchstaben bestehender Sprachcode. Während Sie für das vollständige JSON-Schema dies mit patternProperties
angeben können, wird dies im Swagger-Schemaobjekt nicht unterstützt. Sie sollten dies also erneut in Ihrer Schemabeschreibung angeben.
Das Swagger-Editor-Format zeigt manchmal diese ungerade "fold:" - Eigenschaft. Ich habe es heute morgen gesehen, seltsamerweise kann ich es nicht reproduzieren. Es könnte heute ein Hotfix sein. Aber egal, es ist sicherlich ein Fehler und spezifisch für Swagger-Editor. Es sollte sich nicht auf die Generierung von Downstream-Code oder die standardmäßige Swagger-UI auswirken, die die API-Dokumentation zur Laufzeit den Client-Entwicklern zur Verfügung stellt. (Obwohl der Dokumentationsbereich im Swagger-Editor der Swagger-UI ähnelt, ist dies eine separate Implementierung.)
Die Verwendung von additionalProperties
in Swagger hat einige subtile, aber erhebliche Einschränkungen. Während Helen s Beispiel keine sichtbaren Fehler zeigt, kann der Swagger-Parser dieses Schema nicht korrekt verarbeiten. Es wird entweder Ihre explizit deklarierte en
-Eigenschaft ignorieren oder additionalProperties
ignorieren!
Diese letzte Ausgabe beruht auf einem Konstruktionsfehler in Swagger-Model, einer der Kernkomponenten des Swagger-Java-Stacks (einschließlich Swagger-Codegen). In bestimmten Kontexten definierte Schemas können mit einer Kombination aus properties
und additionalProperties
arbeiten. In anderen Zusammenhängen definierte Schemas können jedoch nicht.
Wir haben hier ausführlich dokumentiert .
Die gute Nachricht: Mit einem kleinen Tweak können wir Helens Beispiel richtig funktionieren lassen. Wir müssen nur das verschachtelte Objektschema in seine eigene Definition auf oberster Ebene extrahieren. Ich werde es LocalizedName
nennen:
definitions:
delayReason:
type: object
properties:
id:
type: string
description: Identifier for a delay reason.
name:
$ref: "#/definitions/LocalizedName"
required: [id, name]
example:
id: '123' # Note the quotes to force the value as a string
name:
en: English text
de: Deutscher Text
LocalizedName:
type: object
description: A hashmap with language code as a key and the text as the value.
properties:
en:
type: string
description: English text of a delay reason.
required: [en]
additionalProperties:
type: string
Ihre Verwendung von additionalProperties
ist korrekt und Ihr Modell ist korrekt.
In Swagger/OpenAPI werden Hash-Schlüssel als Zeichenfolgen angenommen, sodass der Schlüsseltyp nicht explizit definiert wird. additionalProperties
definiert den Typ der Hashmap-Werte. Also dieses Schema
type: object
additionalProperties:
type: string
definiert eine Zeichenfolge-zu-Zeichenfolge-Zuordnung:
{
"en": "English text",
"de": "Deutscher Text"
}
Wenn Sie eine Zeichenfolge-Ganzzahl-Zuordnung benötigen, z.
{
"en": 5,
"de": 3
}
sie würden additionalProperties
als Werttyp integer
definieren:
type: object
additionalProperties:
type: integer
So definieren Sie en
als erforderlichen Schlüssel in der Hashmap:
type: object
properties:
en:
type: string
required: [en]
additionalProperties:
type: string
definitions:
delayReason:
type: object
properties:
id:
type: string
description: Identifier for a delay reason.
name:
type: object
description: A hashmap with language code as a key and the text as the value.
properties:
en:
type: string
description: English text of a delay reason.
required: [en]
additionalProperties:
type: string
required: [id, name]
example:
id: '123' # Note the quotes to force the value as a string
name:
en: English text
de: Deutscher Text
Es gibt auch keinen Hinweis darauf, dass das Ergebnis einen Sprachcode als Schlüssel und den Text als Wert der Hash-Map haben wird.
Solche Dinge können in der description
verbal dokumentiert werden.
das Beispiel scheint auch nicht wie erwartet zu funktionieren. Es erzeugt ein leeres $ fold: in der Benutzeroberfläche.
Nicht sicher, was das Problem mit Ihrer ursprünglichen Spezifikation war, aber die oben angegebene Spezifikation ist gültig und sieht gut aus im Swagger Editor .
Wenn Sie sich noch in der Entwurfsphase befinden, können Sie anstelle von dynamischen Schlüsseln alle anderen Sprachverweise in einem Array mit der folgenden Struktur pushen:
{
"launguage":"en"
"text":"Hello World"
}
Das würde die Dinge sehr vereinfachen, und da Sie sich nicht auf additionalProperties
verlassen, können Ihre generierten Client-Bibliotheken dies leichter verdauen.