web-dev-qa-db-fra.com

Est-ce correct par REST pour retourner du contenu après le POST?

J'utilise RESTlet et j'ai créé une ressource. Je gère POST en remplaçant la méthode acceptRepresentation.

Le client doit m'envoyer des données, puis je les stocke dans la base de données, définit la réponse sur 201 (SUCCESS_CREATED) et je dois renvoyer certaines données au client, mais le type de retour de acceptRepresentation est void .

Dans mon cas, je dois retourner un identifiant pour que le client puisse accéder à cette ressource.

Par exemple, si j'avais une ressource avec l'URL /resource et le client envoie POST demande j'ajoute une nouvelle ligne dans la base de données et son adresse doit être /resource/{id}. Je dois envoyer {id}.

Est-ce que je fais quelque chose de mal? Les principes REST permettent-ils de renvoyer quelque chose après le POST? Si oui, comment puis-je le faire, et si non, comment gérer cette situation?

80
del-boy

REST dit simplement que vous devez vous conformer à l'interface uniforme. En d'autres termes, il dit que vous devez faire ce que POST est censé faire selon la spécification HTTP . Voici la citation de cette spécification qui est pertinente,

Si une ressource a été créée sur le serveur d'origine, la réponse DEVRAIT être 201 (créée) et contenir une entité qui décrit le statut de la demande et fait référence à la nouvelle ressource, et un en-tête Location (voir section 14.30).

Comme vous pouvez le voir, vous disposez de deux emplacements où vous pouvez indiquer au client où réside la ressource nouvellement créée. L'en-tête Location doit avoir une URL qui pointe vers la nouvelle ressource et vous pouvez également renvoyer une entité avec les détails.

Je ne sais pas quelle est la différence entre le remplacement de acceptRepresentation () et le remplacement de post (), mais l'exemple this montre comment renvoyer une réponse à partir d'un POST.

87
Darrel Miller

Je renoncerais à envoyer quoi que ce soit dans le corps de la réponse. Définissez simplement Location: sur l'URL (complète) de la ressource nouvellement créée.

Votre description suggère que c'est exactement la sémantique que vous:

  1. POSTER une chose pour la créer
  2. Répondez suffisamment pour savoir deux choses:
    1. Que la création s'est produite (le 201)
    2. Où trouver la nouvelle chose (l'en-tête Emplacement)

Tout le reste est superflu.

14
cdent

Deux questions différentes:

Le modèle d'application REST prend-il en charge le retour de données dans un POST?

Je ne pense pas que REST l'interdit explicitement, mais le traitement préféré est énoncé dans la réponse de Darrel.

Le framework RESTlet permet-il de renvoyer des données dans un POST?

Oui, même s'il renvoie void, dans une classe qui étend Resource, vous avez un accès complet à l'objet objet Response via la méthode getResponse (). Vous pouvez donc appeler getResponse (). SetEntity () avec les données que vous souhaitez.

10
Thom

Sortez-le dans le format demandé. Cela pourrait être:

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

Ou:

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

Cela dépend de ce que vous faites habituellement. S'ils n'attendent pas les données, ils doivent simplement les ignorer, mais tout client qui souhaite les traiter correctement devrait pouvoir.

6
Samir Talwar

Si vous répondez 201 Créé avec un corps d'entité, plutôt qu'une redirection d'emplacement, alors c'est une bonne idée d'inclure un en-tête Content-Location pointant vers la ressource qui est représentée dans la réponse.

Cela évitera une confusion potentielle - dans laquelle un client pourrait (à juste titre) supposer que l'entité de réponse représente en fait un nouvel état du "créateur", et non la ressource créée.

> 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>
1
Mike