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?
Réponses:
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source