Ich verwende RESTlet und habe eine Ressource erstellt. Ich behandle POST durch Überschreiben der acceptRepresentation
Methode.
Der Client sollte mir einige Daten senden, dann speichere ich sie in der Datenbank, setze die Antwort auf 201 (SUCCESS_CREATED) und muss einige Daten an den Client zurückgeben, aber der Rückgabetyp acceptRepresentation
ist void
.
In meinem Fall muss ich einen Bezeichner zurückgeben, damit der Client auf diese Ressource zugreifen kann.
Wenn ich beispielsweise eine Ressource mit URL hatte /resource
und der Client eine POST-Anfrage sendet, füge ich eine neue Zeile in die Datenbank ein und deren Adresse sollte lauten /resource/{id}
. Ich muss senden {id}
.
Mache ich etwas falsch? Können nach den REST-Prinzipien nach dem POST etwas zurückgegeben werden? Wenn ja, wie kann ich das machen und wenn nein, wie gehe ich mit dieser Situation um?
Antworten:
REST sagt nur, dass Sie sich an die einheitliche Schnittstelle anpassen sollten. Mit anderen Worten, es heißt, Sie sollten das tun, was POST gemäß der HTTP-Spezifikation tun soll . Hier ist das Zitat aus dieser Spezifikation, das relevant ist:
Wie Sie sehen können, haben Sie zwei Stellen, an denen Sie dem Client angeben können, wo sich die neu erstellte Ressource befindet. Der Standortheader sollte eine URL enthalten, die auf die neue Ressource verweist, und Sie können auch eine Entität mit den Details zurückgeben.
Ich bin nicht sicher, was der Unterschied zwischen dem Überschreiben von acceptRepresentation () und dem Überschreiben von post () ist, aber dieses Beispiel zeigt, wie eine Antwort von einem POST zurückgegeben wird.
quelle
Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
Ich würde darauf verzichten, irgendetwas im Text der Antwort zu senden. Setzen Sie einfach Location: auf die (vollständige) URL der neu erstellten Ressource.
Ihre Beschreibung legt nahe, dass dies genau die Semantik ist, die Sie:
Alles andere ist überflüssig.
quelle
Zwei verschiedene Fragen:
Unterstützt das REST-Anwendungsmuster die Rückgabe von Daten in einem POST?
Ich glaube nicht, dass REST dies ausdrücklich verbietet, aber die bevorzugte Behandlung ist in Darrels Antwort dargelegt.
Ermöglicht das RESTlet-Framework die Rückgabe von Daten in einem POST?
Ja, obwohl es void zurückgibt, haben Sie in einer Klasse, die Resource erweitert, über die Methode getResponse () vollen Zugriff auf das Objekt Object Response. Sie können also getResponse (). SetEntity () mit beliebigen Daten aufrufen.
quelle
Geben Sie es in dem gewünschten Format aus. Das könnte sein:
Oder:
Es hängt davon ab, was Sie normalerweise tun. Wenn sie die Daten nicht erwarten, sollten sie sie einfach ignorieren, aber jeder Client, der sie richtig verarbeiten möchte, sollte dies können.
quelle
Wenn Sie antworten 201 Erstellt mit einem Entitätskörper anstelle einer Standortumleitung, ist es eine gute Idee, einen Content-Location-Header einzufügen, der auf die Ressource verweist, die in der Antwort dargestellt wird.
Dies vermeidet mögliche Verwirrung - bei der ein Client (zu Recht) annehmen könnte, dass die Antwortentität tatsächlich einen neuen Status des "Erstellers" und nicht der erstellten Ressource darstellt.
quelle