verbos una tutorial sirve servicios services restful qué para español entre ejemplo diseño diferencia arquitectura rest session-state

una - verbos http rest



Si se supone que las aplicaciones REST no tienen estado, ¿cómo gestionas las sesiones? (13)

¿Están diciendo simplemente que no se utiliza el almacén de datos de sesión / nivel de aplicación?

No. No lo están diciendo de una manera trivial.

Dicen que no se define una "sesión". No iniciar sesión No cierre la sesión. Proporcionar credenciales con la solicitud. Cada solicitud está sola.

Todavía tienes almacenes de datos. Todavía tiene autenticación y autorización. Simplemente no pierdes el tiempo estableciendo sesiones y manteniendo el estado de la sesión.

El punto es que cada solicitud (a) está completamente sola y (b) se puede agrupar de forma trivial en una granja de servidores paralelos gigantes sin ningún trabajo real. Apache o Squid pueden pasar solicitudes RESTful a ciegas y con éxito.

¿Qué sucede si tengo una cola de mensajes y mi usuario quería leer los mensajes, pero al leerlos, quería bloquear el envío de mensajes de ciertos remitentes durante su sesión?

Si el usuario desea un filtro, simplemente proporcione el filtro en cada solicitud.

¿No tendría sentido ... que el servidor solo envíe mensajes (o ID de mensajes) que no fueron bloqueados por el usuario?

Sí. Proporcionar el filtro en la solicitud URI RESTful.

¿Realmente tengo que enviar la lista completa de remitentes de mensajes para bloquear cada vez que solicite la nueva lista de mensajes?

Sí. ¿Qué tan grande puede ser esta "lista de remitentes de mensajes para bloquear"? Una breve lista de PK''s?

Una solicitud GET puede ser muy grande. Si es necesario, puede intentar una solicitud POST aunque parezca un tipo de consulta.

Necesito alguna aclaración. He estado leyendo sobre REST y construyendo aplicaciones REST. Según wikipedia, la propia REST se define como Transferencia de Estado Representacional . Por lo tanto, no entiendo todo este apollado apóstol que todos escupen .

De wikipedia:

En cualquier momento particular, 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 y no consume almacenamiento por cliente en el conjunto de servidores o en la red.

¿Están diciendo simplemente que no se utiliza el almacén de datos de sesión / nivel de aplicación?

El objetivo de REST es lograr 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 sea parte del GET URI. Tiene sentido para mi. Pero parece que se está exagerando diciendo que no se deben almacenar datos del cliente (datos de la sesión) del lado del servidor.

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

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

Una vez más, simplemente tratando de entender esto. Alguien por favor aclarar.

Actualizar:

He encontrado una pregunta de desbordamiento de pila que tiene una respuesta que no me permite llegar tan lejos: 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?


Sin estado significa que el estado del servicio no persiste entre las solicitudes posteriores y la respuesta. Cada solicitud lleva sus propias credenciales de usuario y se autentica individualmente. Pero en Stateful cada solicitud se conoce de cualquier solicitud previa. Todas las solicitudes de estado están orientadas a la sesión, es decir, cada solicitud debe conocer y conservar los cambios realizados en solicitudes anteriores.

La aplicación bancaria es un ejemplo de aplicación con estado. Donde el usuario primero inicia sesión y luego realiza la transacción y se desconecta. Si después de cerrar sesión, el usuario intentará realizar la transacción, no podrá hacerlo.

Sí, el protocolo http es esencialmente un protocolo sin estado, pero para que sea un estado estable, usamos cookies HTTP. Entonces, es SOAP por defecto. Pero también puede ser un estado, depende del marco que esté utilizando.

HTTP no tiene estado, pero aún podemos mantener la sesión en nuestra aplicación java utilizando diferentes mecanismos de seguimiento de sesión.

Sí, también podemos mantener la sesión en el servicio web, ya sea REST o SOAP. Se puede implementar mediante el uso de cualquier biblioteca de terceros o puede implementarlo por nuestra cuenta.

