Die Idee ist, dass der Antworttext Ihnen eine Seite gibt, die Sie mit der Sache verknüpft:
201 Erstellt
Der Statuscode 201 (Erstellt) zeigt an, dass die Anforderung erfüllt wurde und eine oder mehrere neue Ressourcen erstellt wurden. Die durch die Anforderung erstellte primäre Ressource wird entweder durch ein Standortheaderfeld in der Antwort oder, falls kein Standortfeld empfangen wird, durch den effektiven Anforderungs-URI identifiziert.
Dies bedeutet, dass Sie ein Location
in den Antwortheader aufnehmen würden , das die URL angibt, unter der Sie das neu erstellte Objekt finden können :
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Antwortkörper
Sie gehen dann zu erwähnen , was Sie in der Antwort enthalten sollte Körper :
Die 201-Antwortnutzdaten beschreiben und verknüpfen normalerweise die erstellten Ressourcen.
Für den Menschen, der den Browser verwendet, geben Sie ihm etwas, das er anzeigen und anklicken kann, um zu seiner neu erstellten Ressource zu gelangen:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: text/html
Your answer has been saved!
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
Wenn die Seite nur von einem Roboter verwendet wird, ist es sinnvoll, dass die Antwort computerlesbar ist:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/xml
<createdResources>
<questionID>1860645</questionID>
<answerID>36373586</answerID>
<primary>/a/36373586/12597</primary>
<additional>
<resource>http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586</resource>
<resource>http://stackoverflow.com/a/1962757/12597</resource>
</additional>
</createdResource>
Oder wenn Sie es vorziehen:
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/json
{
"questionID": 1860645,
"answerID": 36373586,
"primary": "/a/36373586/12597",
"additional": [
"http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586",
"http://stackoverflow.com/a/36373586/12597"
]
}
Die Antwort liegt ganz bei Ihnen; Es ist willkürlich, was Sie möchten.
Cache freundlich
Schließlich gibt es die Optimierung, dass ich die erstellte Ressource vorab zwischenspeichern kann (weil ich den Inhalt bereits habe; ich habe ihn gerade hochgeladen). Der Server kann ein Datum oder ein ETag zurückgeben, das ich mit dem gerade hochgeladenen Inhalt speichern kann:
In Abschnitt 7.2 finden Sie eine Erläuterung der Bedeutung und des Zwecks von Validator-Header-Feldern wie ETag und Last-Modified in einer 201-Antwort.
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/23704283/12597
Content-Type: text/html
ETag: JF2CA53BOMQGU5LTOQQGC3RAMV4GC3LQNRSS4
Last-Modified: Sat, 02 Apr 2016 12:22:39 GMT
Your answer has been saved!
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.
Und ETag
s sind rein willkürliche Werte. Es kommt nur darauf an, dass sie unterschiedlich sind, wenn sich eine Ressource ändert (und die Caches aktualisiert werden müssen). Das ETag ist normalerweise ein Hash (z. B. SHA2). Es kann sich jedoch um eine Datenbank rowversion
oder eine inkrementelle Versionsnummer handeln. Alles , was wird ändern , wenn die Sache ändert.
Ich denke, die atompub REST API ist ein großartiges Beispiel für einen erholsamen Service. Siehe den folgenden Ausschnitt aus der atompub-Spezifikation:
Der Server signalisiert eine erfolgreiche Erstellung mit dem Statuscode 201. Die Antwort enthält einen Standortheader, der den Mitgliedseintrags-URI des Atomeintrags angibt, und eine Darstellung dieses Eintrags im Hauptteil der Antwort.
Der von der Sammlung erstellte und zurückgegebene Eintrag stimmt möglicherweise nicht mit dem vom Client geposteten Eintrag überein. Ein Server kann die Werte verschiedener Elemente im Eintrag ändern, z. B. die Werte atom: id, atom: updated und atom: author, und möglicherweise andere Elemente und Attribute entfernen oder hinzufügen oder den Elementinhalt und die Attributwerte ändern.
quelle
In wenigen Worten:
quelle
Check out HTTP: Methodendefinitionen: POST .
quelle
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
Es ist nur ein durch Doppelpunkte getrennter Schlüsselwert.
ETag: "xyzzy"
Es kann sich um jede Art von Textdaten handeln. Im Allgemeinen füge ich eine JSON-Zeichenfolge mit der Kennung des erstellten Elements hinzu. Allein die Leichtigkeit des Testens macht es lohnenswert, es einzubeziehen.
In diesem Beispiel sind der Bezeichner, die URL und der Typ des erstellten Elements die "Ressourcenmerkmale und der Speicherort".
quelle
Die Ausgabe hängt tatsächlich vom angeforderten Inhaltstyp ab. Sie sollten jedoch mindestens die Ressource, die erstellt wurde, in Location ablegen. Genau wie das Post-Redirect-Get-Muster.
In meinem Fall lasse ich es leer, bis ich anders angefordert werde. Da dies das Verhalten von JAX-RS bei Verwendung von Response.created () ist.
Beachten Sie jedoch, dass Browser und Frameworks wie Angular den 201 nicht automatisch folgen. Ich habe das Verhalten in http://www.trajano.net/2013/05/201-created-with-angular-resource/ notiert.
quelle
Eine andere Antwort, die ich dafür hätte, wäre, einen pragmatischen Ansatz zu verfolgen und Ihren REST-API-Vertrag einfach zu halten. In meinem Fall hatte ich meine REST-API überarbeitet, um die Testbarkeit zu verbessern, ohne auf JavaScript oder XHR zurückzugreifen, sondern nur auf einfache HTML-Formulare und Links.
Um Ihre Frage oben genauer zu beantworten, würde ich einfach den Rückkehrcode verwenden
200
und lasse die zurückgegebene Nachricht eine JSON-Nachricht enthalten, die Ihre Anwendung verstehen kann. Abhängig von Ihren Anforderungen ist möglicherweise die ID des neu erstellten Objekts erforderlich, damit die Webanwendung die Daten in einem anderen Aufruf abrufen kann.Ein Hinweis: In meinem überarbeiteten API-Vertrag sollten POST-Antworten keine zwischenspeicherbaren Daten enthalten, da POSTs nicht wirklich zwischengespeichert werden können. Beschränken Sie sie daher auf IDs, die mithilfe einer GET-Anforderung angefordert und zwischengespeichert werden können.
quelle