it-swarm.com.de

Erstellen Sie eine Anfrage mit POST, die die Antwortcodes 200 oder 201 und den Inhalt enthält

Angenommen, ich schreibe einen REST Service, dessen Absicht es ist, einem System ein neues Datenelement hinzuzufügen.

Ich plane zu POST zu

http://myhost/serviceX/someResources

Angenommen, das funktioniert. Welchen Antwortcode soll ich verwenden? Und welchen Inhalt könnte ich zurückgeben?.

Ich schaue auf die Definitionen von HTTP-Antwortcodes und sehe diese Möglichkeiten:

200: Gib eine Entität zurück, die das Ergebnis der Aktion beschreibt oder enthält;

201: das heißt ERSTELLT. Bedeutung * Die Anfrage wurde erfüllt und es wurde eine neue Ressource angelegt. Auf die neu erstellte Ressource kann von den in der Entität der Antwort zurückgegebenen URI (s) verwiesen werden, wobei der spezifischste URI für die Ressource in einem Standortheaderfeld angegeben ist. Die Antwort MUSS eine Entität enthalten, die eine Liste von Ressourcenmerkmalen und Speicherorten enthält, aus denen der Benutzer oder Benutzeragent den am besten geeigneten auswählen kann. Das Entitätsformat wird durch den Medientyp bestimmt, der im Feld Inhaltstyp angegeben ist. *

Letzteres klingt eher nach der Http-Spezifikation, aber mir ist überhaupt nicht klar, was

Die Antwort SOLLTE eine Entität enthalten, die eine Liste der Ressourcenmerkmale und Standorte enthält.

meint.

Empfehlungen? Interpretationen?

102
djna

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

Es ist nur ein durch Doppelpunkte begrenzter Schlüsselwert.

ETag: "xyzzy"

Es kann sich um eine beliebige Art von Textdaten handeln. Im Allgemeinen füge ich eine JSON-Zeichenfolge mit der ID des erstellten Elements hinzu. Allein die einfache Testbarkeit lohnt sich.

ETag: "{ id: 1234, uri: 'http://domain.com/comments/1234', type: 'comment' }"

In diesem Beispiel sind die ID, der URI und der Typ des erstellten Elements die "Ressourcenmerkmale und der Speicherort".

13
tempire

Ich denke atompub REST API ist ein großartiges Beispiel für einen erholsamen Service. Siehe den folgenden Ausschnitt aus der atompub-Spezifikation:

POST /edit/ HTTP/1.1
Host: example.org
User-Agent: Thingio/1.0
Authorization: Basic ZGFmZnk6c2VjZXJldA==
Content-Type: application/atom+xml;type=entry
Content-Length: nnn
Slug: First Post

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
</entry>

Der Server meldet eine erfolgreiche Erstellung mit dem Statuscode 201. Die Antwort enthält einen Standortheader, der den Elementeintrags-URI des Atom= Entry und eine Darstellung dieses Eintrags im Hauptteil der Antwort angibt .

HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: nnn
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/edit/first-post.atom
ETag: "c180de84f991g8"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"
      href="http://example.org/edit/first-post.atom"/>
</entry>

Der von der Sammlung erstellte und zurückgegebene Eintrag stimmt möglicherweise nicht mit dem vom Client veröffentlichten Eintrag überein. Ein Server KANN die Werte verschiedener Elemente im Eintrag ändern, z. B. die Werte atom: id, atom: updated und atom: author, und KANN andere Elemente und Attribute entfernen oder hinzufügen oder den Elementinhalt und die Attributwerte ändern.

85
Chandra Patni

Die Idee ist, dass der Antworttext Ihnen eine Seite gibt, die Sie mit der Sache verbindet:

201 Erstellt

Der Statuscode 201 (Erstellt) gibt an, dass die Anforderung erfüllt wurde und eine oder mehrere neue Ressourcen erstellt wurden. Die durch die Anforderung erstellte Primärressource wird entweder durch ein Standort-Headerfeld in der Antwort oder, falls kein Standortfeld empfangen wird, durch den effektiven Anforderungs-URI identifiziert.

Dies bedeutet, dass Sie einen Location in den Antwortheader einfügen würden, der die URL, unter der Sie das neu erstellte Objekt finden :

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597

Reaktionskörper

Anschließend erwähnen sie, was Sie in den Antworttext einfügen sollten :

Die 201-Antwortnutzdaten beschreiben in der Regel die erstellten Ressourcen und stellen eine Verknüpfung zu ihnen her.

Für den Benutzer, der den Browser verwendet, geben Sie ihm etwas, das er sich ansehen und klicken 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="/a/36373586/12597">here</A> to view it.

Wenn die Seite nur von einem Roboter verwendet wird, ist es sinnvoll, die Antwort computerlesbar zu machen:

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, z. B. 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="/a/36373586/12597">here</A> to view it.

Und ETag s sind rein willkürliche Werte. Wenn sich eine Ressource ändert (und die Caches aktualisiert werden müssen), müssen sie sich nur unterscheiden. Das ETag ist normalerweise ein Hash (z. B. SHA2). Es kann sich aber auch um eine Datenbank rowversion oder eine inkrementelle Revisionsnummer handeln. Alles, was ändert , wenn sich das Ding ändert.

61
Ian Boyd

In wenigen Worten:

  • 2 wenn ein Objekt erstellt wird und zurückgegeben wird
  • 201 Wenn ein Objekt erstellt wird, aber nur seine Referenz zurückgegeben wird (z. B. eine ID oder ein Link)
30

Check out HTTP: Methodendefinitionen: POST .

Die von der POST -Methode ausgeführte Aktion führt möglicherweise nicht zu einer Ressource, die von einem URI identifiziert werden kann. In diesem Fall ist entweder 200 (OK) oder 204 (No Content) der entsprechende Antwortstatus Dies hängt davon ab, ob die Antwort eine Entität enthält, die das Ergebnis beschreibt.

Wenn eine Ressource auf dem Origin-Server erstellt wurde, SOLLTE die Antwort 201 (Erstellt) lauten und eine Entität enthalten, die den Status der Anforderung beschreibt und auf die neue Ressource verweist, sowie einen Standort-Header (siehe Abschnitt 14.30).

28
ma11hew28

Die Ausgabe ist tatsächlich vom angeforderten Inhaltstyp abhängig. Sie sollten jedoch mindestens die Ressource, die erstellt wurde, in Position einfügen. Genau wie das Post-Redirect-Get-Muster.

In meinem Fall lasse ich es leer, bis etwas anderes verlangt wird. Denn das ist das Verhalten von JAX-RS bei der Verwendung von Response.created ().

Beachten Sie jedoch, dass Browser und Frameworks wie Angular nicht automatisch nach 201 folgen. Ich habe das Verhalten in http://www.trajano.net/2013/05/201) notiert erstellt mit eckigen Ressourcen /

1