Est-ce que REST peut renvoyer du contenu après le POST?

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

Le client doit m’envoyer des données, puis je les stocke dans la firebase database, 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 annulé.

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 URL / ressource et que le client envoie une requête POST, j’ajoute une nouvelle ligne dans la firebase database et son adresse devrait être / resource / {id}. J’ai besoin d’envoyer {id}.

Est-ce que je fais quelque chose de mal? Les principes REST permettent-ils de retourner 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 est conseillé de faire ce que POST est censé faire selon les spécifications 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éé) 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 avoir une URL qui pointe vers la nouvelle ressource et vous pouvez également renvoyer une entité avec les détails.

Je ne suis pas sûr de la différence entre substituer acceptRepresentation () et substituer post () mais cet exemple montre comment retourner une réponse d’un POST.

Je renoncerais à envoyer quoi que ce soit dans le corps de la réponse. Il suffit de définir l’emplacement: 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. POST une chose pour le créer
  2. Répondez avec assez pour savoir deux choses:
    1. Que la création est arrivée (le 201)
    2. Où trouver la nouvelle chose (l’en-tête Location)

Tout le rest est superflu.

Deux questions différentes:

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

Je ne pense pas que REST le rejette explicitement, mais le traitement préféré est défini dans la réponse de Darrel.

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

Oui, même s’il retourne void, dans une classe qui étend Resource, vous avez un access complet à l’object object Response via la méthode getResponse (). Vous pouvez donc appeler getResponse (). SetEntity () avec les données souhaitées.

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

  5483  

Ou:

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

Cela dépend de ce que vous faites habituellement. S’ils n’attendent pas les données, ils devraient simplement les ignorer, mais tout client qui veut les gérer correctement devrait pouvoir le faire.

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

Cela évitera toute confusion potentielle – dans laquelle un client pourrait (à juste titre) supposer que l’entité de réponse représente réellement 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 < 
This is the new item that was created