Les sessions côté serveur violent-elles REST?


14

Selon Roy Fielding (l'un des principaux auteurs de la spécification HTTP) dans sa thèse phare Architectural Styles lorsqu'il parle de REST , il mentionne:

[Chaque demande du client au serveur doit contenir toutes les informations nécessaires à la compréhension de la demande et ne peut tirer parti d'aucun contexte stocké sur le serveur.

Par « contexte enregistré » , il fait référence à l' état d'application par exemple ce que le numéro de page pour la page suivante par rapport à l' état des ressources , par exemple une banque de données, l' image , etc. - ce qui est sans doute le point de l' ensemble de repos.

Est-il juste de dire que la plupart des tentatives de repos pur (définies ici comme une implémentation conforme à la thèse ci-dessus) doivent échouer en raison de leur dépendance à l'égard du stockage des données de session sur le serveur (persistantes ou non)?

Le concept de session est courant - en particulier pour les développeurs Web - mais est-il RESTful selon la définition ci-dessus?


2
Je dirais que selon cette définition, pratiquement rien n'est reposant, mais comment cette définition est-elle même raisonnablement logique? Imaginez une recherche google «reposante» - où vous devez fournir un index d'Internet dans la demande de google pour qu'il recherche à votre place. Quelle? Non, dire que vous ne pouvez pas avoir un magasin de persistance et être reposant reviendrait à dire que les interfaces reposantes sont en fait inutiles. Cela ne signifie pas que nous devrions tous commencer à maintenir des sessions en mémoire et à dire que la conception du repos est toujours bonne ...
Jimmy Hoffa

3
Je pense qu'il convient de noter qu'il existe une distinction entre l' état de l'application et l'état des ressources (l'index Google serait l'état des ressources et est parfaitement légitime). Je devrais clarifier cela dans la question.
Matt

il y a une telle distinction? Veuillez le définir. :) J'ai vu des gens essayer de les définir auparavant, mais c'est vraiment flou parce qu'ils ne sont en fait pas différents. Ce sont deux données mutables, la seule distinction pertinente entre une forme d'état et une autre est de savoir si elle est persistante ou non, où la forme non signifie qu'elle est généralement régénérable, ce qui la rend différente.
Jimmy Hoffa

1
Je me suis posé cette question moi-même. Puisque personne n'a jamais expliqué pourquoi mon application devrait vouloir une étoile dorée "reposante", je ne m'en soucie pas vraiment.
psr

Réponses:


10

Je dirais que oui, l'état de la session rend une application RESTful non RESTful. Exemple trivial, ma sœur est abonnée au Wall Street Journal. Sur une base régulière, elle lira quelque chose derrière le mur de paiement et décidera d'envoyer un lien (via son propre client de messagerie, pas via WSJ) à un ami qui n'a pas de compte WSJ. Cliquez, envoyez, échouez. De toute évidence, l'expérience de ma sœur à cette URL est différente de celle de son amie.

Lié, mais pas strictement sur le sujet: je suis dans la première phase de conception d'une application conçue pour soutenir des efforts de recherche importants sur le net (appelés quêtes (pensez: signets sur les stéroïdes et le LSD)). Le propriétaire de la quête souhaite partager une vue particulière de ses données avec quelqu'un d'autre, mais cette vue nécessite une combinaison de l'état de l'interface utilisateur (par exemple, quelles visualisations de quelles données s'affichent dans quels volets) ainsi que les autorisations appropriées pour accéder à l'interface utilisateur. et les données affichées. Il y a beaucoup d'état stocké requis pour que le destinataire obtienne la vue souhaitée.

Ma solution actuelle consiste à stocker toutes les informations UI / ACL / quelles que soient les informations nécessaires à la vue dans un objet séparé et à renvoyer l'URL (probablement un UUID) pour cet objet. Je crois que l'accès à l' objet de vue pourrait être considéré comme RESTful dans le sens où tout le monde en la possession obtient la même information / expérience.


1
Vous voyez l' exemple d' objet est un autre angle à ce sujet. Soigné.
Matt

Accepter cela comme réponse, malgré les autres bonnes réponses, principalement parce qu'il répond directement à la question et donne un exemple très clair. De plus, la deuxième partie sur les objets de vue a fait pencher la balance.
Matt

1
Si vous dites que le site wsj est un exemple d'application non reposante, je ne suis pas d'accord que votre exemple le montre. Si le site WSJ s'appuie par exemple sur des données fournies entièrement par le client de votre sœur pour lui présenter les données, alors c'est par la définition donnée par @Matt, RESTful. S'il repose cependant sur un état de session temporaire en mémoire, c'est par la définition que Matt n'a pas donnée RESTful. Je le signale simplement parce que la définition donnée par Matt est basée sur les spécificités de l'implémentation tandis que REST est mieux défini par la technique de consommation.
Jimmy Hoffa

@JimmyHoffa - Ma compréhension des contraintes de REST est qu'il est apatride . Cela me semble assez clair.
Peter Rowell

Si l'application WSJ n'avait pas d'état, l'article visible devrait être envoyé par le client. Cet article peut être modifié à tout moment par les administrateurs du site, ne vous y trompez pas, il fait partie de l'état de l'application WSJ. Je pense que la distinction recherchée est qu'il s'agit d' un état persistant , donc il aura plus de garanties et moins de frais généraux de gestion qu'un état impersistant comme les sessions, ainsi qu'un contrôle d'atomicité plus simple dans les transactions. C'est avec ce modèle de consommation simple que les gens veulent se reposer. (Je pense)
Jimmy Hoffa

