web-dev-qa-db-fra.com

Est-ce que ça va d'utiliser POST pour ==REST API Mises à jour?

Pendant quelque temps, j'ai utilisé Met ou patch afin de mettre à jour un REST Ressource API. Après avoir utilisé beaucoup d'appels de placement/patch, j'ai remarqué que "la mise à jour" pourrait également être effectuée avec Post.

Voici un exemple qui est trop simplifié qui, espérons-le, expliquera la situation. Il y a un point de terminaison/API/Voitures/concessionnaires/1 avec une ressource

{
  "id": 1,
  "dealer_name": "Audi Atlanta",
  "year_opened": 2010,
  "contact_persons": [
    {
      "contact_person_type": "main_contact",
      "contact_person_name": "Mike Smith"
    },
    {
      "contact_person_type": "billing_contact",
      "contact_person_name": "Luke Johnson"
    }
  ]
}

Serait-ce contre REST Lignes directrices de l'API si je mettez à jour cette ressource avec POST tel que tel que

{
  "contact_to_change": "main_contact",
  "contact_name": "John Smith"
}

au lieu de patch avec

{
  "id": 1,
  "contact_persons": [
    {
      "contact_person_type": "main_contact",
      "contact_person_name": "Mike Smith"
    }
  ]
}

ou au lieu d'une mise à jour complète des ressources avec Met

Veuillez noter comment la structure de la charge utile est complètement différente puis la structure de la ressource elle-même. Il y a des cas où cela est beaucoup plus facile alors d'accéder à une mise à jour des ressources brutes à la suite de la même structure du corps.

Cela pourrait-il apporter une certaine question que je ne vois pas en ce moment?

2
John

Vous pouvez utiliser POST pour mettre à jour une ressource mais n'utilise pas la même URL que la ressource que vous mettez à jour. Donc, si l'URL à utiliser avec MET/PATCH est /api/cars/dealers/1, vous auriez /api/cars/dealerupdates Pour envoyer votre POST Demandes avec le corps comme dans votre demande de patch.

De cette façon, il est clair que vous ne créez pas une nouvelle entité sous /api/cars/dealers/ ou /api/cars/dealers/1. Ce qui est créé est une nouvelle entité de mise à jour qui sera appliquée à un moment donné de l'entité à l'intérieur de la demande. Une autre façon de voir c'est: Envoyer une demande d'accès à /api/cars/dealerupdates peut donner une liste de mises à jour traitées.

3
imel96

Il y a une différence subtile entre yes, you can use POST for updates et yes, it's ok using POST for updates.

Techniquement, vous pouvez mais ce n'est pas correct; Sauf si vous gérez des contraintes rares ou si vous implémentez une interface Web RPC.

Pourquoi ça ne va pas? La raison est dans les deux autres réponses et commentaires. C'est étrange. C'est confu.

Déroutant? Pour qui? D'un côté, pour celui qui se familiarise avec les verbes HTTP et doit travailler avec votre API. D'autre part, les clients HTTP sont mis en œuvre pour travailler de manière très spécifique. OK, votre idée fonctionnera sur la plupart des clients HTTP, mais vous ferez la tâche de quelqu'un d'autre plus fort lorsque tout trop soudain, le client cesse de fonctionner comme prévu.

Permettez-moi de partager une réflexion. Souvent, nous avons ce que j'appelle "idées heureuses". idées heureuses Faire beaucoup de sens pour nous. Nous sommes quelque chose d'évident, brillant, ils travaillent, ils vont bien.

La chose est que si nous les arrivons sur de faux locaux ou rationnels, manque de connaissances ou d'ignorance absolue.

Si vous connaissez la sémantique HTTP et que vous ne voulez pas que votre API provoque une heure amusante WTF, vous n'utilisez pas POST pour les mises à jour. Parce que c'est bizarre et cela fait dure quelqu'un autre travail. Il porte un fardeau cognitif inutile.

Cela pourrait-il apporter des problèmes que je ne vois pas pour le moment?

Dur à dire. Cela dépendra de la manière dont l'idée heureuse complique les choses. Si vous devez faire cette question aux étrangers sur Internet, ce n'est pas une bonne idée. Apprenez d'abord HTTP, faites-vous familier avec. Puis tournez-le en toute sécurité lorsque vous le juge nécessaires.

1
Laiv

dépend un peu sur la sémantique de vos messages

a POST TO/API/CAW/CADERERS/1/MISE UPDATE irait bien puisque vous envoyez une nouvelle demande de mise à jour (et que la sémantique change légèrement depuis que la demande de mise à jour pourrait ou pourrait ne pas être traitée à une fois plus tard)