Tomado de http://gopaldas.org/webservices/soap/webservice-is-stateful-or-stateless-rest-soap


Vista histórica de la gestión de estado de la aplicación de usuario.

Las sesiones en el sentido tradicional mantienen el estado del usuario en la aplicación dentro del servidor. Esta puede ser la página actual de un flujo o lo que se ingresó anteriormente pero aún no se ha conservado en la base de datos principal.

El motivo de esta necesidad fue la falta de estándares en el lado del cliente para mantener efectivamente el estado sin tener que hacer aplicaciones o complementos específicos del cliente (es decir, específicos del navegador).

La solicitud de encabezado de HTML5 y XML ha estandarizado con el tiempo la noción de almacenar datos complejos, incluido el estado de la aplicación de manera estándar en el lado del cliente (es decir, el navegador) sin tener que recurrir al servidor.

Uso general de los servicios REST.

Los servicios REST generalmente se llaman cuando hay una transacción que debe realizarse o si necesita recuperar datos.

Los servicios REST están destinados a ser llamados por la aplicación del lado del cliente y no directamente por el usuario final.

Autenticando

Para cualquier solicitud al servidor, parte de la solicitud debe contener el token de autorización. La forma en que se implementa es específica de la aplicación, pero en general es una forma de autenticación BASIC o CERTIFICATE .

La autenticación basada en formularios no es utilizada por los servicios REST. Sin embargo, como se indicó anteriormente, los servicios REST no están destinados a ser llamados por el usuario, sino por la aplicación. La aplicación necesita gestionar la obtención del token de autenticación. En mi caso, usé cookies con JASPIC con OAuth 2.0 para conectarme a Google para la autenticación y la autenticación HTTP simple para realizar pruebas automatizadas. También utilicé la autenticación de encabezado HTTP a través de JASPIC para las pruebas locales (aunque el mismo enfoque se puede realizar en SiteMinder)

Según esos ejemplos, la autenticación se administra en el lado del cliente (aunque SiteMinder o Google almacenarán la sesión de autenticación en su extremo), no se puede hacer nada sobre ese estado, pero no es parte de la aplicación de servicio REST.

Solicitudes de recuperación

Las solicitudes de recuperación en REST son operaciones GET donde se solicita un recurso específico y se pueden almacenar en caché. No hay necesidad de sesiones de servidor porque la solicitud tiene todo lo que necesitaría para recuperar los datos: la autenticación y el URI.

Scripts de transacciones

Como se indicó anteriormente, la propia aplicación del lado del cliente llama a los servicios REST junto con la autenticación que administra también en el lado del cliente.

Lo que esto significa para los servicios REST [si se hace correctamente] es llevar una sola solicitud al servidor REST. Contendrá todo lo que se necesita para una sola operación de usuario que hace todo lo que se necesita en una sola transacción, un Script de Transacción es lo que el patrón se llama.

Esto se hace generalmente a través de una solicitud POST , pero también se pueden usar otras, como PUT .

Muchos ejemplos artificiales de REST (yo mismo hice esto) trataron de seguir gran parte de lo que se ha definido en el protocolo HTTP, después de pasar por eso decidí ser más pragmático y lo dejé solo para GET y POST . El método POST ni siquiera tiene que implementar el patrón POST-REDIRECT-GET.

Sin embargo, como he señalado anteriormente, la aplicación del lado del cliente será la que llame al servicio y solo llamará a la solicitud POST con todos los datos cuando sea necesario (no siempre). Esto evita solicitudes constantes al servidor.

Votación

Aunque también se puede usar REST para el sondeo, no lo recomendaré a menos que tenga que usarlo debido a la compatibilidad del navegador. Para eso usaría WebSockets para los cuales también había diseñado un contrato de API . Otra alternativa para los navegadores más antiguos es CometD.


La explicación fundamental es:

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

