Según Roy Fielding (uno de los principales autores de la especificación HTTP) en su tesis seminal Architectural Styles cuando habla de REST , menciona:
[E] cada solicitud del cliente al servidor debe contener toda la información necesaria para comprender la solicitud, y no puede aprovechar ningún contexto almacenado en el servidor.
Por "contexto almacenado" se refiere al estado de la aplicación, por ejemplo, cuál es el número de página para la página siguiente en comparación con el estado de los recursos, por ejemplo, cualquier almacén de datos, imagen, etc., lo cual podría decirse que es todo el punto de REST.
¿Es justo decir que la mayoría de los intentos de reposo puro (definidos por la presente como una implementación que se ajusta a la tesis anterior) deben fallar debido a su dependencia en el almacenamiento de datos de sesión en el servidor (persistente o no)?
El concepto de una sesión es común, en particular para los desarrolladores web, pero ¿es RESTANTE de acuerdo con la definición anterior?
Respuestas:
Yo diría que sí, el estado de la sesión hace que una aplicación RESTful no sea RESTful. Ejemplo trivial, mi hermana se suscribe al Wall Street Journal. Regularmente leerá algo detrás del muro de pago y decidirá enviar un enlace (a través de su propio cliente de correo electrónico, no a través de WSJ) a un amigo que no tiene una cuenta WSJ. Haga clic, envíe, falle. Claramente, la experiencia de mi hermana en esa URL es diferente a la de su amiga.
Relacionado, pero no estrictamente sobre el tema: estoy en la fase inicial de diseño de una aplicación diseñada para apoyar importantes esfuerzos de investigación en la red (llamados misiones (piense: marcadores en esteroides y LSD)). El propietario de la búsqueda desea compartir una vista particular de sus datos con otra persona, pero esta vista requiere una combinación de estado de la interfaz de usuario (por ejemplo, qué visualizaciones de qué datos se muestran en qué paneles) junto con los permisos apropiados para acceder a la interfaz de usuario y los datos mostrados. Se requiere una gran cantidad de estado almacenado para que el destinatario obtenga la vista deseada.
Mi solución actual es almacenar toda la UI / ACL / cualquier información necesaria para la vista en un objeto separado y devolver la URL (probablemente un UUID) para ese objeto. Creo que acceder al objeto de vista podría considerarse RESTful en el sentido de que todos los que lo poseen obtienen la misma información / experiencia.
fuente
Definitivamente lo hacen! Cuando implementa REST, no debe haber una sesión del lado del servidor; de lo contrario, tiene una solución RPC / REST híbrida.
El cliente debe enviar a un servicio RESTful todo el contexto necesario para atender la solicitud, incluida la información necesaria para autenticar al cliente, cada vez que se realiza una nueva solicitud. El servidor es libre de almacenar en caché la información para acelerar el servicio de solicitudes posteriores, pero la información almacenada en caché no debe equivaler a una sesión del lado del servidor. En otras palabras, la solicitud en sí misma debe contener suficiente información para ser procesada incluso en ausencia del estado en caché.
fuente
Probablemente depende de lo que quiere decir con "datos de sesión". ¿Es ese un término preciso?
La comunicación segura entre dos partes a menudo implica que el servidor genere (y almacene) un "token de acceso" de tiempo limitado que el cliente debe suministrar con cada solicitud como una forma de autorización. Este token de acceso ya es lo que yo llamaría "datos de sesión": está almacenado en el lado del servidor, limitado en el tiempo y relacionado con un cliente (generalmente sus permisos).
Me sorprendería mucho si este tipo de operación se etiquetara como no RESTful. OAuth es un ejemplo.
No soy especialista y no tengo mucha confianza aquí; Solo estoy compartiendo mis ideas con la esperanza de que sean útiles.
fuente
El punto más importante de REST es que un URI a un recurso siempre apunta al mismo recurso. Para que los usuarios puedan pasar una referencia a este recurso y todos vean lo mismo. Esto se llama transferencia de estado representacional (REST). Si el servidor mantiene el estado y entrega un recurso diferente para el mismo URI, diría que esto ya no es REST puro.
fuente
Las sesiones se utilizan básicamente para agregar estado a aplicaciones RESTful sin estado. Entonces, formalmente, esto hace que su aplicación RESTful tenga estado, sin embargo, tener el estado de mantenimiento del servidor hace que su vida sea un poco más fácil, ya que no tiene que pasar todos los datos de un lado a otro en cada solicitud / respuesta.
Las sesiones, y en términos más generales, le permiten evitar esto, y esto tiene algunos beneficios positivos en el rendimiento (menos datos transferidos) y seguridad (menos datos disponibles para manipular).
Entonces, si bien viola oficialmente parte de la definición de REST, es tan útil que es raro ver aplicaciones RESTful que no usan estado a través de sesiones.
fuente
Lo que Fielding quiso decir con esa declaración es que el servidor de aplicaciones que aloja la API REST no asocia el estado ambiente con una solicitud de algún tipo de mecanismo detrás de escena. Considere la diferencia entre un servidor de aplicaciones y un servidor de bases de datos . La restricción REST es que el servidor de aplicaciones no debería tener estado . Sin embargo, el servidor de aplicaciones puede delegar solicitudes de estado de recursos al servidor de base de datos en función de la información que forma parte de la solicitud, como una combinación de usuario / contraseña en el encabezado de Autorización o el Uri mismo. Después de todo, REST se basa en el modelo cliente / servidor.
fuente