Ich schreibe ein YAML-Dokument mithilfe von Swagger, um eine RESTful-API-Methode zum Klonen einer Ressource zu entwerfen. Ich habe ein paar Optionen und weiß nicht, welches das Beste wäre. Kann bitte jemand beraten?REST-API-Design zum Klonen einer Ressource
Optionen:
- Verzicht auf die Verantwortung gegenüber dem Verbraucher das Ressourcenobjekt des Klonens (wo die Verbraucher Werte Eigenschaften auf ein neues Objekt zuweist und erstellt dann ein neues Objekt), müsste der Prozess bestehen aus zwei Anforderungen an die API: ein GET für eine Ressource für das Quellobjekt und dann ein POST für diese Ressource zum Erstellen der neuen. Das fühlt sich an, als hätte der Verbraucher zu viel Verantwortung.
- Verwenden der WebDAV-HTTP-Erweiterungen, die eine COPY-Methode (see here) bereitstellt. Es scheint, dass dies genau das ist, was ich zum Klonen möchte. Aber ich möchte so viel wie möglich
- POSTen zu/{} Ressource den Standardmethoden bleiben? ResourceIdToClone = {id} wo resourceIdToClone einen optionalen Parameter ist. Dies würde zu einem API-Pfad führen, den ich bereits zum Erstellen der Ressource habe, wo ich dem POST-Hauptteil ein Schema hinzufüge. Es würde bedeuten, einen POST nach/{resource}/zum Erstellen und Klonen zu verwenden, was SRP verletzen würde.
- Hinzufügen einer neuen Ressource namens 'CloneableResource' und Ausführen eines POST an/CloneableResource/{resource_type}/{resource_source_id}. Für das Beispiel des Klonens eines Schafs würden Sie einen POST an/CloneableResource/Sheep/10 vornehmen. Auf diese Weise wäre es möglich, bei der Verwendung der Standard-HTTP-Methoden zu bleiben, da es keinen Konflikt mit anderen Ressourcenpfaden (oder SRP-Verletzung) geben würde. Allerdings würde ich der Domain einen neuen und potenziell überflüssigen Typ hinzufügen. Ich kann auch nicht an ein Szenario denken, wenn ein Verbraucher etwas anderes als ein POST zu dieser Ressource durchführen möchte, so scheint es wie ein Code-Geruch für mich.
- Ein GET gegen/Ressource/{ID}? Methode = Klon. Einer der Vorteile hier ist, dass keine zusätzliche Ressource erforderlich ist und durch einen einfachen optionalen Querystring-Parameter bestimmt werden kann. Ich bin mir bewusst, dass eines der Risiken hier darin besteht, dass es gefährlich sein kann, Post- oder Löschfunktionen mit einer GET-Methode bereitzustellen, wenn sich die URL auf einer Webseite befindet, da sie von einer Suchmaschine gecrawlt werden kann.
Danke für jede Hilfe!
Vielen Dank für Ihre Antwort Julian. Dies ist eine bequeme Option, und es gibt keinen Zweifel darüber, was die Methode dem Verbraucher ermöglicht. Ich glaube jedoch, dass das Einhalten der Standard-HTTP-Methoden der beste Weg für den nächsten Schritt ist, da dies meine API vereinfachen und ein Szenario vermeiden würde, in dem dasselbe Ergebnis auf zwei verschiedene Arten erzielt werden kann (Klonen einer Ressource entweder mit COPY oder macht einen GET gegen eine Ressource und dann einen POST). Ich würde es vorziehen, den Verbraucher auf nur eine einzige, konsistente Methode zu beschränken, einen Ressourcenklon über meine API zu erreichen. –