Disons que je veux avoir une ressource RESTful pour les personnes, où le client peut attribuer un ID.
Une personne ressemble à ceci: {"id": <UUID>, "name": "Jimmy"}
Maintenant, comment le client doit-il le sauvegarder (ou le «PUT»)?
PUT /person/UUID {"id": <UUID>, "name": "Jimmy"}
- maintenant nous avons cette mauvaise duplication que nous devons vérifier tout le temps: l'ID dans le corps correspond-il à celui dans le chemin?- Représentation asymétrique:
PUT /person/UUID {"name": "Jimmy"}
GET /person/UUID
Retour{"id": <UUID>, "name": "Jimmy"}
- Aucun ID dans le corps - ID uniquement dans l'emplacement:
PUT /person/UUID {"name": "Jimmy"}
GET /person/UUID
Retour{"name": "Jimmy"}
- Aucune sorte de ne
POST
semble être une bonne idée puisque l'ID est généré par le client.
Quels sont les schémas courants et les moyens de le résoudre? Les identifiants uniquement localisés semblent être le moyen le plus dogmatiquement correct, mais cela rend également la mise en œuvre pratique plus difficile.
id
avec TO avec identifiant et entité et des convertisseurs supplémentaires et une surcharge trop importante pour les programmeurs.S'il s'agit d'une API publique, vous devez être prudent lorsque vous répondez, mais acceptez généreusement.
Je veux dire par là que vous devriez soutenir à la fois 1 et 2. Je conviens que 3 n'a pas de sens.
Le moyen de prendre en charge à la fois 1 et 2 est d'obtenir l'id de l'url si aucun n'est fourni dans le corps de la requête, et s'il se trouve dans le corps de la requête, alors validez qu'il correspond à l'id dans l'url. Si les deux ne correspondent pas, renvoyez une réponse 400 Bad Request.
Lorsque vous retournez une ressource personne, soyez prudent et incluez toujours l'identifiant dans le json, même s'il est facultatif dans le put.
la source
Une solution à ce problème implique le concept quelque peu déroutant de «Hypertext As The Engine Of Application State» ou «HATEOAS». Cela signifie qu'une réponse REST contient les ressources disponibles ou les actions à effectuer sous forme de liens hypertexte. En utilisant cette méthode, qui faisait partie de la conception originale de REST, les identifiants / ID uniques des ressources sont eux-mêmes des hyperliens. Ainsi, par exemple, vous pourriez avoir quelque chose comme:
Ensuite, si vous souhaitez mettre à jour cette ressource, vous pouvez faire (pseudocode):
Un avantage de ceci est que le client n'a aucune idée de la représentation interne du serveur des ID utilisateur. Les identifiants pourraient changer, et même les URL elles-mêmes pourraient changer, tant que le client a un moyen de les découvrir. Par exemple, lors de l'obtention d'une collection de personnes, vous pouvez renvoyer une réponse comme celle-ci:
(Vous pouvez, bien sûr, également renvoyer l'objet Personne complète pour chaque personne, en fonction des besoins de l'application).
Avec cette méthode, vous pensez davantage à vos objets en termes de ressources et d'emplacements, et moins en termes d'ID. La représentation interne de l'identifiant unique est ainsi découplée de votre logique client. C'était l'impulsion originale derrière REST: créer des architectures client-serveur plus faiblement couplées que les systèmes RPC qui existaient auparavant, en utilisant les fonctionnalités de HTTP. Pour plus d'informations sur HATEOAS, consultez l'article Wikipédia ainsi que ce court article .
la source
Dans une insertion, vous n'avez pas besoin d'ajouter l'ID dans l'URL. De cette façon, si vous envoyez un ID dans un PUT, vous pouvez interpréter comme une MISE À JOUR pour changer la clé primaire.
INSÉRER:
METTRE À JOUR
L' API JSON utilise cette norme et résout certains problèmes en renvoyant l'objet inséré ou mis à jour avec un lien vers le nouvel objet. Certaines mises à jour ou insertions peuvent inclure une logique métier qui modifiera des champs supplémentaires
Vous verrez également que vous pouvez éviter le get après l'insertion et la mise à jour.
la source
Cela a déjà été demandé - la discussion vaut le coup d'œil:
Une réponse RESTful GET doit-elle renvoyer l'ID d'une ressource?
C'est l'une de ces questions où il est facile de s'enliser dans un débat sur ce qui est et n'est pas "RESTful" .
Pour ce que ça vaut, j'essaie de penser en termes de ressources cohérentes et de ne pas en changer la conception entre les méthodes. Cependant, à mon humble avis, la chose la plus importante du point de vue de la convivialité est que vous soyez cohérent sur l'ensemble de l'API!
la source
Juste pour info, les réponses ici sont fausses.
Voir:
https://restfulapi.net/rest-api-design-tutorial-with-example/
https://restfulapi.net/rest-put-vs-post/
https://restfulapi.net/http-methods/#patch
METTRE
PIÈCE
Vous devriez donc l'utiliser de cette manière:
Les pratiques RESTful indiquent que peu importe ce que vous METTEZ à / {id} - le contenu de l'enregistrement doit être mis à jour avec celui fourni par la charge utile - mais GET / {id} doit toujours être lié à la même ressource.
En d'autres termes, PUT / 3 peut mettre à jour l'ID de charge utile à 4, mais GET / 3 doit toujours se lier à la même charge utile (et renvoyer celui dont l'id est défini sur 4).
Si vous décidez que votre API nécessite le même identifiant dans l'URI et la charge utile, c'est votre travail de vous assurer qu'il correspond, mais utilisez certainement PATCH au lieu de PUT si vous excluez l'id dans la charge utile qui devrait être là dans son intégralité . C'est là que la réponse acceptée s'est trompée. PUT doit remplacer la totalité de la ressource, là où le correctif peut être partiel.
la source
Bien qu'il soit correct d'avoir différentes représentations pour différentes opérations, une recommandation générale pour PUT est de contenir la charge utile ENTIÈRE . Cela signifie que cela
id
devrait être là aussi. Sinon, vous devez utiliser PATCH.Cela dit, je pense que PUT devrait principalement être utilisé pour les mises à jour et
id
devrait toujours être passé dans l'URL. En conséquence, utiliser PUT pour mettre à jour l'identificateur de ressource est une mauvaise idée. Cela nous laisse dans une situation indésirable lorsqueid
l'URL peut être différente de laid
du corps.Alors, comment résoudre un tel conflit? Nous avons essentiellement 2 options:
Warning
(X-API-Warn
etc).C'est aussi près que possible de répondre à cette question car le sujet en général est une question d'opinion.
la source
Il n'y a rien de mal à utiliser différentes approches. mais je pense que le meilleur moyen est la solution avec 2nd .
il est principalement utilisé de cette manière, même le framework d'entité utilise cette technique lorsque l'entité est ajoutée dans dbContext, la classe sans l'ID généré est l'ID généré par référence dans Entity Framework.
la source
J'examine cela d'un point de vue JSON-LD / Web sémantique, car c'est un bon moyen d'atteindre une véritable conformité REST, comme je l'ai souligné dans ces diapositives . En regardant les choses de ce point de vue, il n'est pas question d'opter pour l'option (1.) car l'ID (IRI) d'une ressource Web doit toujours être égal à l'URL que je peux utiliser pour rechercher / déréférencer la ressource. Je pense que la vérification n'est pas vraiment difficile à mettre en œuvre et qu'elle n'est pas non plus intensive en termes de calcul; donc je ne considère pas cela comme une raison valable pour choisir l'option (2.). Je pense que l'option (3.) n'est pas vraiment une option car POST (create new) a une sémantique différente de PUT (update / replace).
la source
Vous devrez peut-être examiner les types de requêtes PATCH / PUT.
Les requêtes PATCH sont utilisées pour mettre à jour partiellement une ressource alors que dans les requêtes PUT, vous devez envoyer la ressource entière là où elle est remplacée sur le serveur.
Pour ce qui est d'avoir un identifiant dans l'url, je pense que vous devriez toujours l'avoir car c'est une pratique courante d'identifier une ressource. Même l'API Stripe fonctionne de cette façon.
Vous pouvez utiliser une demande PATCH pour mettre à jour une ressource sur le serveur avec un ID pour l'identifier mais ne mettez pas à jour l'ID réel.
la source