93 votes

Est-il acceptable en REST de renvoyer du contenu après un POST?

Je suis en train d'utiliser RESTlet et j'ai créé une ressource. Je gère le POST en remplaçant la méthode acceptRepresentation.

Le client devrait m'envoyer des données, que je stocke ensuite dans la base de données, je définis la réponse sur 201 (SUCCES_CRÉÉ) et j'ai besoin de renvoyer certaines données au client, mais le type de retour de acceptRepresentation est void.

Dans mon cas, j'ai besoin de renvoyer un identifiant pour que le client puisse accéder à cette ressource.

Par exemple, si j'avais une ressource avec l'URL /resource et que le client envoie une requête POST, j'ajoute une nouvelle ligne dans la base de données et son adresse devrait être /resource/{id}. J'ai besoin d'envoyer {id}.

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

0 votes

Voir la réponse de Thom pour savoir comment définir le corps de la réponse depuis acceptRepresentation().

98voto

Darrel Miller Points 56797

REST dit simplement que vous devriez vous conformer à l'interface uniforme. En d'autres termes, il dit que vous devriez 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 DOIT être 201 (Créé) et contenir une entité qui décrit le statut de la demande et fait référence à la nouvelle ressource, ainsi qu'un en-tête Location (voir section 14.30).

Comme vous pouvez le voir, vous avez deux endroits où vous pouvez indiquer au client où réside la ressource nouvellement créée. L'en-tête Location doit contenir une URL pointant vers la nouvelle ressource et vous pouvez également retourner une entité avec les détails.

Je ne suis pas sûr de la différence entre remplacer acceptRepresentation() et remplacer post() mais cet exemple montre comment renvoyer une réponse à partir d'un POST.

2 votes

@del-boy: Voir la réponse de Thom pour savoir comment définir le corps de la réponse depuis acceptRepresentation().

1 votes

La citation de la spécification HTTP n'interdit pas une réponse, si vous regardez dans la Section 6, il est clair que : il est autorisé : Les messages de demande et de réponse PEUVENT transférer une entité si cela n'est pas autrement restreint par la méthode de demande ou le code d'état de réponse. Une entité se compose de champs d'en-tête d'entité et d'un corps d'entité, bien que certaines réponses ne comprennent que les en-têtes d'entité.

0 votes

@MikeF Ce n'était pas mon intention d'insinuer qu'un corps de réponse n'était pas autorisé. La partie de la spécification que j'ai citée indique spécifiquement "et contenir une entité". J'aurais dû être plus clair dans mon texte.

16voto

cdent Points 51

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. POSTEZ une chose pour la créer
  2. Répondez avec 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 Location)

Tout le reste est superflu.

0 votes

Il est à noter que Wikipedia n'est pas toujours une bonne source, mais cela affirme également : "[...] Fournir des informations sur l'emplacement d'une ressource nouvellement créée. Dans ce cas, l'en-tête Location doit être envoyé avec un code d'état HTTP de 201 ou 202."

1 votes

POST peut exécuter une logique qui crée une ou plusieurs ressources. Le résultat du traitement peut être nécessaire pour le client. Ainsi, le retourner dans la réponse évite le besoin de faire un ou plusieurs appels GET à l'API. Les données créées/modifiées par la méthode POST peuvent ne pas être (et souvent ne sont pas) superflues pour le client.

10voto

Thom Points 44

Deux questions différentes :

Est-ce que le modèle d'application REST supporte le retour de données dans un POST ?

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

Est-ce que le framework RESTlet permet de retourner 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 Response via la méthode getResponse(). Donc, vous pouvez appeler getResponse().setEntity() avec les données que vous souhaitez.

6voto

Samir Talwar Points 9307

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

    5483

Ou:

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

Cela dépend de ce que vous avez l'habitude de faire. S'ils ne s'attendent pas aux données, ils devraient simplement les ignorer, mais tout client qui souhaite les gérer correctement devrait être capable de le faire.

0 votes

D'accord, j'ai deux formats possibles (html et xml). Je sais comment gérer le type de format demandé, mais je ne sais pas comment ajouter des données à la réponse. La méthode represent renvoie une représentation, donc je retourne simplement ce que je veux, mais acceptRepresentation est une méthode vide, donc je ne peux pas renvoyer de données...

1voto

Mike Points 3029

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

Cela évitera toute confusion potentielle - selon 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
> ..nouvel élément..

< 201 Créé
< Location: /collection/1354
< Content-Location: /collection/1354
< Ceci est le nouvel élément qui a été créé

3 votes

Je pense que Content-Location est utilisé pour un but différent. La spécification HTTP dit que Content-Location n'est pas défini pour les méthodes POST et PUT. L'en-tête Location est utilisé avec un code de réponse 201-Créer. Renvoyer une Localisation ne fait pas automatiquement de redirection, vous avez besoin d'un code de réponse 3XX pour cela.

1 votes

Le header de localisation est utilisé (dans une réponse 201) pour indiquer où se trouve la ressource créée; il n'est pas pertinent pour le corps de l'entité de la réponse qui l'accompagne. Mon point était que - si vous vouliez inclure la ressource créée dans la réponse 201 elle-même (plutôt que de diriger/ rediriger le client vers une autre URI), alors un header de contenu-location serait une bonne idée. Cela pourrait être considéré comme 'tordre un peu les règles', mais c'est plus efficace que de nécessiter un autre cycle de demande/réponse pour transmettre l'état de la nouvelle ressource au client.

0 votes

Avoir du sens pour moi. Je n'ai jamais utilisé l'en-tête Content-Location auparavant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X