2

Les sessions côté serveur violent-elles REST?

Ils le font certainement! Lorsque vous implémentez REST, il ne doit pas y avoir de session côté serveur, sinon vous disposez d'une solution RPC / REST hybride.

Le client doit envoyer à un service RESTful tout le contexte nécessaire au service de la demande, y compris les informations nécessaires à l'authentification du client, à chaque nouvelle demande. Le serveur est libre de mettre en cache les informations pour accélérer le traitement des requêtes suivantes, mais les informations mises en cache ne doivent pas correspondre à une session côté serveur. En d'autres termes, la demande elle-même doit contenir suffisamment d'informations pour être traitée même en l'absence de l'état mis en cache.


1

Cela dépend probablement de ce que vous entendez par "données de session". Est-ce un terme précis?

La communication sécurisée entre deux parties implique souvent que le serveur génère (et stocke) un "jeton d'accès" limité dans le temps que le client doit fournir à chaque demande comme moyen d'autorisation. Ce jeton d'accès est déjà ce que j'appellerais des «données de session» - il est stocké côté serveur, limité dans le temps et lié à un client (généralement ses autorisations).

Je serais très surpris si ce type d'opération était étiqueté comme non RESTful. OAuth en est un exemple.

Je ne suis pas un spécialiste et je ne suis pas très confiant ici; Je partage juste mes idées en espérant qu'elles s'avèrent utiles.


1

Le point le plus important de REST est qu'un URI vers une ressource pointe toujours vers la même ressource. Ainsi, les utilisateurs peuvent faire circuler une référence à cette ressource et tout le monde la voit. C'est ce qu'on appelle le transfert d'état représentatif (REST). Si le serveur garde l'état et fournit une ressource différente pour le même URI, je dirais que ce n'est plus du REST pur.


ce n'est pas nécessairement vrai que les utilisateurs verront la même chose. L'accès peut dicter combien un utilisateur peut voir.
Erik

@Erik Mais l'utilisateur indiquerait combien il veut voir dans la demande (y compris en utilisant l'en-tête Accept), donc les réponses de Puckl sont vraies.
Johan

1
@Johan Je retournerais des données différentes pour différents utilisateurs, à partir du même point de terminaison. Sinon à quoi sert l'authentification de l'utilisateur.
Erik

@Erik, je le ferais aussi. Néanmoins, je pense que l'authentification est en dehors de l'état de la ressource, donc à proprement parler, si la vue est affectée par l'utilisateur authentifié, elle n'est plus RESTful. Peut-être que si vous vouliez votre badge RESTful, vous devriez créer plusieurs "vues" de la ressource, selon qui demande l'accès, elle n'autorise l'accès qu'à certaines vues. Donc public peut avoir accès à / UserProfiles / {IDutilisateur} / publicview et l'utilisateur a accès à / UserProfiles / {IDutilisateur} / fullprofile et autorisé amis ont accès à / UserProfiles / {IDutilisateur} / friendsview
Johan

0

Les sessions sont essentiellement utilisées pour ajouter un état aux applications RESTful sans état. Donc, formellement, cela rend votre application RESTful dynamique, mais avoir l'état de conservation du serveur vous facilite la vie, car vous n'avez pas à transmettre toutes les données dans les deux sens à chaque demande / réponse.

Les sessions, et plus généralement l'état, vous permettent d'éviter cela, ce qui présente des avantages positifs en termes de performances (moins de données transférées) et de sécurité (moins de données disponibles pour falsifier).

Ainsi, bien qu'il viole officiellement une partie de la définition de REST, il est si utile qu'il est rare de voir des applications RESTful qui n'utilisent pas l' état via des sessions.


Je ne suis pas d'accord. Vous avez un site d'achat qui vous permet de filtrer par marque, couleur et taille. Les sites Web Web 1.0 traditionnels géreraient cela avec certaines cases à cocher, une session côté serveur et POST. Si je veux partager le lien vers example.org/shirts, les gens ne verront pas que j'ai sélectionné Medium, Black et Roots. (Cela provoque également le vilain message "vous réintroduisez des données" lorsque vous cliquez en arrière.) Mais si je partage le lien vers (par exemple) example.org/shirts/medium-black-roots, tout le monde a la même représentation. Toutes les informations d'état nécessaires se trouvent dans l'URL (ou le corps du POST si nécessaire, mais vous ne pouvez pas les partager).
Jesse Buchanan

... RESTful peut ne pas convenir à tout. Votre hypothétique application est-elle orientée vers les ressources (un site de magasinage l'est certainement!)? Peut-être que cela ne conviendrait pas à une RIA, avec beaucoup d'état, qui n'est pas orientée sur les ressources. Je ne peux pas penser à de bons exemples pour être honnête.
Jesse Buchanan

0

Ce que Fielding voulait dire par cette déclaration, c'est que le serveur d'applications hébergeant l'API REST n'associe pas l'état ambiant à une demande d'une sorte de mécanisme en arrière-plan. Considérez la différence entre un serveur d'applications et un serveur de base de données . La contrainte REST est que le serveur d'applications doit être sans état . Cependant, le serveur d'applications peut déléguer des demandes d'état des ressources au serveur de base de données en fonction des informations qui font partie de la demande, telles qu'une combinaison utilisateur / mot de passe dans l'en- tête d'autorisation ou l'URI lui-même. Après tout, REST est basé sur le modèle client / serveur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.