Frage

Ich bin mit Restlet und ich habe eine Ressource erstellt. Ich behandle POST durch acceptRepresentation Methode überschrieben.

Der Kunde soll mir ein paar Daten senden, dann speichere ich es an der DB, setzt Antwort auf 201 (SUCCESS_CREATED) und ich brauche einige Daten an den Client zurück, aber die Rück Art von acceptRepresentation void ist.

In meinem Fall, ich brauche etwas Identifikator zurück, so dass der Client die Ressource zugreifen kann.

Zum Beispiel, wenn ich eine Ressource mit URL /resource hatte und der Client sendet POST-Anforderung I fügen Sie eine neue Zeile in der DB und seine Adresse sollte /resource/{id} werden. Ich brauche {id} zu senden.

Mache ich etwas falsch? Ist REST Prinzipien erlauben etwas nach POST zurückzukehren? Wenn ja, wie kann ich es tun, und wenn nicht, was ist der Weg, um diese Situation zu bewältigen?

War es hilfreich?

Lösung

REST sagt nur, dass Sie auf die einheitliche Schnittstelle entsprechen sollte. Mit anderen Worten sagt es sollte man tun, was POST sollte gemäß der HTTP-Spezifikation . Hier ist das Zitat aus dieser Spezifikation, die relevant ist,

  

Wenn eine Ressource wurde auf dem erstellt   Ursprungs-Server, sollte die Antwort   sein 201 (Erstellt) und enthalten eine Entität   die beschreibt den Status der   fordern und bezieht sich auf den neuen   Ressource und ein Location-Header   (Siehe Abschnitt 14.30).

Wie Sie daraus ersehen können, haben Sie zwei Orte, wo man an den Client angeben können, wo die neu erstellte Ressource befindet. Die Location-Header sollten eine URL, die auf die neue Ressource zeigt und Sie können auch eine Einheit mit den Details zurück.

Ich bin mir nicht sicher, was der Unterschied zwischen zwingender acceptRepresentation () und übergeordneter post () aber dieses Beispiel zeigt, wie eine Antwort von einem POST zurückzukehren.

Andere Tipps

Ich würde verzichten alles im Körper der Antwort zu senden. Lage Nur gesetzt. Auf die (vollständige) URL der neu erstellten Ressource

Ihre Beschreibung deutet darauf hin, dass dies genau die Semantik Sie:

  1. eine Sache per Post an erstellen
  2. mit genug reagieren zwei Dinge zu wissen:
    1. Dass die Schöpfung geschah (die 201)
    2. Wo die neue Sache (die Location-Header)
    3. finden

Alles andere ist überflüssig.

Zwei verschiedene Fragen:

Ist die REST-Anwendung Muster Support-Daten in einem POST-Rückkehr?

Ich glaube nicht, REST verbietet es ausdrücklich, aber die bevorzugte Behandlung in Darrel Antwort buchstabiert.

Hat der Restlet Rahmen erlauben Rückkehr Daten in einer POST?

Ja, auch wenn sie leer zurückkehrt, in einer Klasse, die Ressource erstreckt, haben Sie vollen Zugriff auf das Response-Objekt Objekt über den getResponse () -Methode. So können Sie getResponse () aufrufen. SetEntity () mit dem, was Daten, die Sie wollen.

Ausgabe in was auch immer Format angefordert wird. Das könnte sein:

<success>
    <id>5483</id>
</success>

Oder:

{ "type": "success", "id": 5483 }

Es hängt davon ab, was Sie in der Regel tun. Wenn sie die Daten nicht erwarten, sollten sie ignorieren es einfach, aber jeder Client, der es will, richtig behandeln sollte in der Lage sein.

Wenn Sie 201 mit einem Entitätskörpers Erstellt reagieren, sondern als ein Ort Umleitung, dann ist es eine gute Idee, einen Content-Location-Header enthalten, um die Ressource verweisen, die in der Antwort dargestellt wird.

Das wird ein mögliche Verwirrung vermeiden - bei dem ein Client kann (zu Recht) davon ausgehen, dass die Antworteinheit repräsentiert tatsächlich einen neuen Zustand des ‚Schöpfers‘ und nicht die erstellte Ressource

.
> POST /collection
> ..new item..

< 201 Created
< Location: /collection/1354
< Content-Location: /collection/1354
< <div class="item">This is the new item that was created</div>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top