Un canari dans une mine de charbon.
Cela fait près d'un an que j'attends une question comme celle-ci. Il était inévitable que ce jour arrive et je suis sûr que nous allons voir beaucoup d'autres questions de ce genre dans les mois à venir.
Les signes d'alerte
Vous avez tout à fait raison, il faut plus de temps pour construire des clients RESTful que des clients SOAP. Les boîtes à outils SOAP éliminent une grande partie du code standard et mettent à disposition des objets proxy clients presque sans effort. Avec un outil comme Visual Studio et une URL de serveur, je peux accéder localement à des objets distants d'une complexité arbitraire en moins de cinq minutes.
Les services qui renvoient des applications/xml et des applications/json sont si ennuyeux pour les développeurs de clients. Que sommes-nous censés faire avec cette masse de données ?
Heureusement, de nombreux sites qui proposent des services REST fournissent également un ensemble de bibliothèques clientes afin que nous puissions utiliser ces bibliothèques pour accéder à un ensemble d'objets fortement typés. C'est quand même un peu bête. S'ils avaient utilisé SOAP, nous aurions pu coder ces classes proxy nous-mêmes.
La surcharge SOAP, ha. C'est la latence qui tue. Si les gens sont vraiment préoccupés par le nombre d'octets excédentaires qui transitent sur le fil, alors HTTP n'est peut-être pas le bon choix. Avez-vous vu combien d'octets sont utilisés par l'en-tête user-agent ?
Ouais, avez-vous déjà essayé d'utiliser un navigateur web comme outil de débogage pour autre chose que du HTML et du javascript. Croyez-moi, ça craint. Vous ne pouvez utiliser que deux des verbes, le cache est constamment dans le chemin, la gestion des erreurs avale tellement d'informations, il est constamment à la recherche d'un putain de favicon.ico. Tuez-moi.
URL lisible. Seulement des noms, pas de verbes. Oui, c'est facile tant que nous ne faisons que des opérations CRUD et que nous n'avons besoin d'accéder à une hiérarchie d'objets que d'une seule manière. Malheureusement, la plupart des applications ont besoin d'un peu plus de fonctionnalités que cela.
La catastrophe imminente
Un grand nombre de développeurs développent actuellement des applications qui s'intègrent aux services REST et sont en train d'arriver aux mêmes conclusions que vous. On leur a promis la simplicité, la flexibilité, l'extensibilité, l'évolutivité et le Saint Graal de la réutilisation fortuite. Les caractéristiques du web lui-même, comment les choses peuvent-elles mal tourner ?
Cependant, ils constatent que le versionnage est tout aussi problématique, mais que le compilateur ne permet pas de détecter les problèmes. Le code client écrit à la main est difficile à maintenir, car les structures de données évoluent et les URL sont remaniées. Concevoir des API autour de simples noms et de quatre verbes peut s'avérer très difficile, surtout avec les zélateurs des URL RESTful qui vous disent quand vous pouvez ou non utiliser des chaînes de requête.
Les développeurs vont commencer à se demander pourquoi nous gaspillons nos efforts à supporter les deux formats Json et Xml, pourquoi ne pas concentrer nos efforts sur un seul et le faire bien ?
Comment les choses ont-elles pu si mal tourner ?
Je vais vous dire ce qui a mal tourné. En tant que développeurs, nous avons laissé les services marketing profiter de notre principale faiblesse. Notre éternelle recherche de la solution miracle nous a aveuglés sur la réalité de ce qu'est REST. En apparence, REST semble si facile et si simple. Nommez vos ressources avec des Urls et utilisez GET, PUT, POST et DELETE. Bon sang, nous, les développeurs, savons déjà comment faire, nous nous occupons depuis des années de bases de données avec des tables, des colonnes et des instructions SQL avec SELECT, INSERT, UPDATE et DELETE. Cela aurait dû être un jeu d'enfant.
Certaines personnes discutent d'autres parties de REST, comme l'autodescription et la contrainte d'hypermédia, mais ces contraintes ne sont pas aussi simples que l'identification des ressources et l'interface uniforme. Elles semblent ajouter de la complexité là où le but recherché est la simplicité.
Cette version édulcorée de REST s'est imposée dans la culture des développeurs de plusieurs manières. Des cadres de serveur ont été créés qui encourageaient l'identification des ressources et l'interface uniforme, mais ne faisaient rien pour supporter les autres contraintes. Des termes ont commencé à circuler pour différencier les approches (HI-REST vs LO-REST, Corporate REST vs Academic REST, REST vs RESTful).
Quelques personnes ont crié que si vous n'appliquez pas toutes les contraintes, ce n'est pas REST. Vous n'en tirerez pas les avantages. Il n'y a pas de demi-REST. Mais ces voix ont été étiquetées comme étant des fanatiques religieux qui étaient contrariés que leur précieux terme ait été volé de l'obscurité et rendu courant. Des personnes jalouses qui essaient de faire passer REST pour plus difficile qu'il ne l'est.
REST, le terme, est définitivement devenu courant. Presque toutes les grandes entreprises du web qui ont une API supportent "REST". Twitter et Netflix en sont deux exemples très connus. Ce qui est effrayant, c'est que je ne connais qu'une seule API publique qui soit autodescriptive et qu'il n'y en a qu'une poignée qui applique vraiment la contrainte hypermédia. Bien sûr, certains sites comme StackOverflow et Gowalla prennent en charge les liens dans leurs réponses, mais leurs liens présentent d'énormes lacunes. L'API de StackOverflow n'a pas de page racine. Imaginez le succès du site Web s'il n'y avait pas de page d'accueil pour le site Web !
Vous avez été induit en erreur, j'en ai peur.
Si vous êtes arrivé jusqu'ici, la réponse courte à votre question est que ces API (Netflix et Twitter) ne se conforment pas à toutes les contraintes et que vous ne bénéficierez donc pas des avantages que les API REST sont censées apporter.
Les clients REST sont plus longs à 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 ? Qu'en est-il d'un lecteur de flux ? À combien de services différents le client Twitter moyen peut-il accéder ? Oui, un seul.
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 des types de médias spécifiques qui pourraient être servis par n'importe quel service. La question évidente est la suivante : comment construire un client REST pour un service qui fournit des applications/json ou des applications/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 ce qui qui reviendra dans le tuyau, car car il n'y a pas de véritable schéma ou document
Vous avez tout à fait raison pour des services comme Twitter. Cependant, la contrainte d'autodescription de REST stipule que l'en-tête de type de contenu HTTP doit décrire exactement le contenu qui est transmis sur le fil. Transmettre application/json et application/xml ne vous dit rien sur le contenu.
Lorsqu'il s'agit de considérer les performances des systèmes basés sur REST, il est nécessaire d'avoir une vue d'ensemble. Parler d'octets d'enveloppe, c'est comme parler de déroulement de boucle en comparant un tri rapide à un tri shell. Il y a des scénarios où SOAP peut être plus performant, et il y a des scénarios où REST peut être plus performant. Le contexte est essentiel.
REST tire une grande partie de son avantage en termes de performances en étant très souple quant aux types de médias qu'il prend en charge et en disposant d'un support sophistiqué pour la mise en cache. Pour que la mise en cache fonctionne bien, il faut toutefois respecter presque toutes les contraintes.
Votre dernier point concernant les urls lisibles est de loin le plus ironique. Si vous vous engagez réellement à respecter la contrainte de l'hypermédia, alors chaque URL pourrait être un GUID et le développeur du client ne perdrait rien en lisibilité.
Le fait que les URI doivent être opaques pour le client est l'un des éléments les plus importants lors du développement de systèmes REST. Des URL lisibles sont pratiques pour le développeur du serveur et des URL bien structurées facilitent la répartition des demandes par le cadre du serveur, mais il s'agit de détails de mise en œuvre qui ne devraient avoir aucun impact sur les développeurs qui utilisent l'API.
L'API Twitter est loin d'être RESTful et c'est pourquoi vous ne voyez aucun avantage à l'utiliser par rapport à SOAP. L'API de Netflix est beaucoup plus proche, mais son utilisation de types de médias génériques démontre que le non-respect d'une seule contrainte peut avoir un impact profond sur les avantages tirés du service.
Ce n'est peut-être pas entièrement de leur faute
Je me suis beaucoup déchargé sur les fournisseurs de services, mais il faut être deux pour danser de manière REST. Un service peut suivre toutes les contraintes religieusement et un client peut toujours facilement annuler tous les avantages.
Si un client code en dur les urls pour accéder à certains types de ressources, il empêche le serveur de modifier ces urls. Toute construction d'URL basée sur une connaissance implicite de la manière dont le service structure ses urls constitue une violation.
Faire des hypothèses sur le type de représentation qui sera renvoyé par un lien peut entraîner des problèmes. Faire des suppositions sur le contenu de la représentation en se basant sur des connaissances qui ne sont pas explicitement indiquées dans les en-têtes HTTP va certainement créer un couplage qui sera source de difficultés à l'avenir.
Auraient-ils dû utiliser SOAP ?
Personnellement, je ne le pense pas. REST bien fait permet à un système distribué d'évoluer sur le long terme. Si vous construisez des systèmes distribués dont les composants sont développés par différentes personnes et qui doivent durer de nombreuses années, alors REST est une très bonne option.
7 votes
Il faut savoir que REST n'a pas été "inventé", il existe depuis le début du HTTP.
6 votes
Une conversation entre vous et Roy Fielding serait très divertissante. :)
0 votes
Vous pourriez poser cette question sur la liste de diffusion rest-discuss, je suis sûr que vous obtiendriez quelques contre-arguments intéressants. Je suggérerais de reformuler quelques parties pour éviter la confrontation (si vous êtes intéressé par des réponses plutôt que d'essayer de blâmer quelqu'un, bien sûr). Voici l'adresse : tech.groups.yahoo.com/group/rest-discuss
1 votes
Quelques éléments pour commencer. Premièrement, déteste est un mot fort. Deuxièmement, notre industrie est remplie de plus d'une façon de faire les choses. Donc je ne vais pas entrer dans l'argument philosophique pour la existence de REST. En tant que bon vous devez être prêt à utiliser la technologie qui résout le mieux le problème. Pour certains services web, cela peut être REST. J'en ai écrit plus, mais ce sujet a été clos ;)
0 votes
@0xA3 ... "depuis le début de HTTP" ? Mais HTTP/0.9 n'avait pas de méthodes. HTTP/1.0 ne définissait que
get
,head
etpost
.0 votes
@Joe : Mais c'est tout ce dont vous avez besoin pour implémenter REST. Bien sûr, vous pouvez utiliser des méthodes HTTP/1.1 plus sophistiquées si elles sont disponibles, mais elles ne sont pas nécessaires.
0 votes
@Daniel Pryden : si vous n'avez pas de méthodes HTTP, vous avez un magasin de données en lecture seule, et pas différent d'un tas de fichiers XML sur un site Gopher. (J'allais dire "site FTP", mais même cela permettait de poster, de renommer, etc.)
0 votes
@Joe : Pour pinailler à nouveau, HTTP 0.9 a déjà mis en œuvre le
GET
verbe. Suffisant pour construire un service REST de base qui récupère des données.0 votes
@Joe : Quel est le problème avec POST ? C'est parfaitement acceptable comme verbe de soumission de document, et vous pouvez construire un service RESTful assez puissant en utilisant seulement GET et POST.
0 votes
@Daniel Pryden : 0xA3 dit clairement "depuis le début de HTTP", et HTTP/0.9. n'a pas include POST, car il n'avait aucun concept de méthodes (ou d'en-têtes d'ailleurs). Si vous voulez tous utiliser des mots à la mode et prétendre que mettre un tas de fichiers statiques dans un répertoire est un "webservice RESTful", alors n'hésitez pas... si c'est le cas, alors cela fait 16 ans que j'écris des "webservices". (et si vous incluez gopher, aussi ... eh bien, alors j'écrivais des services web avant même que "le web" n'existe.
0 votes
@Joe Wow. Qui se soucie de HTTP 0.9 ? Allez mec, tu sais ce que @0xA3 voulait dire ! Se disputer juste pour le plaisir de se disputer...
1 votes
@Joe : Bien vu. Mais une partie de l'ironie de REST est qu'il ne s'agit pas d'une "nouvelle" technologie, c'est juste un nouveau mot à la mode pour quelque chose qui fonctionne depuis le début des années 90. Et @jsm11482 : c'est exactement la raison pour laquelle cette question est fermée comme "subjective et argumentative" -- parce qu'elle attire les arguments !
2 votes
Ma réponse à cette question est ici bit.ly/cAdYAr
0 votes
Je pense qu'à cause de l'association de Microsoft avec SOAP, les gens choisissent REST. SOAP est tout simplement meilleur !