Aikido

Wie man den Bruch öffentlicher API-Verträge vermeidet: Aufrechterhaltung der Abwärtskompatibilität

Instandhaltbarkeit

Regel

Vermeiden Sie zu brechen. öffentlich API Verträge.
Änderungen an öffentlichen API Endpunkten die würde brechen
bestehende Kunden Anfragen sind brechen Änderungen.
Denken Sie an an die API Vertrag als a Versprechen - ändern
es nach Kunden abhängen auf es bricht ihre Code.

Unterstützte Sprachen: PHP, Java, C#, Python, JavaScript, TypeScript

Einführung

Öffentliche APIs sind Verträge zwischen Ihrem Dienst und seinen Nutzern. Wenn Clients vom Anfrageformat, der Antwortstruktur oder dem Verhalten eines Endpunkts abhängig sind, führt eine Änderung zu einem Bruch in ihrem Code. Diese Änderungen zwingen alle Clients zur gleichzeitigen Aktualisierung, was oft unmöglich ist, wenn Sie die Clients nicht kontrollieren. Mobile Anwendungen können nicht zwangsaktualisiert werden, Integrationen von Drittanbietern benötigen Zeit für die Migration, und ältere Systeme werden möglicherweise nie aktualisiert.

Warum das wichtig ist

Störung der Kunden und Vertrauen: Brüchige API-Änderungen führen zu sofortigen Ausfällen bei Client-Anwendungen in der Produktion. Die Benutzer erleben Fehler, Datenverluste oder komplette Serviceausfälle. Dies schadet dem Vertrauen zwischen API-Anbietern und Kunden und verletzt den impliziten Vertrag, dass stabile APIs stabil bleiben.

Koordinierungskosten: Die Koordinierung von Änderungen zwischen mehreren Kundenteams ist teuer und langsam. Jedes Team braucht Zeit, um den Code zu aktualisieren, Änderungen zu testen und bereitzustellen. Bei öffentlichen APIs mit unbekannten Kunden (mobile Anwendungen, Integrationen von Drittanbietern) ist eine Koordinierung unmöglich.

Wucherung der Versionen: Schlecht verwaltete Änderungen führen zur gleichzeitigen Pflege mehrerer API-Versionen. Jede Version erfordert separate Codepfade, Tests, Dokumentationen und Fehlerkorrekturen, wodurch sich der Wartungsaufwand exponentiell vervielfacht.

Code-Beispiele

❌ Nicht konform:

// Version 1: Original API
app.get('/api/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({ id: user.id, name: user.name });
});

// Version 2: Breaking change - renamed field
app.get('/api/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({
        id: user.id,
        fullName: user.name  // Breaking: 'name' renamed to 'fullName'
    });
});

Warum das falsch ist: Die Umbenennung von name in fullName unterbricht alle bestehenden Clients, die das Feld name erwarten. Client-Code, der auf response.name zugreift, erhält undefinierte Werte, was zu Fehlern führt. Diese Änderung zwingt alle Clients zur gleichzeitigen Aktualisierung oder zum Fehlschlag.

✅ Konform:

// Version 2: Additive change - keeps old field, adds new
app.get('/api/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({
        id: user.id,
        name: user.name,           // Keep for backward compatibility
        fullName: user.name        // Add new field (deprecated 'name')
    });
});

// Or use API versioning
app.get('/api/v2/users/:id', async (req, res) => {
    const user = await db.users.findById(req.params.id);
    res.json({ id: user.id, fullName: user.name });
});

Warum das wichtig ist: Beibehaltung der alten Name behält die Abwärtskompatibilität bei und fügt gleichzeitig vollständiger Name für neue Kunden. Alternativ dazu kann ein neuer versionierter Endpunkt (/api/v2/) erlaubt es, Änderungen vorzunehmen, ohne dass bestehende Clients, die noch /api/v1/.

Schlussfolgerung

