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?
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.
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:
Tout le reste est superflu.
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.
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.
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>