Un service Web de type Netflix ou Twitter devrait-il utiliser REST ou SOAP? [fermé]
J'ai implémenté deux services REST: Twitter et Netflix. Les deux fois, j'ai eu du mal à trouver l'utilisation et la logique impliquées dans la décision d'exposer ces services comme REST au lieu de SOAP. J'espère que quelqu'un peut me renseigner sur ce qui me manque et expliquer pourquoi REST a été utilisé comme implémentation de service pour des services tels que ceux-ci.
1) L'implémentation D'un service REST prend infiniment plus de temps que l'implémentation d'un service SOAP. Des outils existent pour tous les langages/frameworks/plates-formes modernes à lire un WSDL et des classes de proxy de sortie et des clients. L'implémentation D'un service REST se fait à la main et - obtenez ceci - en lisant la documentation. En outre, lors de la mise en œuvre de ces deux services, vous devez faire des "suppositions" sur ce qui va revenir à travers le tuyau car il n'y a pas de véritable schéma ou document de référence.
2) Pourquoi écrire un service REST qui renvoie XML de toute façon? La seule différence est qu'avec REST vous ne connaissez pas les types que chaque élément / attribut représente - Vous êtes seul à implémenter et espérons qu'un jour une chaîne ne se rencontre pas dans un champ que vous pensiez toujours être un int. SOAP définit la structure de données en utilisant le WSDL, donc c'est une évidence.
3) j'ai entendu la plainte qu'avec SOAP vous avez le "overhead" de L'enveloppe SOAP. De nos jours, Avons-nous vraiment besoin de s'inquiéter d'une poignée d'octets?
4) j'ai entendu l'argument qu'avec REST vous pouvez simplement pop L'URL dans le navigateur et voir les données. Bien sûr, si votre service de repos est en utilisant simple ou pas d'authentification. Le service Netflix, par exemple, utilise OAuth qui vous oblige à signer des choses et à encoder des choses avant même de pouvoir soumettre votre demande.
5) Pourquoi avons-nous besoin d'une URL" lisible " pour chaque ressource? Si nous utilisions un outil pour implémenter le service, Nous soucions-nous vraiment de l'URL réelle?
5 réponses
Un canari dans une mine de charbon.
J'attends une question comme celle - ci depuis près d'un an maintenant. Il était inévitable que ce jour Vienne et je suis sûr que nous verrons beaucoup plus de questions comme celle-ci dans les mois à venir.
Les signes d'alerte
Vous avez absolument raison, il faut plus de temps pour construire des clients RESTful que des clients SOAP. Les boîtes à outils SOAP enlèvent beaucoup de code standard et rendent les objets proxy clients disponibles avec presque aucun effort. Avec un outil comme Visual Studio et une URL de serveur, je peux accéder à des objets distants de complexité arbitraire, localement en moins de cinq minutes.
Les Services qui renvoient application / xml et application/json sont tellement ennuyeux pour les développeurs clients. Que sommes-nous censés faire avec ce tas de données?
Heureusement, beaucoup de sites qui fournissent des services REST fournissent également un tas de bibliothèques clientes afin que nous puissions utiliser ces bibliothèques pour avoir accès à un tas de bibliothèques fortement typées objet. Semble un peu stupide cependant. S'ils avaient utilisé SOAP, nous pourrions avoir code-gen'D ces classes proxy nous-mêmes.
Tête de savon, ha. Il est temps de latence qui tue. Si les gens sont vraiment préoccupés par le nombre d'octets excédentaires traversant le fil, alors peut-être que HTTP n'est pas le bon choix. Avez-vous vu combien d'octets sont utilisés par l'-tête user-agent?
Ouais, avez - vous déjà essayé d'utiliser un navigateur web comme outil de débogage pour autre chose que HTML et javascript. Faites-moi confiance elle le suce. Vous ne pouvez utiliser que deux des verbes, la mise en cache est constamment gênante, la gestion des erreurs avale tellement d'informations, elle cherche constamment un putain de favicon.ico. Il suffit de tirer sur moi.
URL lisible. Uniquement les noms, pas de verbes. Oui, c'est facile tant que nous ne faisons que des opérations CRUD et que nous n'avons besoin que d'accéder à une hiérarchie d'objets d'une manière. Malheureusement, la plupart des applications ont besoin d'un peu plus de fonctionnalités que cela.
L'imminence de La catastrophe
Il y a une cargaison métrique de développeurs qui développent actuellement des applications qui s'intègrent aux services REST qui sont en train d'arriver à la même série de conclusions que vous avez. On leur promettait simplicité, flexibilité, évolutivité, évolutivité et le Saint Graal de la réutilisation fortuite. Les caractéristiques du web lui-même, comment les choses peuvent mal tourner.
Cependant, ils constatent que le versionnage est tout aussi problématique, mais pas le compilateur aider à détecter les problèmes. Le code client écrit à la main est une douleur à maintenir à mesure que les structures de données évoluent et que les URL sont refactorisées. Concevoir des API autour de noms et de quatre verbes peut être très difficile, en particulier avec les zélotes D'Url RESTful vous indiquant quand vous pouvez et ne pouvez pas utiliser des chaînes de requête.
Les développeurs vont commencer à se demander pourquoi gaspillons-nous nos efforts sur le support des formats JSON et Xml, pourquoi ne pas simplement concentrer nos efforts sur un et le faire bien?
Comment ça s'est passé si mal
Je vais vous dire ce qui a mal tourné. En tant que développeurs, nous laissons les départements marketing profiter de notre principale faiblesse. Notre recherche éternelle de la balle d'argent nous a aveuglés à la réalité de ce QU'est vraiment le repos. Sur le repos de surface semble si facile et simple. Nommez vos ressources avec des URL et utilisez GET, PUT, POST et DELETE. Enfer, les développeurs américains savent déjà comment faire cela, nous avons eu affaire à des bases de données pendant des années qui ont des tables et des colonnes et des instructions SQL qui ont Sélectionner, Insérer, mettre à jour et supprimer. Ça aurait dû être un morceau de gâteau.
Il y a d'autres parties de REST que certaines personnes discutent, telles que l'auto-descriptivité et la contrainte hypermédia, mais ces contraintes ne sont pas aussi simples que l'identification des ressources et l'interface uniforme. Le semble ajouter de la complexité où l'objectif souhaité est la simplicité.
Cette version édulcorée de REST est devenue validée dans la culture des développeurs à bien des égards. Les frameworks de serveur ont été créés a encouragé L'Identification des ressources et l'interface uniforme, mais n'a rien fait pour soutenir les autres contraintes. Les Termes ont commencé à flotter autour de la différenciation des approches, (Salut-repos vs LO-repos, repos D'entreprise vs repos académique, repos vs RESTful).
Quelques personnes crient que si vous n'appliquez pas toutes les contraintes, ce n'est pas du repos. Vous ne recevrez pas les avantages. Il n'y a pas de demi-repos. Mais ces voix ont été étiquetés comme des zélotes religieux qui étaient contrariés que leur précieux terme avait été volé de l'obscurité, et fait ordinaire. Les gens jaloux qui essaient de rendre le repos plus difficile qu'il ne l'est.
REST, le terme, est définitivement devenu courant. Presque toutes les propriétés Web majeures qui ont une API prennent en charge"REST". Twitter et Netflix sont deux très médiatisés. La chose effrayante est que je ne peux penser qu'à une API publique qui est auto-descriptive et il y en a une poignée qui implémentent vraiment la contrainte hypermédia. Bien sûr certains sites comme StackOverflow et Gowalla liens de soutien dans leurs réponses, mais il y a d'énormes trous béants dans leurs liens. L'API StackOverflow n'a pas de page racine. Imaginez le succès du site web aurait été s'il n'y avait pas de page d'accueil pour le site web!
Vous avez été induit en erreur, j'ai peur
Si vous l'avez fait jusqu'ici, la réponse courte à votre question Est que ces API (Netflix et Twitter) ne sont pas conformes à toutes les contraintes et que vous n'obtiendrez donc pas les avantages que les API REST sont censées avoir apporter.
Les clients REST prennent plus de temps à construire que les clients SOAP, mais ils ne sont pas liés à un service spécifique, vous devriez donc pouvoir les réutiliser entre les services. Prenons l'exemple classique d'un navigateur web. Combien de services un navigateur Web peut-il Accéder? Que penser d'un Lecteur de Flux? Maintenant, combien de services différents le client Twitter moyen peut-il Accéder? Oui, juste un.
Les clients REST ne sont pas censés être construits pour s'interfacer avec un seul service, ils sont censés être construits pour Gérer les types de médias spécifiques qui pourraient être servis par n'importe quel service. La question évidente à cela est, comment pouvez-vous construire un client REST pour un service qui fournit application/json ou application/xml. Eh bien, vous ne pouvez pas. c'est parce que ces formats sont complètement inutiles pour un client REST. Vous l'avez dit vous-même,
Vous devez faire des" suppositions " sur quoi va revenir à travers le tuyau comme il n'y a pas de schéma ou de référence réel document
Vous avez tout à fait raison pour des services comme Twitter. Cependant, la contrainte auto-descriptive dans REST indique que L'en-tête de type de contenu HTTP doit décrire exactement le contenu qui est transmis à travers le fil. Fournir application / json et application/xml ne vous dit rien sur le contenu.
Quand il s'agit de considérer les performances des systèmes basés sur REST, il est nécessaire de regarder l'image plus grande. Parler d'octets d'enveloppe est comme parler de déroulement de boucle lors de la comparaison d'un tri rapide à un shell-sorte. Il y a des scénarios où SOAP peut mieux fonctionner, et il y a des scénarios où REST peut mieux fonctionner. Tout est dans le contexte.
REST gagne une grande partie de son avantage de performance en étant très flexible sur les types de médias qu'il prend en charge et en ayant un support sophistiqué pour la mise en cache. Pour que la mise en cache fonctionne bien, presque toutes les contraintes doivent être respectées.
Votre dernier point sur les URL lisibles est de loin le plus ironique. Si vous vous engagez vraiment à l'hypermédia contrainte, alors chaque URL pourrait être un GUID et le développeur client ne perdrait rien en lisibilité.
Le fait que les URI doivent être opaques pour le client est l'une des choses les plus clés lors du développement de systèmes REST. Les URL lisibles sont pratiques pour le développeur du serveur et les URL bien structurées facilitent l'envoi des requêtes par le framework serveur, mais ce sont des détails d'implémentation qui ne devraient pas avoir d'impact sur les développeurs consommant L'API.
L'API Twitter est pas même près d'être reposant et c'est pourquoi vous êtes incapable de voir aucun avantage à l'utiliser sur du savon. L'API Netflix est beaucoup plus proche, mais son utilisation de types de médias génériques démontre que ne pas adhérer à une seule contrainte peut avoir un impact profond sur les avantages dérivés du service.
Ce n'est peut-être pas toute leur faute
J'ai fait beaucoup de dumping sur les fournisseurs de services, mais il faut deux pour danser avec repos. Un service peut suivre tous les contraintes religieusement et un client peut encore facilement annuler tous les avantages.
Si un client Code en dur des URL pour accéder à certains types de ressources, cela empêche le serveur de modifier ces URL. Toute construction d'URL basée sur une connaissance implicite de la façon dont le service Structure ses URL est une violation.
Faire des hypothèses sur le type de représentation qui sera renvoyé à partir d'un lien peut entraîner des problèmes. Faire des hypothèses sur le contenu de la représentation basé sur des connaissances qui ne sont pas explicitement énoncées dans les en-têtes HTTP va certainement créer un couplage qui causera de la douleur à l'avenir.
Auraient-ils dû utiliser du savon?
Personnellement, je ne pense pas. REST done right permet à un système distribué d'évoluer sur le long terme. Si vous construisez des systèmes distribués qui ont des composants développés par différentes personnes et qui doivent durer de nombreuses années, alors REST est une très bonne option.
SOAP est un orienté objet, appel de procédure à distance pile technologique. Cela fonctionne en construisant une nouvelle abstraction au-dessus d'un protocole existant (HTTP).
REST est une approche orientée document , qui utilise simplement les fonctionnalités d'un protocole existant (HTTP). "REST" est juste un mot à la mode - le concept est le suivant: il suffit D'utiliser le web comme il était conçu pour fonctionner!
En réponse aux modifications apportées à la question:
-
"mise en Œuvre d'un Le service REST prend infiniment plus de temps que l'implémentation d'un service SOAP."
Euh, non, il ne peut pas être infiniment plus. Et dans les cas où ce que vous essayez de récupérer est déjà un document ou un fichier , c'est en fait beaucoup plus rapide. Par exemple, la spécification OGC pour WMS (Web Mapping Service) définit à la fois une version SOAP et REST du protocole, et il y a une raison pour laquelle presque personne n'implémente la version SOAP-c'est parce que si vous essayez d'obtenir une carte, c'est il est beaucoup plus facile de simplement construire une URL et de récupérer des octets d'image à partir de cette URL que de l'encapsuler dans un message SOAP. Mais oui, je conviendrai que si le but du service web est de transférer un objet fortement typé dans un modèle d'objet de domaine, SOAP est mieux adapté à cet usage.
-
"Pourquoi écrire un service REST qui renvoie XML de toute façon?"
Eh bien, oui, ça peut être idiot. Mais cela dépend de ce QU'est le XML. S'il y a un schéma clairement défini pour cela quelque part, alors il n'y a pas d'ambiguïté. Par exemple, vous pouvez considérer les URL WSDL comme une sorte de service Web RESTful pour récupérer des informations sur un service web. Dans ce cas, l'ajout de la surcharge d'une autre requête SOAP serait inutile.
En général, REST gagne lorsque le contenu transféré peut être considéré comme un fichier , comme une seule unité . Soap gagne lorsque le contenu doit être traité comme un objet avec membres .
-
"j'ai entendu la plainte qu'avec du savon, vous avez le "frais généraux" de L'enveloppe de savon. De nos jours, Avons-nous vraiment besoin de s'inquiéter d'une poignée d'octets?"
Oui. Pas dans toutes les circonstances, mais il y a des sites avec beaucoup de trafic où cela fait une différence. Est-ce assez de différence pour l'emporter sur les différences sémantiques de L'utilisation de SOAP au lieu de REST? J'en doute. Si vous effectuez un protocole d'accès à distance d'objet et le nombre d'octets fait une différence, SOAP n'est probablement pas l'outil pour vous de toute façon-peut-être que vous devriez utiliser CORBA ou DCOM à la place.
-
"j'ai entendu l'argument selon lequel avec REST vous pouvez simplement pop L'URL dans le navigateur et voir les données."
Oui, et c'est un grand argument en faveur de REPOS si elle fait sens pour afficher les données dans un navigateur. Par exemple, avec les données d'image, c'est un moyen facile de déboguer le service - il suffit de coller l'URL dans la barre d'adresse de votre navigateur et voir à quoi ressemble l'image. Ou si les données renvoyées sont en XML et que vous avez une feuille de style XML référencée qui se transforme en HTML lisible dans le navigateur, vous bénéficiez du balisage sémantique et de la visualisation facile dans un seul paquet. Mais vous avez raison, cet avantage s'évapore principalement lorsque vous travaillez avec des schémas d'authentification plus complexes. Si vous ne pouvez pas encoder toutes vos informations d'authentification dans chaque requête HTTP , alors je dirais que ça ne compte pas du tout comme du repos.
-
"Pourquoi avons-nous besoin d'une URL "lisible" pour chaque ressource? Si nous utilisions un outil pour implémenter le service, Nous soucions-nous vraiment de l'URL réelle?"
Eh bien, ça dépend. Pourquoi avons-nous besoin D'URL lisibles pour toute ressource sur le web? Vous pouvez lire L'essai de Tim Berners-Lee Les URI Cool ne changent pas pour la raison, mais fondamentalement, tant que la ressource peut encore être utile à l'avenir, L'URI pour cela ressource devrait rester la même.
Évidemment, pour les ressources transitoires (comme le lien "l'Argent d'aujourd'hui" dans l'essai), il n'y a pas besoin de cela, car le besoin de référencer la ressource disparaît si la ressource correspondante disparaît. Mais pour des ressources plus permanentes (comme des questions StackOverflow, par exemple, ou des films sur IMDB), vous voulez avoir une URL qui fonctionnera pour toujours. Lorsque vous concevez un service web, vous devez décider si les ressources elles-mêmes pourraient survivre à votre service, et si oui, alors le repos est probablement la bonne façon d'aller.
Pour mémoire, Oui, j'ai développé des pages web bien avant L'existence de NetFlix ou Twitter. Et Non, Je n'ai pas encore eu le besoin ou l'occasion d'implémenter un client sur les services de NetFlix ou de Twitter. Mais même si leurs services sont atroce difficile de travailler avec, cela ne signifie pas que la technologie qu'ils ont mis en œuvre leurs services sur le dessus est mauvaise-seulement que ces deux implémentations sont mauvais.
Pour faire court: REST et SOAP sont juste des outils . Ils ont chacun des forces et des faiblesses. Si le seul outil que vous avez est un marteau, alors chaque problème ressemble à un clou. Alors apprenez à connaître les deux outils, et apprenez à les utiliser correctement, puis choisissez le bon outil pour chaque travail.
Une question honnête mérite une réponse honnête. Mais d'abord, pourquoi avez-vous utilisé le texte de cette question comme réponse à une autre question Si vous ne pensiez pas que c'était de nature rhétorique?
Quoi Qu'il en soit:
-
"des outils existent pour tous les langages/frameworks/plates-formes modernes à lire dans un WSDL et des classes proxy de sortie et des clients. La mise en œuvre D'un service REST se fait à la main en lisant la documentation."
Tout comme les fournisseurs de navigateurs ont lu et relisez la spécification HTML 4.01 de haut en bas pour essayer de mettre en œuvre une expérience de navigation cohérente. Avez-vous réfléchi sur le fait que les navigateurs ont été inventés bien avant les services bancaires sur internet et stackoverflow, et pourtant, vous pouvez utiliser un navigateur pour faire ces choses. Ceci est rendu possible en raison de la seule raison que tout le monde accepte d'utiliser HTML (et les formats connexes comme CSS, JS, JPEG, etc.).
Blogging est en fait pas nouveau, et quelqu'un est venu avec AtomPub, qui permet à tout logiciel de blogging pour accéder et mettre à jour les messages dans un blog, un peu comme n'importe quel navigateur web peut accéder à n'importe quelle page web. C'est assez soigné, et fonctionne en raison des contraintes RESTful imposées par le protocole.
Mais pour Twitter et Netflix, il n'y a pas d'accord universel que "tous les microblogs existants doivent utiliser le type de média application/tweet", principalement parce que le microblogging est si Nouveau. Peut-être que dans quelques années, quelques services de micro-blogging s'installent sur la même API pour que Twitter, Facebook, Identica et peut interopérer. Aucune de leurs API existantes n'est proche de RESTful, même si elles le prétendent, donc je ne m'attends pas à ce que cela arrive très bientôt.
"En outre, lors de la mise en œuvre de ces deux services, vous devez faire des "suppositions" sur ce qui va revenir à travers le tuyau car il n'y a pas de véritable schéma ou document de référence."
Vous avez frappé le clou sur la tête. REST est tout au sujet distribué et hypermédia, et cela résume à peu près. Un navigateur regarde ce qu'il obtient d'une demande et le montre à l'utilisateur. Une page HTML génère généralement beaucoup plus de requêtes GET, par exemple CSS, scripts et images. Une image est généralement uniquement rendue à l'écran, JavaScript est exécuté, etc. Chaque fois, le navigateur fait ce qu'il fait car il a trouvé le lien dans une balise
<img>
ou<style>
et le type de support de réponse étaitimage/jpeg
outext/css
.Si Twitter crée une API hypermédia, il retournera probablement toujours un
application/tweet
chaque fois que vous suivez un lien vers un tweet, mais le client ne doit jamais assumer, et toujours vérifier ce qu'il obtient avant d'agir sur elle. -
"Pourquoi écrire un service REST qui renvoie XML de toute façon?"
Tout cela se résume aux types de médias. Comme HTML, si vous voyez un élément que vous n'avez aucune idée de ce que signifie réellement, la spécification HTML vous demande de les ignorer et de traiter le "corps" de la balise si elle en a une. De même, la spécification atom vous indique d'ignorer les éléments inconnus et le balisage étranger (à partir de différents espaces de noms) et Pas traiter le corps (IIRC).
La conception de types de média pour les domaines à problèmes génériques (comme dans le type de média HTML pour le domaine à problèmes rich text) est très difficile. Faire des types de Médias pour des domaines à problèmes très étroits est probablement beaucoup plus facile (comme un tweet). Mais c'est toujours une bonne idée de concevoir pour l'extensibilité et de spécifier comment les clients (et les serveurs) sont censés réagir lorsqu'ils voient des éléments ou des éléments de données qui ne correspondent pas specs. JPEG, par exemple, a un type d'enregistrement spécifique à L'Application (par exemple APP1) qui est utilisé pour contenir toutes sortes de métadonnées.
-
"j'ai entendu la plainte qu'avec du savon, vous avez le "frais généraux" de L'enveloppe de savon. De nos jours, Avons-nous vraiment besoin de s'inquiéter d'une poignée d'octets?"
NON, nous ne le faisons pas. le reste n'est absolument pas d'être efficace sur le fil, c'est en fait échanger l'efficacité du fil. L'efficacité de REST vient du possibilités de mise en cache activées par toutes les autres contraintes: dissertation de Fielding notes: le compromis, cependant, est qu'une interface uniforme dégrade l'efficacité, puisque l'information est transférée sous une forme standardisée plutôt que spécifique aux besoins d'une application. L'interface REST est conçue pour être efficace pour le transfert de données hypermédia à gros grains, optimisant pour le cas commun du Web, mais résultant en une interface qui n'est pas optimale pour d'autres formes de l'interaction architecturale. Je ne pense pas que la surcharge du nombre D'octets de L'enveloppe SOAP soit une préoccupation valide.
-
"j'ai entendu l'argument selon lequel avec REST vous pouvez simplement pop L'URL dans le navigateur et voir les données."
Oui, c'est aussi un argument invalide. Il ne fonctionne pas de cette façon. Même si cela a fonctionné, la plupart des API RESTétroites utilisent des types de médias que les navigateurs n'ont aucune idée et cela ne fonctionnera toujours pas.
Mais il y a un beaucoup plus de possibilités qu'un navigateur pour tester une API basée sur HTTP, comme les utilitaires de ligne de commande ou les extensions de navigateur qui vous permettent de contrôler presque tous les aspects d'une requête HTTP, d'inspecter les en-têtes de réponse et de découvrir des liens à suivre. Mais même ainsi, cela est loin d'être aussi facile que de générer des stubs WSDL et de créer un programme à trois lignes pour appeler la fonction de toute façon.
-
"Pourquoi avons-nous besoin d'une URL "lisible" pour chaque ressource? Si nous utilisions un outil pour mettre en œuvre le service, Nous soucions-nous vraiment de L'URL réelle?"
Si vous regardez comment fonctionne le web, Je suis sûr que les humains sont en général heureux que L'URI d'une page wikipedia ressemble à ceci,
http://en.wikipedia.org/wiki/Stack_overflow
au lieu dehttp://en.wikipedia.org/wiki/?oldid=376349090
. Mais il n'est pas important de se reposer. La chose importante à essayer de bien faire est de choisir de placer des données pertinentes dans L'URI qui ne sont pas susceptibles de changer. Vous pourriez penser que l'ID de base de données ne changera jamais, mais que se passe-t-il lorsque deux ensembles de données doivent être fusionné? Toutes vos clés primaires changent. Le titre de la page (Stack_overflow) ne changera pas.
Désolé pour la longue réponse, mais je crois que cette question est valide, et n'a pas été abordée auparavant ici sur SO. Je suis sûr que Darrel Miller ajoutera sa réponse une fois qu'il sera de retour aussi.
Modifier: formatage
Martin Fowler a un post sur le modèle de maturité Richardson qui fait un excellent travail pour expliquer la différence entre SOAP et REST.
WSDL et les autres protocoles de niveau document sont redondants. Le protocole HTTP prend en charge un ensemble d'opérations beaucoup plus riche en plus de servir des documents et de soumettre des formulaires.
Les partisans du repos sont mal à l'aise avec cette redondance.