Por apátrida 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 no tiene estado significa que cada servidor puede atender a cualquier cliente en cualquier momento, no hay afinidad de sesión o sesiones pegajosas . La información relevante de la sesión 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 el 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 que debe pasar del cliente a todos los lugares que lo necesiten.

De ahí proviene el ST en REST , transferencia estatal . Usted transfiere el estado en lugar de que el servidor lo almacene. Esta es la única forma de escalar a millones de usuarios concurrentes. Si no es por otra razón que no sea porque millones de sesiones son millones de sesiones.

La carga de la administración de la sesión se amortiza en todos los clientes, los clientes almacenan su estado de sesión y los servidores pueden atender muchos pedidos de magnitud o más clientes de una manera sin estado.

Incluso para un servicio que usted cree que solo necesitará en los 10 de miles de usuarios concurrentes, aún debe hacer que su servicio sea apátrida. Decenas de miles siguen siendo decenas de miles y habrá costos de tiempo y espacio asociados con ellos.

Stateless es la forma en que el protocolo HTTP y la web en general se diseñaron para funcionar, y es una implementación más simple en general, y tiene una única ruta de código 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 cumples estos principios puede variar.

En resumen, los cinco principios clave son:

  1. Dale a cada "cosa" una identificación
  2. Relacionar cosas
  3. Usa métodos estándar
  4. Recursos con representaciones múltiples.
  5. Comunicar sin estado

No hay nada acerca de la autenticación o autorización en la dissertation REST.

Porque no hay nada diferente a autenticar una solicitud que es REST completa 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 .

La implementación de la Autenticación y la Autorización en lo que respecta a REST es incluso más amplia, y se explican con gran detalle varios enfoques de las implementaciones en Internet en general.

Los comentarios que soliciten ayuda / información sobre esto solo / deben marcarse como Ya no se necesitan .


Echa un vistazo a esta presentación.

http://youtu.be/MRxTP-rQ-S8

De acuerdo con este patrón, cree recursos transitorios de descanso para administrar el estado si es que realmente lo necesita. Evitar sesiones explícitas.


La falta de estado significa que cada solicitud HTTP ocurre en completo aislamiento. 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 la información de las solicitudes anteriores. Si esa información fuera importante, el cliente tendría que enviarla nuevamente en una solicitud posterior. La apatridia también trae nuevas características. Es más fácil distribuir una aplicación sin estado en servidores de carga equilibrada. Una aplicación sin estado también es fácil de almacenar en caché.

En realidad, hay dos tipos de estado. Estado de aplicación que vive en el cliente y Estado de recursos que vive en el servidor.

Un servicio web solo necesita preocuparse por el estado de su aplicación cuando está realizando 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 del recurso es el mismo para cada cliente y su lugar adecuado es en el servidor. Cuando carga una imagen en un servidor, crea un nuevo recurso: la nueva imagen tiene su propio URI y puede ser el objetivo de futuras solicitudes. Puede obtener, modificar y eliminar este recurso a través de HTTP.

Espero que esto ayude a diferenciar lo que significa la apatridia y varios estados.


La principal diferencia entre stateless y Stateful es que los datos se devuelven al servidor cada vez. En caso de no tener estado, el cliente debe proporcionar toda la información, por lo que es posible que se deban pasar muchos parámetros en cada solicitud. En Stateful, cliet pasa esos parámetros una vez y el servidor los mantiene hasta que el cliente los modifica nuevamente.

OMI, API debe ser sin estado, lo que permite escalar muy rápidamente.


REST es muy abstracto. Ayuda tener algunos ejemplos buenos, simples y del mundo real.

Tomemos, por ejemplo, las principales aplicaciones de redes sociales: Tumblr, Instagram, Facebook y Twitter. Todos tienen una vista de desplazamiento para siempre donde más se desplaza hacia abajo, más contenido se ve, más y más atrás en el tiempo. Sin embargo, todos hemos experimentado ese momento en el que perdiste el lugar al que fuiste desplazado, y la aplicación te reinicia de nuevo. Al igual que si abandonas la aplicación, cuando la vuelves a abrir, vuelves a estar en la parte superior.

