Ainsi, un service RESTful a un ensemble fixe de verbes dans son vocabulaire. Un service Web RESTful les prend des méthodes HTTP. Il y a certains avantages supposés à définir un vocabulaire fixe, mais je ne comprends pas vraiment le point. Peut-être que quelqu'un peut l'expliquer.
Pourquoi un vocabulaire fixe tel que décrit par REST est-il meilleur que de définir dynamiquement un vocabulaire pour chaque état? Par exemple, la programmation orientée objet est un paradigme populaire. RPC est décrit pour définir des interfaces fixes, mais je ne sais pas pourquoi les gens supposent que RPC est limité par ces contraintes. Nous pourrions spécifier dynamiquement l'interface tout comme un service RESTful décrit dynamiquement sa structure de contenu.
REST est censé être avantageux en ce sens qu'il peut se développer sans étendre le vocabulaire. Les services RESTful se développent dynamiquement en ajoutant plus de ressources. Qu'y a-t-il de si mal à étendre un service en spécifiant dynamiquement un vocabulaire par objet? Pourquoi ne pas simplement utiliser les méthodes définies sur nos objets comme vocabulaire et demander à nos services de décrire au client quelles sont ces méthodes et si elles ont ou non des effets secondaires?
Essentiellement, j'ai l'impression que la description d'une structure de ressources côté serveur équivaut à la définition d'un vocabulaire, mais nous sommes alors obligés d'utiliser le vocabulaire limité dans lequel interagir avec ces ressources.
Un vocabulaire fixe dissocie-t-il vraiment les préoccupations du client des préoccupations du serveur? Je dois sûrement m'inquiéter de la configuration du serveur, c'est normalement l'emplacement des ressources dans les services RESTful. Se plaindre de l'utilisation d'un vocabulaire dynamique semble injuste car il nous faut de toute façon raisonner de manière dynamique pour comprendre cette configuration. Un service RESTful décrit les transitions que vous pouvez effectuer en identifiant la structure d'objet via hypermédia.
Je ne comprends tout simplement pas ce qui rend un vocabulaire fixe meilleur que tout vocabulaire dynamique auto-descriptif, qui pourrait facilement très bien fonctionner dans un service de type RPC. Est-ce juste un mauvais raisonnement pour limiter le vocabulaire du protocole HTTP?
Réflexion
Juste pour clarifier mes pensées un peu mieux que moi. Supposons que vous conceviez une API à usage général, peut-être même pas orientée Web. Seriez-vous heureux si quelqu'un dit que vous ne pouvez utiliser ces noms de méthode que sur vos objets? REST n'est pas limité à HTTP, mais considérez la situation où chaque API que vous écrivez, orientée Web ou autrement constituée simplement d'objets contenant les méthodes GET POST PUT et DELETE. Donc, la méthode object.foo que vous vouliez définir n'est pas possible. Vous devez définir un nouvel objet appelé foo et appeler sa méthode GET. C'est essentiellement ainsi que fonctionne REST, et cela me met un peu mal à l'aise d'y penser. Vous n'avez pas une meilleure compréhension générique de ce que fait foo, vous avez juste été obligé de créer un nouvel objet pour ce qui est essentiellement une méthode sur un objet parent. De plus votre API n'est pas moins complexe, vous venez de masquer la complexité de l'interface en créant plus d'objets. Les services Web RESTful nous obligent à adopter une interface qui peut être suffisante ou non dans le contexte de l'API que nous exposons. Il y a peut-être une bonne raison de le faire avec des API Web, mais une bonne raison de ne pas adopter des interfaces standard pour chaque objet dans chaque API à usage général. Un exemple pratique serait apprécié.
la source
Réponses:
La terminologie «verbe» et «nom» est quelque peu malheureuse ici. Comme vous l'avez déjà mentionné, vous pouvez facilement créer un objet pour la fonction. Tous les langages orientés objet, à l'exception de Java, ont cette transformation intégrée et en Java, vous finissez par le faire tout le temps de toute façon, vous vous retrouvant avec beaucoup d'objets avec une seule méthode et souvent un appelé "invoquer", "exécuter", "appliquer" ou quelque chose comme ça (c'est donc les langages de programmation où la distinction "verbe" / "nom" n'a pas de sens).
Les "verbes" de REST sont plus comme classer vos méthodes en getters, setters (deleters; peuvent être considérés comme des setters) et autres. Et essayer de tout faire avec des getters et des setters. La raison en est:
HTTP a été conçu dès le départ avec à la fois les caches et la tolérance aux pannes, donc ces deux points conduisent à quatre méthodes de base:
GET
est un getter. Il est supposé ne pas modifier l'état du serveur et renvoyer la même valeur à chaque fois avec possibilité de spécifier la politique d'expiration et de revalidation.PUT
etDELETE
sont le setter et le deleter (= setter avec nil). Ils ne sont normalement pas utilisés dans le contexte d'un site Web normal, mais ont un sens pour REST.POST
est un évier de cuisine générique "invoke" pour lequel les caches ne peuvent rien supposer.REST est un modèle de conception décrivant comment utiliser HTTP brut ou des protocoles réseau similaires pour implémenter une interface qui permet de gérer facilement les échecs par une nouvelle tentative et qui fonctionne bien avec les procurations de mise en cache.
Il ne correspond pas facilement à l'API de programmation orientée objet classique. Je pense que c'est en fait une bonne chose. Les défis de l'interfaçage sur le réseau, qui sont intrinsèquement peu fiables et où les allers-retours sont beaucoup plus lents que le transfert d'une quantité même modérée de données nécessitent une approche de conception différente de celle de l'API en cours de traitement, donc quand cela semble différent, les gens n'essaient pas d'appliquer une expérience invalide de l'autre domaine (c'est le fléau de SOAP, XML-RPC et autres; cela ressemble à des appels de procédure, mais ne fonctionne pas comme ça et finit par être pénible à travailler).
la source
L'idée essentielle est que la complexité est exprimée à travers la représentation des ressources, et donc des verbes supplémentaires ne sont pas nécessaires. Comme certains l'ont dit - "Dans REST, les noms sont bons, les verbes sont mauvais."
Si vous regardez les quatre verbes REST, ils peuvent être mappés aux opérations CRUD de base, vous permettant essentiellement de faire ce que vous voulez avec vos ressources. C'est -
De quoi d'autres avez-vous besoin?
la source
Considérons un langage où toutes les constructions (telles que les fonctions) sont des objets. Ensuite, les verbes RESTful appellent simplement des conventions et des instructions d'affectation. Pour JavaScript, vous pouvez définir une syntaxe de verbe fixe comme INVOKE pour appeler une fonction, DELETE (identique à delete dans js) pour supprimer un objet sur un autre objet, SET pour affecter une valeur et RETURN pour renvoyer une valeur. Nous pourrions utiliser les verbes HTTP pour signifier la fonction POST - invocation équivalente, PUT - assigner une valeur, GET - retourner une valeur, - DELETE - supprimer un objet. J'étais pris dans l'idée que les méthodes HTTP décrivaient en fait des méthodes d'objet, des interfaces d'objet réelles, que je n'arrivais pas à voir qu'elles pouvaient en fait décrire des concepts de niveau beaucoup plus bas, tels que les constructions de langage de base qui sont clairement fixes et finies en tout des langues sensées.
Et bien sûr, il est utile pour le routage / proxy d'avoir un vocabulaire fixe sur lequel réfléchir.
la source
Parce qu'un programmeur professionnel prévoit des centaines, sinon des milliers de noms de méthode autrement. Ce qui semble inutile à un petit plus petit peut être très important à mesure que l'application devient plus grande.
Parce qu'il n'y a pas besoin de normes sur les noms de méthode lorsqu'ils sont déjà définis.
Parce que l'objectif principal du code est d'être lisible sans ces traductions supplémentaires.
Parce qu'il encourage et aide à identifier «quand» une autre classe devrait être organisée.
Lorsque vous reprenez le code, il est raisonnable et réellement possible de comprendre quoi et comment il le fait beaucoup plus rapidement.
Il fournit un vocabulaire commun et donc un niveau d'abstraction afin que vous puissiez vous concentrer sur d'autres détails et voir les modèles.
Cela facilite la recherche de bogues car le code et les approches communs peuvent être facilement vérifiés.
Lorsque vous travaillez avec plusieurs `` couches '' comme celle du développement Web, savoir quelles URL correspondent à quels noms d'action est très pratique pour le débogage.
Dans l'ensemble, vous n'en avez pas «toujours» besoin, mais comme la plupart des normes, il est très logique de chercher à l'utiliser!
la source
L'alternative est quelque chose d'horrible: WSDL (aka Web Service Definition Language), qui est un moyen (maladroit) de décrire par programmation (quelque peu) arbitraire APIS.
REST limite sévèrement les verbes, poussant presque toutes les variations spécifiques à l'application dans la charge utile du document. L'avantage de cela est que de nombreuses implémentations client peuvent communiquer avec de nombreux services hétérogènes. Les clients et les serveurs peuvent être complètement inconnus les uns des autres, certains n'étant pas encore écrits.
Il y a un podcast dans lequel Stefan Tilkov explique bien REST .
la source
Oui, une api de repos a un ensemble fixe de verbes, mais il ne doit pas être limité à (ou inclure GET, POST, PUT, DELETE). Je considérerais GET, POST, PUT, DELETE comme une implémentation par défaut de REST qui fonctionne pour 80% de tous les systèmes.
D'autres systèmes qui implémentent plus que des opérations crud peuvent (et font) implémenter leurs propres verbes pour leurs API REST. Des verbes comme publier, consommer, noter, commenter, rechercher, parcourir peuvent être ajoutés et implémentés dans un système REST. Alors que certains pourraient dire qu'un vocabulaire plus large pourrait le rendre plus compliqué, ma réponse est que cela dépend. Si votre utilisateur cible est un responsable technique qui comprend ce qu'est un POST, alors oui, cela pourrait être plus compliqué; cependant, si les utilisateurs cibles de votre API sont de vraies personnes (c'est-à-dire des personnes qui ne codent pas et ne savent pas ce qu'est un POST), les vrais verbes sont beaucoup plus faciles à utiliser. En fait, avoir un ensemble approprié de verbes pour votre API aide à garder les URL courtes (ce qui est important si vous voulez que les utilisateurs les tapent dans un navigateur. Si vous utilisez un vocabulaire personnalisé, vous ' Je veux m'assurer que votre API et ses verbes sont bien documentés. Lorsque vous utilisez une API REST personnalisée, vous souhaitez vous assurer que vos «actions en lecture seule» en tant que HTTP GET et «écrire des actions» avec POST.
Le réseau social pour adolescents, Piczo.com, (qu'il repose en paix) comportait une API REST étendue (y compris les verbes mentionnés ci-dessus) qui a été mise en œuvre dans 7 langues différentes!
la source
C'est simple c'est bien.
Il y a des cas où vous avez besoin de verbes et de complexité supplémentaires, mais la plupart des problèmes peuvent être réduits à de simples actions CRUD sur les ressources, et c'est ce que REST essaie de promouvoir. Lorsque vous pensez à la plupart des applications Web, au final, elles lisent et conservent les enregistrements dans un magasin de données, qui utilisent les mêmes actions très simples.
object.foo () est tout bon, mais que fait-il? Que revient-il? Modifie-t-il l'état de l'objet ou l'une de ses dépendances? Pouvez-vous l'appeler deux fois et obtenir le même résultat ou cela vous donnera-t-il deux valeurs différentes? Si vous avez également object.bar (), doivent-ils être appelés dans un ordre spécifique?
Il faut beaucoup de connaissances pour utiliser une API riche, et elles ont généralement leurs propres conventions (c'est-à-dire que setFoo va muter l'objet, getBar est probablement idempotent, dispose () ou destroy () signifie qu'il n'y a pas d'autres appels sur le même objet sera possible, etc ...)
la source