6

Ich habe alle Ansätze zu Version REST APIs gelesen. In fast allen Implementierungen sind Controller und Ansichten versioniert, Modelle dagegen nicht.REST-API-Versionierung - Warum sind keine Modelle versioniert

# app/controllers/api/v1/events_controller.rb 
class Api::V1::EventsController < Api::ApiController 

end 

entsprechende Ansichten wie auch bei verschiedenen versioniert Verzeichnisse setzen in:

die Schienen Beispiel zu geben, sind Steuerungen wie organisiert. Warum haben wir keine Versionsmodelle? Liegt es daran, dass wir erwarten, dass sich unser Modell (das zugrunde liegende Datenbankschema) nicht ändert, wenn sich die API entwickelt? Was passiert, wenn ich einen Spaltennamen in der Datenbank umbenenne und dafür ein neues Modell benötige?

Antwort

10

Modelle sind Teil der Interna einer Anwendung, nicht ihre öffentliche API. Bei der Versionierung ist der Schlüssel, dass der Ein-/Ausgang nicht abweicht.

Verschiedene versionierte Daten in der Datenbank pflegen - zB Daten, die zu verschiedenen Versionen einer API gehören, sind nicht besonders ansprechend oder praktisch.

Stattdessen würden Sie Adapter/Serializer verwenden, um die Eingabe/Ausgabe an eine bestimmte Version Ihrer API anzupassen, während die Interna mit der aktuellen Version ausgeführt werden.

Lassen Sie sagen eine API v 1 in Eile veröffentlicht haben: Sie erkennen

GET api/v1/users/:id 
    username (String) 
    first_name (String) 
    lastname (String) 

Nach der Veröffentlichung, dass die Benennung unvereinbar ist. Sie würden also eine Migration erstellen, die lastname in last_name umbenennt.

So API-Version 2 würde die folgende Signatur haben:

GET api/v2/users/:id 
    username (String) 
    first_name (String) 
    last_name (String) 

Aber dies einen Test für die API v 1 brechen sollte, da die Reaktion nicht mehr lastname enthält.

Also, es zu beheben würden wir schaffen so etwas wie:

Api::V1::UserSerializer < ActiveModel::Serializer 
    attributes :username, :first_name, :lastname 

    def lastname 
    object.last_name 
    end 
end 
3

Warum nicht wir Version Modelle?

Modelle sind in der Regel eng mit dem Datenbankschema abgestimmt. In der Regel ist die Datenbank ein kanonischer Datenspeicher, der von allen API-Versionen gemeinsam genutzt wird. Daher ist es nicht sinnvoll, die Modelle zu versionieren.

Darüber hinaus befindet sich in Rails-Anwendungen oft der Großteil der Geschäftslogik in den Modellen. Versionierungsmodelle erfordern entweder das Replizieren der Logik oder das Hinzufügen einer anderen Abstraktionsschicht, wodurch Wartungsaufwand entsteht.

Ist es, weil wir unser Modell (bereinigtes Datenbankschema) nicht zu ändern, da die API entwickelt erwarten?

Nein Datenbankschema kann und ändert sich sehr oft.

Was passiert, wenn ich einen Spaltennamen in der Datenbank und brauchen ein neues Modell für das zur Rechenschaft umbenennen?

Sie führen kein Modell ein, um Schemaänderungen zu berücksichtigen. Sie passen das vorhandene Modell an die Änderungen an und ändern dann die Implementierungen früherer APIs, sodass die Clients der vorherigen Version weiterhin die Antwort in demselben Format erhalten, wie sie zuvor erwartet wurden.

Da diese Zuordnung Ihrer Geschäftsentitäten (Modelle) zu API-Antworten in Controllern (oder Serializern oder JSON-Templates - abhängig von Ihrer bevorzugten Implementierung) erfolgt, müssen diese Teile Ihrer Anwendung geändert werden, um eine Rückwärtsverarbeitung zu gewährleisten Kompatibilität.