La razón por la cual, es porque el servidor no almacenó su estado de sesión. Lamentablemente, su posición de desplazamiento solo se almacenó en la memoria RAM en el cliente.

Afortunadamente, no tiene que volver a iniciar sesión cuando se vuelva a conectar, pero eso es solo porque su certificado de inicio de sesión almacenado en el lado del cliente no ha caducado. Elimine y vuelva a instalar la aplicación, y tendrá que volver a iniciar sesión porque el servidor no asoció su dirección IP con su sesión.

No tiene una sesión de inicio de sesión en el servidor, ya que cumplen con REST.

Ahora, los ejemplos anteriores no implican un navegador web en absoluto, pero en el extremo posterior, las aplicaciones se comunican a través de HTTPS con sus servidores host. Mi punto es que REST no tiene que involucrar cookies y navegadores, etc. Hay varios medios para almacenar el estado de la sesión del lado del cliente.

Pero hablemos de los navegadores web por un segundo, porque eso trae consigo otra gran ventaja de REST de la que nadie está hablando aquí.

Si el servidor intentó almacenar el estado de la sesión, ¿cómo se supone que identifica a cada cliente individual?

No pudo usar su dirección IP, porque muchas personas podrían estar usando esa misma dirección en un enrutador compartido. Entonces, ¿cómo, entonces?

No puede usar la dirección MAC por muchas razones, entre las cuales se puede iniciar sesión en múltiples cuentas de Facebook simultáneamente en diferentes navegadores y en la aplicación. Un navegador puede fácilmente pretender ser otro, y las direcciones MAC son tan fáciles de falsificar.

Si el servidor tiene que almacenar algún estado del lado del cliente para identificarlo, tiene que almacenarlo en la RAM por más tiempo que solo el tiempo necesario para procesar sus solicitudes, o bien tiene que almacenar en caché esos datos. Los servidores tienen una cantidad limitada de RAM y caché, sin mencionar la velocidad del procesador. El estado del lado del servidor se suma a los tres, exponencialmente. Además, si el servidor va a almacenar cualquier estado sobre sus sesiones, entonces tiene que almacenarlo por separado para cada navegador y aplicación con la que haya iniciado sesión, y también para cada dispositivo diferente que use.

Entonces ... espero que vea ahora por qué REST es tan importante para la escalabilidad. Espero que pueda comenzar a ver por qué el estado de la sesión del lado del servidor es la escalabilidad del servidor, lo que son los yunques unidos a la aceleración del automóvil.

Donde la gente se confunde es pensando que "estado" se refiere a, como, información almacenada en una base de datos. No, se refiere a cualquier información que deba estar en la memoria RAM del servidor cuando la esté utilizando.


REST es sin estado y no mantiene ningún estado entre las solicitudes. Las cookies / encabezados de los clientes están configuradas para mantener el estado del usuario como autenticación. Los nombres de usuario / contraseña del Cliente dicen que se validan mediante un mecanismo de autenticación de la tercera parte: gerneo OTP de segundo nivel, etc. Una vez que el usuario se autentica, las cabeceras / cookies quedan expuestas al punto final del servicio y podemos asumir que el usuario es auténtico ya que el usuario viene con encabezados / cookies válidos . Ahora cierta información del usuario como IP se mantiene en el caché y después de eso, si la solicitud proviene de la misma Ip (dirección mac) para los recursos listados, se permite al usuario. Y el caché se mantiene durante un tiempo determinado que se invalida una vez que transcurre el tiempo. Por lo tanto, se puede usar el caché o las entradas de la base de datos para conservar la información entre las solicitudes.


Tiene toda la razón, admitir que las interacciones completamente sin estado con el servidor suponen una carga adicional para el cliente. Sin embargo, si considera escalar una aplicación, la potencia de cálculo de los clientes es directamente proporcional al número de clientes. Por lo tanto, escalar a un gran número de clientes es mucho más factible.