Vous pouvez même afficher des mises à jour structurées différentes de/API/CARS/CADERERS/1/MISE À JOUR. Cela allignerait davantage avec un type d'architecture CQRS où les requêtes seraient séparées des commandes (mises à jour), puis les commandes sont en quelque sorte structurées car ce sont des entités propres.

mais de manière générale, un POST doit créer quelque chose, soit une nouvelle personne de contact (poste à/API/CaR/Cars/Concessionnaires/1/Contact) ou une nouvelle demande de mise à jour.

1
Batavia

En mon sens de comprendre le terme REST API Se penche déjà lourdement vers une réflexion en réalité de la question en tant qu'API qui devrait être utilisé par des programmeurs ou des développeurs, quelque chose qui est invoqué et déclenche certains processus métier . Il peut être expédié avec une documentation fantaisie que plus ou moins marque les lignes directrices pour les développeurs sur la manière d'interagir avec cette API et qui devient la vérité pour l'API lui-même empêchant l'API de l'évolution future, car elle doit s'en tenir à la documentation. Bien sûr, la documentation peut être mise à jour. Bien que cela conduira plus tard à la version de l'API et à des questions sur la manière de servir les clients qui soutiennent la version n mais pas m à l'avenir. Nous connaissons ces problèmes déjà depuis des décennies de RPC (savon, Corba, RMI, ...). Bien que ce ne soit pas ce que REST est et devrait être.

Fielonnement défini REST comme style architectural. Selon Robert C. "oncle Bob" Martin an , l'architecture est à propos de l'intention et l'intention derrière REST est le découplage des clients de serveurs à Permettez à ces derniers d'évoluer librement à l'avenir sans avoir à craindre des clients. Afin de réaliser des clients de découplage et des serveurs doivent adhérer à un certain ensemble de contraintes, qui ne sont pas une option mais obligatoire à adhérer à. Il est trop facile d'introduire un couplage, c'est pourquoi nous ne voyons pas de nombreuses implémentations précises dans le monde, à l'exception de l'adresse www.

Le repos réutilise essentiellement les concepts qui ont rendu le Web et l'ont appliqué sur le domaine de l'application où les choses étaient historiquement pilotées par RPC et donc étroitement couplées. En raison de l'accouplement, de nombreux services ont soudainement cessé de fonctionner lorsque le service a changé d'une manière ou d'une autre, cela est généralement vrai pour toutes ces "API de repos".

En examinant de plus près sur le www, on peut reconnaître que les clients utilisent des liens pour récupérer le nouvel état et utiliser des formulaires HTML pour envoyer des données au serveur. La forme enseigne à un client comment une demande envoyée au serveur doit ressembler. Il contient le noeud final pour envoyer les données à et peut également contenir la méthode à utiliser ainsi que le type de support pour formater les données dans avant de l'envoyer au serveur. Bien que certains types de médias activés par hypertexte existent (c'est-à-dire Hal Json, ...) La prise en charge des formulaires compatibles hypertextes est encore un peu à sa balance. Il y a des brouillons disponibles mais pas encore très largement soutenu encore.

Après avoir utilisé beaucoup d'appels de points/correctifs, j'ai remarqué que "la mise à jour" pourrait également être effectuée avec la poste

...

Serait-ce contre des directives de l'API REST si je mettez à jour cette ressource avec POST ...

Cela dépend, mais quelles sont les directives de l'API REST de toute façon? Ils ne sont pas normalisés pour que l'on puisse indiquer cela, un autre État le contraire. Lequel est maintenant vrai? La plupart de ces directives indiquent que les verbes ne doivent pas être présents dans les URI car ils ont une odeur de RPC. Bien que dans la réalité dans un environnement REST, la forme de l'URI n'est pas d'importance du tout. Il est simplement utilisé pour envoyer des demandes à. Un client ne doit pas analyser l'URI car le serveur est essentiellement libre de changer l'URI à tout moment. Il existe déjà un chemin vers de nombreux clients spécifiques à l'API qui considèrent certains points de terminaison pour renvoyer certains types au lieu de s'appuyer sur la négociation de type de contenu pour récupérer une représentation des données qu'il peut réellement traiter et travailler sur. L'URI elle-même n'est pas la partie importante, l'accompagnement de données telles que des relations de liaison ou un texte lisible humain tel que définie par un type de support standardisé, sont plus importantes. Nous préférons également lire un texte lisible humain résumant le contenu d'un lien que le lien réel lui-même que mon contient des informations de cookie et des paramètres cryptés et ce qui n'est pas. Je ferai donc prudemment les directives à suivre.

Si vous utilisez POST pour mettre à jour les données, des principes REST en général, que le Big Cousin, le WWW, que l'idée de REST ne découle pas, ne respecterait pas les principes REST implique. HTML, le format de document standard de facto échangé la plupart du temps pour les pages Web, ne prend en charge que POST et obtenir. Http irait bien pour accepter la suppression, le correctif, la mise ou l'un des d'autres opérations HTTP standardisées , bien que HTML ait décidé de ne supporter que ces deux personnes mentionnées et c'était capable de résoudre toutes les tâches à la main.