Entwickeln Sie APIs durch additive Änderungen weiter: Fügen Sie neue Felder, neue Endpunkte und optionale Parameter hinzu. Wenn einschneidende Änderungen unvermeidlich sind, verwenden Sie die API-Versionierung, um alte und neue Versionen gleichzeitig auszuführen. Veralten Sie alte Felder mit klaren Zeitplänen und Migrationsleitfäden, bevor Sie sie entfernen.

FAQs

Haben Sie Fragen?

Welche Änderungen werden als bahnbrechend angesehen?

Das Entfernen von Feldern aus Antworten, das Umbenennen von Feldern, das Ändern von Feldtypen (Zeichenfolge in Zahl), das Erfordernis optionaler Parameter, das Ändern von HTTP-Statuscodes für bestehende Bedingungen, das Ändern von Authentifizierungsanforderungen und das Ändern von Fehlerantwortformaten. Das Hinzufügen neuer erforderlicher Anforderungsparameter oder das vollständige Entfernen von Endpunkten sind ebenfalls einschneidende Änderungen.

Wie füge ich neue Pflichtfelder hinzu, ohne Kunden zu verlieren?

Machen Sie das neue Feld zunächst optional mit einer sinnvollen Voreinstellung. Dokumentieren Sie die Änderung und geben Sie den Kunden Zeit, sie zu übernehmen. Nach ausreichender Zeit (6-12 Monate für öffentliche APIs) machen Sie das Feld in einer neuen API-Version obligatorisch. Machen Sie vorhandene optionale Felder niemals ohne Versionierung erforderlich.

Was ist der Unterschied zwischen API-Versionierung und Veraltung?

Bei der Versionierung wird ein neuer Endpunkt (/v2/users) neben dem alten erstellt, so dass beide nebeneinander bestehen können. Deprecation kennzeichnet einen alten Endpunkt oder ein altes Feld als veraltet, wobei die Funktion erhalten bleibt und ein Zeitplan für die endgültige Entfernung festgelegt wird. Verwenden Sie Versioning für größere Änderungen, Deprecation für die schrittweise Abschaffung kleinerer Funktionen.

Wie lange sollte ich veraltete API-Versionen beibehalten?

Bei öffentlichen APIs sollten Sie veraltete Versionen mindestens 12-18 Monate lang beibehalten. Bei internen APIs stimmen Sie sich mit den Kundenteams ab, um einen Zeitplan für die Migration zu erstellen. Kündigen Sie immer im Voraus (mindestens 3-6 Monate), bevor Sie veraltete Endpunkte entfernen. Überwachen Sie die Nutzungsmetriken, um sicherzustellen, dass die Kunden vor der Abschaltung migriert haben.

Kann ich die Reihenfolge der Antwortfelder ändern?

Ja, die Reihenfolge der JSON-Objektfelder ist nicht Teil des API-Vertrags. Gut geschriebene Clients parsen JSON nach Feldnamen, nicht nach Position. Testen Sie jedoch gründlich, da einige schlecht geschriebene Clients von der Feldreihenfolge abhängen können. Bei Arrays ist die Reihenfolge in der Regel wichtig und sollte nicht geändert werden, es sei denn, dies ist dokumentiert.

Wie kann ich APIs ohne Änderung des URL-Pfads versionieren?

Verwenden Sie HTTP-Header: Accept: application/vnd.myapi.v2+json oder benutzerdefinierte Kopfzeilen wie API-Version: 2. Abfrageparameter funktionieren ebenfalls: /api/users?version=2. Die Aushandlung von Inhalten über Header ist sauberer, aber in Browsern schwieriger zu testen. Entscheiden Sie sich für eine Strategie und verwenden Sie diese konsequent.

Starten Sie kostenlos

Sichern Sie Ihren Code, Cloud und die Laufzeit in einem zentralen System.
Finden und beheben Sie Schwachstellen schnell  automatisch.

Keine Kreditkarte erforderlich | Scanergebnisse in 32 Sekunden.