Tan pronto como usted pone un poco de responsabilidad en el servidor para administrar cierta información relacionada con las interacciones de un cliente específico, esa carga puede crecer rápidamente para consumir el servidor.

Es un intercambio.


Tienes que gestionar la sesión del cliente en el lado del cliente. Esto significa que tiene que enviar datos de autenticación con cada solicitud, y probablemente, pero no necesariamente, tenga una memoria caché en la memoria en el servidor, que combina datos de autenticación con información del usuario como identidad, permisos, etc.

Esta restricción de apatridia REST es muy importante. Sin aplicar esta restricción, su aplicación del lado del servidor no se scale bien, porque el mantenimiento de cada sesión de cliente será su talón de Aquiles .


Todo el concepto es diferente ... No es necesario administrar sesiones si está intentando implementar el protocolo RESTFul. En ese caso, es mejor realizar un procedimiento de autenticación en cada solicitud (aunque hay un costo adicional en términos de rendimiento: la contraseña de hashing sería un buen ejemplo. No es un gran problema ...). Si utiliza sesiones, ¿cómo puede distribuir la carga en varios servidores? Apuesto a que el protocolo RESTFul está destinado a eliminar sesiones de cualquier tipo, realmente no las necesitas ... Por eso se llama "apátrida". Las sesiones solo son necesarias cuando no puede almacenar otra cosa que no sea Cookie en el lado del cliente después de que se haya realizado una solicitud (tome como ejemplo el navegador antiguo que no admite Javascript / HTML5). En el caso de un cliente RESTFul "con todas las funciones", generalmente es seguro almacenar base64(login:password) en el lado del cliente (en la memoria) hasta que la aplicación aún esté cargada: la aplicación se utiliza para acceder al único host y la cookie no puede ser comprometido por los scripts de terceros ...

Recomendaría encarecidamente deshabilitar la autenticación de cookies para los servicios RESTFul ... verifique Basic / Digest Auth, que debería ser suficiente para los servicios basados ​​en RESTFul.


Veo que el problema básico aquí es mezclar sesión con estado . Y mientras que REST especifica que NO debe almacenar el estado en el servidor, nada le impide almacenar una sesión de usuario.

Administrar el estado en el servidor significa que su servidor sabe exactamente lo que está haciendo el cliente (qué página están viendo en qué sección de la aplicación). Y esto es lo que no debes hacer.

Estoy de acuerdo con las otras personas que dicen que debe mantener el almacenamiento de la sesión a un tamaño mínimo; y si bien eso es sentido común, en realidad también depende de la aplicación. En resumen, aún puede mantener una sesión con datos en caché para manejar las solicitudes con menos carga en el servidor y administrar la autenticación al proporcionar un token de autenticación / acceso temporal para que lo use el cliente. Cuando la sesión / token caduque, genere uno nuevo y solicite al cliente que lo use.

Alguien podría argumentar que el cliente debería generar mejor el token. Digo que funciona en ambos sentidos y dependería de la aplicación y de quién trabajará con la API.

También mantener algunos datos de sesión confidenciales en el servidor debería ser la forma correcta de hacerlo. No puede confiar en que el cliente conservará su carrito de compras que (por ejemplo) contiene un campo llamado "isFreeGift". Dicha información debe mantenerse en el servidor.

El enlace del video provisto por Santanu Dey en su respuesta es útil. Míralo si no lo has hecho.

Solo una nota al margen: parece que todas las respuestas ya dadas parecen ignorar el hecho de que algunas operaciones pueden causar una gran carga en el servidor. Eso es relevante en términos de consumo de energía, consumo de hardware y costo (para servidores alquilados por ciclo de CPU). Un buen desarrollador no debe ser perezoso al optimizar su aplicación, incluso si la operación se puede hacer muy rápidamente en una CPU moderna en un servidor alquilado por el cual no pagan su factura de electricidad y mantenimiento.

Aunque la pregunta tiene algunos años, espero que mi respuesta siga siendo útil.