Zum Inhalt springen

OpenAPI vergleichen

OpenAPI Diff

Vergleicht zwei OpenAPI-Dokumente und trennt Breaking Changes von additiven Änderungen.

Vergleicht zwei Versionen eines OpenAPI-Dokuments und teilt die Änderungen in brechende und ergänzende. Die verwendete Regel steht auf der Seite: Eine Änderung ist brechend, wenn eine Anfrage, die das alte Dokument akzeptiert hat, jetzt abgelehnt werden könnte, oder eine Antwort, die es versprochen hat, eine ist, mit der ein bestehender Client nicht mehr umgehen kann.

🔒 Läuft vollständig in Ihrem Browseropenapidiffapibreaking-change

Vorheriges Dokument

Die vorherige Version hier ablegen

Wird nur in diesem Tab gelesen.

Neues Dokument

Die neue Version hier ablegen

Wird nur in diesem Tab gelesen.

Brechend

8

Additiv

7

Urteil

Braucht eine Major-Version

Ansicht

GET /pets

  • brechendJetzt ist der `in: query`-Parameter `limit` erforderlich.
  • hinzugefügtEin optionaler `in: query`-Parameter `sort` wurde hinzugefügt.
  • geändertDie Zusammenfassung oder die Beschreibung hat sich geändert.

GET /pets · responses["200"].content["application/json"]

  • brechend`[].id` hat den Typ von integer auf string geändert.
  • brechendDie Eigenschaft `[].name` ist jetzt optional.
  • brechend`[].status` hat den enum-Wert "pending" dazubekommen.
  • hinzugefügtEine optionale Eigenschaft `[].owner` wurde hinzugefügt.

GET /pets/{petId} · responses["200"].content["application/json"]

  • brechend`id` hat den Typ von integer auf string geändert.
  • brechendDie Eigenschaft `name` ist jetzt optional.
  • brechend`status` hat den enum-Wert "pending" dazubekommen.
  • hinzugefügtEine optionale Eigenschaft `owner` wurde hinzugefügt.

GET /pets/{petId}

  • brechendDie `404`-Antwort ist verschwunden.

DELETE /pets/{petId}

  • hinzugefügtDie Operation wurde hinzugefügt.

components.schemas.Owner

  • hinzugefügtDas Schema wurde hinzugefügt.

info.version

  • geändert`1.0.0` → `2.0.0`

Was als brechend gilt

In einem Satz: eine Anfrage, die das vorherige Dokument angenommen hat, könnte jetzt abgelehnt werden, oder eine Antwort, die es versprochen hat, ist eine, die ein bestehender Client nicht mehr verarbeiten kann. Also: einen Pfad, eine Operation, einen Antwortcode, einen Medientyp oder eine Antworteigenschaft entfernen; einen erforderlichen Parameter oder eine erforderliche Anfrageeigenschaft hinzufügen; optional wird erforderlich; eine Typänderung; einen Wert aus einem Anfrage-Enum entfernen; einen Wert zu einem Antwort-Enum hinzufügen (der switch des Clients hat keinen case dafür); und eine Antworteigenschaft, die von erforderlich zu optional wird. Die Gegenrichtungen sowie Änderungen an Beschreibungen, Tags, operationId und deprecated-Markierungen sind kompatibel.

  • · Schemas werden verglichen, nachdem den $ref innerhalb des Dokuments gefolgt wurde, deshalb ist das Umbenennen einer Komponente keine Änderung. Pfadparameter werden nach Position und nicht nach Namen zugeordnet.
  • · Das Innere von oneOf·anyOf·not wird als Ganzes verglichen und bei Unterschieden als brechend gemeldet — darüber wird hier nicht nachgedacht.
  • · Einem $ref, der auf eine andere Datei zeigt, wird nicht gefolgt. Bündeln Sie die Dateien zuerst zu einer.

Um ein einzelnes Dokument zu prüfen, nehmen Sie OpenAPI-Prüfung.

So funktioniert es

  1. Stellen Sie das alte und das neue Dokument nebeneinander

    JSON oder YAML für beide. Beide werden in diesem Tab geparst, sodass eine unveröffentlichte Spezifikation Ihre Maschine nicht verlässt.

  2. Lesen Sie das Urteil

    Zahl der brechenden, Zahl der ergänzenden Änderungen und was das für die Versionsnummer bedeutet: ein Major-Sprung, ein Minor-Sprung oder gar nichts, weil der Vertrag unverändert ist.

  3. Filtern Sie auf die brechenden und lesen Sie sie

    Gruppiert nach Operation, jede mit dem, was sich geändert hat. Die Markdown-Kopie ist für eine Pull-Request-Beschreibung geformt.

Häufige Fragen

Warum ist das Hinzufügen eines Enum-Werts in einer Antwort brechend?

Weil ein bestehender Client ein switch ohne Fall dafür hat. Etwas zu einem *Anfrage*-Enum hinzuzufügen ist sicher – der Server akzeptiert mehr als zuvor; etwas zu einem Antwort-Enum hinzuzufügen schickt Clients etwas, von dem ihnen nie erzählt wurde. Die Richtung ist es, was entscheidet.

Ich habe eine Komponente umbenannt, und es meldet keine Änderung.

Richtig. Schemas werden nach dem Auflösen von `$ref` verglichen, sodass eine umbenannte Komponente mit derselben Form derselbe Vertrag ist. Namen in `components` sind intern; Clients sehen die aufgelöste Form.

Ist es wirklich brechend, wenn eine erforderliche Antwort-Property optional wird?

Ja, aus Sicht des Clients. Ihm wurde versprochen, dass das Feld immer da ist, und sein Code liest es bedingungslos; es optional zu machen heißt, der Server darf es jetzt weglassen. Erforderlich und optional tauschen zwischen Anfrage und Antwort die Richtung, und das ist der Teil, den man verkehrt herum im Kopf hat.

Wie geht es mit `oneOf` und `anyOf` um?

Sie werden als Ganzes verglichen und als brechend gemeldet, wenn sie sich überhaupt unterscheiden. Zu entscheiden, ob eine Union eine Obermenge einer anderen ist, ist ein Entscheidungsverfahren, das hier absichtlich nicht versucht wird; ein falsches „brechend“, das Sie abtun können, ist besser als ein falsches „sicher“, das Sie nicht abtun können.

Eingabe aus

Danach

Diese Tools nehmen an, was dieses hier erzeugt, das Ergebnis kann also direkt weiter.