rest - porque - socket io
¿Es posible utilizar ReST en websockets? (8)
¿Por qué querrías construir una API REST sobre el socket? En mi humilde opinión, el beneficio de una API REST es aprovechar las posibilidades estándar del protocolo HTTP, como solicitudes sin estado, verbos semánticos como GET, DELETE para construir una API que los desarrolladores (clientes) puedan entender fácilmente. Como los sockets no ofrecen verbos HTTP y demás, construiría algún tipo de capa HTTP para sockets que en mi humilde opinión no es razonable.
En caso de que realmente crees algo así, te recomiendo usar el protocolo HTTP como un plano e implementar el protocolo de socket como HTTP.
Estoy planeando desarrollar una aplicación de chat basada en web que contemple las solicitudes ReSTful, las traduzca a XMPP y las entregue a un servidor XMPP.
El uso de websockets para este tipo de aplicación basada en chat parecía prometedor ya que los eventos (o respuestas) se pueden entregar de forma asincrónica. Pero si uso websockets como el protocolo subyacente para transferir las solicitudes desde el navegador, ¿se puede considerar esto como un diseño ReSTful? En caso afirmativo, ¿cómo se representan los parámetros URI, verbos (GET, POST ...) en el mensaje websocket? ¿Envolverlos en un xml / json y enviarlos?
Además, la arquitectura ReSTful establece que no se almacenará ningún estado de sesión en el servidor. Pero aquí en este caso cuando se crea una sesión de cliente XMPP, el estado de esta sesión se almacenará en el servidor (violando la restricción sin estado)
Acabo de ver un nuevo tema en el blog de una compañía que proporciona una solución en la nube y "Servidor / Servicio como una plataforma" (SaaS) para juegos.
No estoy publicitando esta empresa, ni la usé, así que ni siquiera sé lo buenos o malos que son.
Sin embargo, explican muy claramente las razones y cuáles son los beneficios de usar WebSockets en REST. Leen en su blog
Creé un proyecto que agrega devoluciones de llamada a la función de envío de socket web: https://github.com/ModernEdgeSoftware/WebSocketR2
Los ID de mensaje se establecen para que el cliente pueda implementar devoluciones de llamada. Maneja reintentos de mensajes después de tiempos de espera y se reconecta con el servidor si se corta la conexión. A continuación, puede estructurar su carga útil para que sea lo RESTANTE que desee agregando verbos y rutas.
Esto es similar a cuando un estudio de videojuegos usa UDP para alcanzar las velocidades que necesitan, pero su código de red implementa una gran cantidad de características similares a TCP para mayor confiabilidad.
El estilo arquitectónico de REST presume, en su mayoría, 2 entidades a saber. cliente y servidor.
A medida que avanzamos más hacia la web en tiempo real y el desarrollo de sistemas reactivos, WebSocket podría comenzar a reemplazar de manera prominente el uso de API REST.
WS permite push y pull de datos que descarta el concepto de servidor y cliente.
STOMP, AMQP, XMPP se pueden usar como protocolos de mensajería.
Los datos en sí pueden ser búfers de protocolo JSON o Google o quizás Apache Avro.
WebSockets no está vinculado a los servidores web, pero también se puede desarrollar en aplicaciones independientes, como aplicaciones móviles o aplicaciones de escritorio.
Entiendo que esta publicación es realmente antigua, pero quería intercalar un poco más sobre la noción de que "¿Entonces si elijo una arquitectura REST pierdo la capacidad de las comunicaciones en tiempo real?".
En una palabra, no. Varias implementaciones de estilo REST He tenido experiencia con el apalancamiento REST para compatibilidad, descubrimiento y como un medio para escalar a través de diferentes dispositivos a la sombra de IoT.
Sin embargo, además de usar WS además de REST para facilitar la transmisión casi en tiempo real. También hay una serie de abstracciones que realmente ayudan con esto y te permiten concentrarte en construir tu API y decidir cómo deberían funcionar los componentes RT de las aplicaciones consumidoras.
Sugeriría echar un vistazo a cosas como Tibco Smart-Sockets, o SignalR si está buscando construir una REST API y quisiera evitar recrear la rueda para sus necesidades de RT.
No entiendo por qué convertirías XMPP en REST y luego ejecutarías REST sobre WS. El objetivo de WebSocket es llevar el protocolo XMPP directamente al navegador, evitando así todos los problemas de traducción.
Hay bibliotecas de JavaScript que pueden hablar XMPP desde el navegador al servidor. Todo lo que necesita es derivar el tráfico XMPP de WS a TCP y luego directamente a su servidor XMPP. Kaazing tiene una puerta de enlace que te permite hacer esto.
Si desea usar código abierto, deberá escribir una biblioteca JavaScript XMPP. Hay ejemplos que muestran cómo escribir una biblioteca JS para protocolos simples. Solo tiene que encontrar uno y extender el concepto al protocolo XMPP.
Para recapitular, aquí está la forma en que se vería la arquitectura:
Su código XMPP Client <-> XMPP JavaScript Library <-> WebSocket en http <-> WebSocket en TCP Proxy <-> XMPP Server
donde el código del Cliente XMPP y la Biblioteca JavaScript XMPP se ejecuta en el navegador, y el proxy WS al TCP junto con el servidor XMPP son todos del lado del servidor.
REST es un estilo arquitectónico que no impone un protocolo. Entonces sí, puede hacer REST con Web Sockets, REST con HTTP y REST con FTP si lo desea.
La razón principal para usar HTTP es que es fácil y bastante simple comunicarse con cualquier componente o lenguaje de programación a través de HTTP y también porque HTTP admite entornos distribuidos con múltiples intermediarios: proxies, firewalls ...; Por lo tanto, puede implementar su servicio en cualquier topología y cualquiera podrá acceder a ella.
Mi diatriba: si eres un RESTliban y la disertación de Roy Fielding es la fuente de la verdad, los verbos nunca se reconocen como parte de la semántica. Los URI son semánticos. El uso de verbos diferentes para diferentes acciones ha sido una elegante evolución de REST sobre HTTP, pero no parte de la "verdad". Puede verificar el escenario de reposo sobre HTTP evaluado por Roy en el capítulo seis de su disertación. Sin mención a los verbos. Y note que es un escenario de evaluación, no la especificación.
TLDR;
Si necesita comunicaciones bidireccionales en tiempo real a través de Internet y el cliente es un navegador web, la mejor opción es Web Sockets. A continuación, podría implementar un protocolo de nivel de aplicación sobre los sockets web para implementar un servicio web RESTful.
Sí. Puede usar REST sobre WebSocket con una biblioteca como SwaggerSocket.