RFC 7231 Définit POST de manière à ce qu'il puisse être utilisé comme outil à outils tout usage que vous devez utiliser surtout lorsque la sémantique de Les autres opérations ne correspondent pas à la tâche à la main. Cela ne signifie toutefois pas que vous ne devez utiliser que POST à partir de maintenant. C'est à dire. Si vous gérez avec des transactions monétaires, vous souhaitez utiliser Met, en raison de la promesse idempotente qu'il donne aux clients, comme indiqué par JIM Webber dans un grand Discussion de 2011. Même si tout semble être très rapide et presque local, nous avons toujours affaire à une infrastructure distante où des hick-ups du réseau ou d'autres erreurs temporaires peuvent survenir. En cas d'échec du réseau, il est bon de savoir pour un client si une demande peut aveuglément être renvoyée ou conduira à un autre traitement. Il a même évolué certains modèle de création autour de telles promesses.

La principale prémisse dans une architecture REST doit toujours être qu'un serveur devrait enseigner à un client sur ce qu'il peut faire ensuite. Un ensemble d'options est donné au client sous forme de liens qu'il peut invoquer si vous êtes intéressé par le contenu de ce lien. Basé sur la relation de liaison et d'autres données d'accompagnement, un client doit déterminer s'il est intéressé à récupérer cette information ou non. Un serveur peut enseigner à un client qu'il nécessite une entrée supplémentaire en envoyant une représentation de formulaire au client et en fonction de l'apportance des éléments contenus un client sait, Sans la nécessité d'une documentation externe, ce que le serveur attend et peut agir en conséquence. C'est fondamentalement ce que hateoas est tout. Donner une option client et l'enseignant ce que le serveur attend. Selon Jim Webber, vous utilisez fondamentalement Mettre en place un protocole d'application de domaine basé sur une machine à états finie qui progresse par des clients via des liens et des demandes d'entrée de formulaire.

Comme on peut le voir dans HTML, le type de support peut spécifier ou limiter davantage les opérations HTTP utilisables. Pour tous ces objectifs, les types de médias généraux Ce n'est probablement pas la norme, mais certains types de média, tels que HTML, font. Et vous devriez adhérer à ceux-ci si vous ne voulez pas courir dans des problèmes d'interopérabilité sur la route.

Cela pourrait-il apporter une certaine question que je ne vois pas en ce moment?

Comme mentionné ci-dessus, certaines opérations HTTP offrent différentes sémantiques et promesses aux clients. C'est à dire. Lorsqu'un problème de réseau se produit sur un PUT Demander qu'un client sait qu'il peut simplement renvoyer la demande sans aucune pensée plus profonde, car ses attentes sont que la demande sera traitée de manière idenpote conduisant au même résultat que demande a été reçue une fois ou plusieurs fois. Lors de l'utilisation de poteau, toutefois, le client ne peut pas être sûr si la demande n'a pas atteint le serveur ou la réponse de cette demande vient de se perdre à mi-chemin. Le client n'a aucune garantie dans ce cas ce que la révision de la demande peut causer. Dans la vidéo de Jim Webber, j'ai lié, il explique clairement pourquoi vous voulez utiliser mis pour de tels cas. Notez que vous pouvez techniquement gérer POST pour se comporter toujours idempotent sur le côté serveur et ne pas se comporter de l'idempotent du tout, cela n'a pas d'importance pour un client car c'est sûrement un problème de serveur. C'est la même chose que si vous exposiez une commande de commande 10000 de l'article X via une invocation de méthode GET et maintenant Google vient maintenant et invoque que URI. Un client ne peut pas être rendue responsable de ces implémentations négligées.

RFC 7231 déclare explicitement en ce qui concerne la sécurité, i.e.:

Cette définition des méthodes sûres n'empêche pas une mise en œuvre d'inclure le comportement potentiellement préjudiciable, qui n'est pas entièrement en lecture seule, ou qui provoque des effets secondaires tout en invoquant une méthode sûre. Ce qui est important, cependant, est que le client n'a pas demandé un comportement supplémentaire et ne peut être tenu responsable pour cela.

Alors, longue histoire courte, pouvez-vous utiliser POST comme remplacement pour mettre? Oui, vous pouvez. Mais vous ne devriez pas l'utiliser aveuglément. Surtout si les données doivent être idempotentes, vous devriez utiliser Publier à la place de la poste, même si vous pourriez techniquement traiter POST de la même manière que mettre, la promesse que la spécification donne aux clients est claire et si vous les violez, les clients doivent non rendue responsable de vos erreurs.

0
Roman Vottner