web-dev-qa-db-fra.com

Est-ce que ReST over websockets est possible?

Je prévois de développer une application de discussion en ligne qui prend en charge les requêtes ReSTful, les traduit en XMPP et les transmet à un serveur XMPP.

L'utilisation de websockets pour ce type d'application basée sur le chat semblait prometteuse, car les événements (ou les réponses) peuvent être livrés de manière asynchrone. Mais si j'utilise websockets comme protocole sous-jacent pour transférer les demandes du navigateur, cela peut-il toujours être considéré comme une conception ReSTful? Si oui, comment les paramètres d'URI, les verbes (GET, POST ...), sont-ils représentés dans le message websocket? Enveloppez-les dans un fichier xml/json et envoyez-le?

En outre, l'architecture ReSTful indique qu'aucun état de session ne sera stocké sur le serveur. Mais ici, dans ce cas, lorsqu'une session client XMPP est créée, l'état de cette session sera stocké sur le serveur (en violation de la contrainte sans état).

51

REST est un style architectural qui n'impose pas de protocole. Alors oui, vous pouvez utiliser REST avec Web Sockets, REST avec HTTP et REST avec FTP si vous le souhaitez.

La principale raison d'utiliser HTTP est qu'il est facile et assez simple de communiquer avec tout composant ou langage de programmation via HTTP et aussi parce que HTTP prend en charge les environnements distribués avec plusieurs intermédiaires: proxy, pare-feu, pare-feu ...; Ainsi, vous pouvez déployer votre service sur n’importe quelle topologie et tout le monde pourra y accéder.

Mon discours: Si vous êtes un RESTliban et que la thèse de Roy Fielding est la source de la vérité, les verbes ne sont jamais reconnus comme faisant partie de la sémantique. Les URI sont la sémantique. L'utilisation de verbes différents pour différentes actions constitue une évolution élégante de REST sur HTTP, mais ne fait pas partie de la "vérité". Vous pouvez vérifier le scénario de repos sur HTTP évalué par Roy au chapitre six de sa thèse. Aucune mention aux verbes. Et remarquez que c'est un scénario d'évaluation, pas la spécification.

TLDR;

Si vous avez besoin d'une communication bidirectionnelle en temps réel via Internet et que le client est un navigateur Web, le meilleur choix est Web Sockets. Vous pouvez ensuite implémenter un protocole de niveau application sur les sockets Web pour implémenter un service Web RESTful.

55
Daniel Cerecedo

Oui. Vous pouvez utiliser REST sur WebSocket avec une bibliothèque telle que SwaggerSocket.

15
jdelobel

Pourquoi voudriez-vous créer une API REST au-dessus du socket? IMHO, l'avantage d'une API REST est d'exploiter les possibilités du protocole HTTP standard telles que les demandes sans état, les verbes sémantiques tels que GET, DELETE pour créer une API facilement compréhensible par les développeurs (clients). Puisque les sockets n'offrent pas de verbes HTTP, etc., vous construirez une sorte de couche HTTP pour les sockets, ce qui n'est pas raisonnable, à mon humble avis.

Au cas où vous construiriez vraiment une telle chose, je recommanderais d'utiliser le protocole HTTP en tant que modèle et d'implémenter le protocole de socket comme HTTP.

8
saintedlama

Je ne comprends pas pourquoi vous convertissez XMPP en REST, puis vous exécutez REST sur WS. Le but de WebSocket est de transférer le protocole XMPP directement au navigateur, évitant ainsi tous les problèmes de traduction.

Certaines bibliothèques JavaScript peuvent communiquer avec XMPP du navigateur au serveur. Tout ce dont vous avez besoin est de mettre en proxy le trafic XMPP de WS sur TCP, puis directement sur votre serveur XMPP. Kaazing a une passerelle qui vous permet de le faire.

Si vous souhaitez utiliser une source ouverte, vous devez écrire une bibliothèque JavaScript XMPP. Il y a des exemples qui montrent comment écrire une bibliothèque JS pour des protocoles simples. Vous devez simplement en trouver un et étendre le concept au protocole XMPP.

Donc, pour récapituler, voici à quoi ressemblerait l'architecture:

Votre code de client XMPP <-> Bibliothèque JavaScript XMPP <-> WebSocket via http <-> WebSocket vers un proxy TCP <-> serveur XMPP

où le code du client XMPP et la bibliothèque JavaScript XMPP s'exécutent dans le navigateur, et les WS vers le proxy TCP avec le serveur XMPP sont tous côté serveur.

1
Axel

Le style architectural REST suppose principalement deux entités. client et serveur.

Au fur et à mesure que nous progressons vers le Web en temps réel et le développement de systèmes réactifs, WebSocket commencera à remplacer de manière visible l’utilisation des API REST.

WS autorise les transferts de données en push et pull, ce qui exclut les concepts de serveur et de client.

STOMP, AMQP, XMPP peuvent être utilisés comme protocoles de messagerie.

Les données elles-mêmes peuvent être des tampons de protocole JSON ou Google, ou peut-être Apache Avro.

WebSockets n'est pas lié aux serveurs Web, mais peut également être développé dans des applications autonomes telles que des applications mobiles ou des applications de bureau.

1
Rohitdev

J'ai créé un projet qui ajoute des rappels à la fonction d'envoi du socket Web: https://github.com/ModernEdgeSoftware/WebSocketR2

Les ID de message sont établis pour que le client puisse implémenter des rappels. Il gère les tentatives de message après expiration du délai et se reconnecte au serveur si la connexion est interrompue. Vous pouvez ensuite structurer votre charge afin qu'elle soit aussi RESTful que vous le souhaitez en ajoutant des verbes et des chemins.

Ceci est similaire à lorsqu'un studio de jeu vidéo utilise UDP pour atteindre les vitesses dont il a besoin, mais son code réseau implémente de nombreuses fonctionnalités similaires à TCP pour plus de fiabilité. 

0
Neo

Je comprends que cet article est vraiment vieux, mais je voulais revenir un peu plus loin sur l'idée que "si je choisis une architecture REST, je perds la possibilité de communiquer en temps réel?".

En un mot, non. Un certain nombre d’implémentations de style REST que j’ai expérimentées avec l’utilisation de REST pour la compatibilité, la détectabilité et le moyen de passer de différents périphériques à l’ombre de l’IoT. 

Cependant, en plus d'utiliser WS en plus de REST pour faciliter la transmission en temps quasi réel. Il existe également un certain nombre d'abstractions qui vous aident vraiment dans cette tâche et vous permettent de vous concentrer sur la construction de votre API et sur le fonctionnement des composants RT des applications consommatrices. 

Je suggérerais de jeter un coup d'œil à des choses comme Tibco Smart-Sockets ou SignalR si vous souhaitez créer une API REST et que vous souhaitez éviter de recréer la roue pour vos besoins RT.

0
iHazCode

Je viens de repérer un nouveau sujet sur le blog d’une société qui fournit une solution cloud et «Serveur/Service en tant que plate-forme» (SaaS) pour les jeux. 

Je ne fais pas de publicité pour cette société, je ne les ai pas utilisées, alors je ne sais même pas à quel point elles sont bonnes ou mauvaises.

Cependant, ils expliquent très clairement les raisons et les avantages de l’utilisation de WebSockets dans REST A lire sur leur blog

0
Briksins