Si se supone que las aplicaciones REST no tienen estado, ¿cómo se gestionan las sesiones?

Resuelto Zak asked hace 14 años • 15 respuestas

Necesito alguna aclaración. He estado leyendo sobre REST y creando aplicaciones RESTful. Según Wikipedia, REST en sí se define como Transferencia de estado representacional . Por lo tanto, no entiendo toda esta palabrería apátrida que todo el mundo sigue escupiendo.

De wikipedia:

En cualquier momento determinado, un cliente puede estar en transición entre estados de aplicación o "en reposo". Un cliente en estado de reposo puede interactuar con su usuario, pero no crea carga ni consume almacenamiento por cliente en el conjunto de servidores o en la red.

¿Solo están diciendo que no use el almacén de datos a nivel de sesión/aplicación?

Entiendo que un objetivo de REST es hacer que el acceso a URI sea consistente y esté disponible, por ejemplo, en lugar de ocultar las solicitudes de paginación dentro de las publicaciones, haciendo que el número de página de una solicitud forme parte de GET URI. Tiene sentido para mi. Pero parece que se está exagerando al decir que nunca se deben almacenar datos por cliente (datos de sesión) en el lado del servidor.

¿Qué pasa si tengo una cola de mensajes y mi usuario quiere leerlos, pero mientras los lee, quiere bloquear los mensajes de ciertos remitentes durante su sesión? ¿No tendría sentido almacenar esto en un lugar del lado del servidor y hacer que el servidor solo envíe mensajes (o ID de mensajes) que no hayan sido bloqueados por el usuario?

¿Realmente tengo que enviar la lista completa de remitentes de mensajes para bloquear cada vez que solicito la nueva lista de mensajes? La lista de mensajes pertinentes para mí ni siquiera debería ser un recurso disponible públicamente en primer lugar.

Nuevamente, solo trato de entender esto. Alguien por favor aclare.


Actualizar:

Encontré una pregunta sobre desbordamiento de pila que tiene una respuesta que no me lleva hasta el final: Cómo administrar el estado en REST , que dice que el estado del cliente que es importante debe transferirse en cada solicitud... Ugg .. parece un montón de gastos generales... ¿Es esto correcto?

Zak avatar Jun 24 '10 03:06 Zak
Aceptado

La explicación fundamental es:

No hay estado de sesión del cliente en el servidor.

Sin estado significa que el servidor no almacena ningún estado sobre la sesión del cliente en el lado del servidor.

La sesión del cliente se almacena en el cliente. El servidor sin estado significa que cada servidor puede atender a cualquier cliente en cualquier momento, no hay afinidad de sesión ni sesiones fijas . La información de la sesión relevante se almacena en el cliente y se pasa al servidor según sea necesario.

Eso no impide que otros servicios con los que habla el servidor web mantengan el estado de los objetos comerciales, como los carritos de compras, pero no del estado actual de la aplicación/sesión del cliente.

El estado de la aplicación del cliente nunca debe almacenarse en el servidor, sino pasarse del cliente a cada lugar que lo necesite.

De ahí viene el ST en REST , State Transfer . Transfiere el estado en lugar de que el servidor lo almacene. Ésta es la única forma de escalar a millones de usuarios simultáneos. Aunque sólo sea porque millones de sesiones son millones de sesiones.

La carga de la gestión de sesiones se amortiza en todos los clientes, los clientes almacenan el estado de su sesión y los servidores pueden dar servicio a muchos órdenes de magnitud o más clientes sin estado.

Incluso para un servicio que cree que solo necesitará decenas de miles de usuarios simultáneos, aún así debe convertir su servicio en apátrida. Decenas de miles siguen siendo decenas de miles y habrá costos de tiempo y espacio asociados con ello.

Sin estado es cómo se diseñó para funcionar el protocolo HTTP y la web en general y es una implementación general más simple y tiene una ruta de código única en lugar de un montón de lógica del lado del servidor para mantener un montón de estados de sesión.

Hay algunos principios de implementación muy básicos:

Estos son principios, no implementaciones; la forma en que se cumplan estos principios puede variar.

En resumen, los cinco principios clave son:

  1. Dale a cada “cosa” una identificación
  2. Unir cosas
  3. Utilice métodos estándar
  4. Recursos con múltiples representaciones.
  5. Comunicarse sin estado

No hay nada sobre autenticación o autorización en la disertación REST .

Porque no hay nada diferente entre autenticar una solicitud que es RESTful de una que no lo es. La autenticación es irrelevante para la discusión RESTful.

Explicar cómo crear una aplicación sin estado para sus requisitos particulares es demasiado amplio para StackOverflow.

La implementación de autenticación y autorización en lo que respecta a REST es aún más amplia y varios enfoques para la implementación se explican con gran detalle en Internet en general.

Los comentarios que soliciten ayuda/información sobre esto simplemente se marcarán como Ya no son necesarios .

 avatar Jun 23 '2010 20:06

La apatridia significa que cada solicitud HTTP ocurre de forma completamente aislada. Cuando el cliente realiza una solicitud HTTP, incluye toda la información necesaria para que el servidor cumpla con esa solicitud. El servidor nunca se basa en información de solicitudes anteriores. Si esa información fuera importante, el cliente tendría que enviarla nuevamente en solicitud posterior. La apatridia también trae consigo nuevas características. Es más fácil distribuir una aplicación sin estado entre servidores con equilibrio de carga. Una aplicación sin estado también es fácil de almacenar en caché.

En realidad, hay dos tipos de Estado. Estado de la aplicación que reside en el cliente y Estado de recurso que reside en el servidor.

Un servicio web solo necesita preocuparse por el estado de su aplicación cuando realmente realiza una solicitud. El resto del tiempo ni siquiera sabe que existes. Esto significa que cada vez que un cliente realiza una solicitud, debe incluir todos los estados de la aplicación que el servidor necesitará para procesarla.

El estado de los recursos es el mismo para todos los clientes y su lugar adecuado es en el servidor. Cuando subes una imagen a un servidor, creas un nuevo recurso: la nueva imagen tiene su propio URI y puede ser el objetivo de futuras solicitudes. Puede recuperar, modificar y eliminar este recurso a través de HTTP.

 avatar Jun 24 '2010 02:06