L'idée est que le corps de la réponse vous donne une page qui vous relie à l'objet:
201 Créé
Le code d'état 201 (Créé) indique que la demande a été satisfaite et a entraîné la création d'une ou plusieurs nouvelles ressources. La ressource principale créée par la demande est identifiée par un champ d'en-tête Location dans la réponse ou, si aucun champ Location n'est reçu, par l'URI de demande effective.
Cela signifie que vous incluez un Location
dans l'en- tête de réponse qui donne l'URL de l'endroit où vous pouvez trouver l' élément nouvellement créé :
HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Corps de réponse
Ils continuent ensuite en mentionnant ce que vous devez inclure dans le corps de la réponse :
La charge utile de réponse 201 décrit et lie généralement à la ou aux ressources créées.
Pour l'humain qui utilise le navigateur, vous lui donnez quelque chose qu'il peut consulter et cliquez pour accéder à sa ressource nouvellement créée:
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.
Si la page ne sera utilisée que par un robot, il est logique que la réponse soit lisible par ordinateur:
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>
Ou, si vous préférez:
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"
]
}
La réponse dépend entièrement de vous; c'est arbitrairement ce que vous voudriez.
Cache convivial
Enfin, il y a l'optimisation que je peux pré-mettre en cache la ressource créée (car j'ai déjà le contenu; je viens de le télécharger). Le serveur peut renvoyer une date ou un ETag que je peux stocker avec le contenu que je viens de télécharger:
Voir la section 7.2 pour une discussion sur la signification et le but des champs d'en-tête du validateur, tels que ETag et Last-Modified, dans une réponse 201.
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.
Et les ETag
s sont des valeurs purement arbitraires. Tout ce qui compte, c'est de les avoir différents lorsqu'une ressource change (et que les caches doivent être mis à jour). L'ETag est généralement un hachage (par exemple SHA2). Mais cela peut être une base de données rowversion
ou un numéro de révision incrémenté. Tout ce qui changera lorsque la chose changera.
Je pense que l'API REST atompub est un excellent exemple de service reposant. Voir l'extrait ci-dessous de la spécification atompub:
Le serveur signale une création réussie avec un code d'état de 201. La réponse comprend un en-tête Location indiquant l'URI d'entrée de membre de l'entrée Atom, et une représentation de cette entrée dans le corps de la réponse.
L'entrée créée et renvoyée par la collection peut ne pas correspondre à l'entrée publiée par le client. Un serveur PEUT changer les valeurs de divers éléments dans l'entrée, tels que les valeurs atom: id, atom: updated et atom: author, et PEUT choisir de supprimer ou d'ajouter d'autres éléments et attributs, ou de changer le contenu des éléments et les valeurs d'attributs.
la source
En quelques mots:
la source
Consultez HTTP: définitions de méthode: POST .
la source
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19
C'est juste une valeur-clé délimitée par deux points.
ETag: "xyzzy"
Il peut s'agir de n'importe quel type de données texte - j'inclus généralement une chaîne JSON avec l'identifiant de l'élément créé. La facilité des tests à elle seule en vaut la peine.
Dans cet exemple, l'identifiant, l'URI et le type de l'élément créé sont les «caractéristiques et emplacement de la ressource».
la source
La sortie dépend en fait du type de contenu demandé. Cependant, au minimum, vous devez placer la ressource créée dans Location. Tout comme le modèle Post-Redirect-Get.
Dans mon cas, je laisse ce champ vide jusqu'à ce que cela soit demandé autrement. Puisque c'est le comportement de JAX-RS lors de l'utilisation de Response.created ().
Cependant, notez simplement que les navigateurs et les frameworks comme Angular ne suivent pas automatiquement les 201. J'ai noté le comportement dans http://www.trajano.net/2013/05/201-created-with-angular-resource/
la source
Une autre réponse que j'aurais pour cela serait d'adopter une approche pragmatique et de conserver votre contrat d'API REST simple. Dans mon cas, j'avais refactorisé mon API REST pour rendre les choses plus testables sans recourir à JavaScript ou XHR, juste de simples formulaires et liens HTML.
Donc, pour être plus précis sur votre question ci-dessus, j'utiliserais simplement le code de retour
200
et sorte que le message retourné contienne un message JSON que votre application peut comprendre. En fonction de vos besoins, il peut nécessiter l'ID de l'objet nouvellement créé afin que l'application Web puisse obtenir les données dans un autre appel.Une note, dans mon contrat d'API refactorisé, les réponses POST ne doivent contenir aucune donnée pouvant être mise en cache car les POST ne sont pas vraiment cachable, alors limitez-le aux ID qui peuvent être demandés et mis en cache à l'aide d'une requête GET.
la source