J'utilise RESTlet et j'ai créé une ressource. Je gère POST en remplaçant la acceptRepresentation
méthode.
Le client doit m'envoyer des données, puis je les stocke dans DB, définit la réponse sur 201 (SUCCESS_CREATED) et je dois renvoyer des données au client, mais retourne le type de acceptRepresentation
est void
.
Dans mon cas, je dois retourner un identifiant afin que le client puisse accéder à cette ressource.
Par exemple, si j'avais une ressource avec une URL /resource
et que le client envoie une demande POST, j'ajoute une nouvelle ligne dans DB 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, quelle est la manière de gérer cette situation?
Réponses:
REST dit simplement que vous devez vous conformer à l'interface uniforme. En d'autres termes, il indique 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,
Comme vous pouvez le voir, vous avez 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 suis pas sûr de la différence entre la substitution d'acceptRepresentation () et la substitution de post (), mais cet exemple montre comment renvoyer une réponse à partir d'un POST.
la source
Request and Response messages MAY transfer an entity if not otherwise restricted by the request method or response status code. An entity consists of entity-header fields and an entity-body, although some responses will only include the entity-headers.
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.
la source
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 précisé dans la réponse de Darrel.
Le framework RESTlet permet-il de renvoyer des données dans un POST?
Oui, même si elle 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 de votre choix.
la source
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 devraient simplement les ignorer, mais tout client qui souhaite les gérer correctement devrait pouvoir le faire.
la source
Si vous répondez 201 Created avec un corps d'entité, plutôt qu'une redirection d'emplacement, il est judicieux 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>
la source