As sessões do lado do servidor violam o REST?

14

De acordo com Roy Fielding (um dos principais autores da especificação HTTP) em sua tese seminal Architectural Styles ao discutir o REST , ele menciona:

[E] uma solicitação do cliente para o servidor deve conter todas as informações necessárias para entender a solicitação e não pode tirar proveito de nenhum contexto armazenado no servidor.

Por "contexto armazenado", ele está se referindo ao estado do aplicativo, por exemplo, qual é o número da página da página seguinte versus estado do recurso, por exemplo, qualquer armazenamento de dados, imagem etc. - que é sem dúvida o ponto principal do REST.

É justo dizer que a maioria das tentativas de descanso puro (aqui definidas como uma implementação em conformidade com a tese acima) deve falhar devido à dependência de armazenar dados da sessão no servidor (persistentes ou não)?

O conceito de uma sessão é comum - principalmente para desenvolvedores da Web -, mas é RESTful de acordo com a definição acima?

Matt
fonte
2
Eu diria que, de acordo com essa definição, praticamente nada é tranqüilo, mas como essa definição é razoavelmente lógica? Imagine uma pesquisa no Google "tranqüila" - onde você deve fornecer um índice da Internet na solicitação para pesquisar no Google. O que? Não, dizer que você não pode ter um armazenamento de persistência e descansar seria o mesmo que dizer que interfaces tranquilas são de fato inúteis. Isso não significa que todos nós devemos começar a manter sessões na memória e dizendo que ainda é um bom design resto ...
Jimmy Hoffa
3
Acho que deve-se notar que há uma distinção entre estado do aplicativo e estado do recurso (o índice do Google seria estado do recurso e é perfeitamente legítimo). Eu deveria deixar isso mais claro na pergunta.
Matt
existe essa distinção? Por favor, defina-o. :) Eu já vi pessoas tentando defini-las antes, mas fica muito confuso porque na verdade não são diferentes. Ambos são dados mutáveis, a única distinção relevante entre uma forma de estado e outra é persistente ou não, onde a forma não significa que geralmente é regenerável, e é isso que a torna diferente.
Jimmy Hoffa
1
Eu mesmo me perguntei isso. Como ninguém nunca explicou por que meu aplicativo deveria querer uma estrela "repousante" dourada, eu realmente não me preocupo com isso.
Psr

Respostas:

10

Eu diria que sim, o estado da sessão torna um aplicativo RESTful não RESTful. Exemplo trivial, minha irmã assina o Wall Street Journal. Regularmente, ela estará lendo algo por trás do paywall e decidirá enviar um link (por meio de seu próprio cliente de email, não pelo WSJ) a um amigo que não possui uma conta do WSJ. Clique, envie, falhe. Claramente, a experiência de minha irmã nesse URL é diferente da de sua amiga.

Relacionado, mas não estritamente relacionado ao tópico: Estou na fase inicial de design de um aplicativo desenvolvido para apoiar esforços significativos de pesquisa na rede (chamados quests (pense: marcadores sobre esteróides e LSD)). O proprietário da missão deseja compartilhar uma visualização específica de seus dados com outra pessoa, mas essa visualização requer uma combinação do estado da interface do usuário (por exemplo, quais visualizações de quais dados estão mostrando em quais painéis), juntamente com as permissões apropriadas para acessar a interface do usuário e os dados exibidos. Há muito estado armazenado necessário para que o destinatário obtenha a visualização desejada.

Minha solução atual é armazenar todas as informações da interface do usuário / ACL / todas as informações necessárias para a exibição em um objeto separado e retornar a URL (provavelmente um UUID) para esse objeto. Acredito que acessar o objeto view pode ser considerado RESTful no sentido de que todos os que possuem o mesmo recebem a mesma informação / experiência.

Peter Rowell
fonte
1
Você vê o exemplo de objeto é outro ângulo sobre isso. Arrumado.
Matt
Aceitar isso como resposta, apesar das outras grandes respostas, principalmente porque responde diretamente à pergunta e dá um exemplo muito claro. Além disso, a segunda parte dos objetos de exibição inclinou a balança.
Matt
1
Se você está dizendo que o site wsj é um exemplo de aplicativo não repousante, discordo que seu exemplo mostra isso. Se, por exemplo, o site do WSJ conta com dados fornecidos completamente pelo cliente de sua irmã para apresentar os dados, é pela definição que @Matt deu, RESTful. No entanto, se depender de um estado temporário de sessão na memória, é pela definição que Matt não deu RESTful. Apenas mencionei isso porque a definição que Matt deu é baseada em especificações de implementação, enquanto o REST é melhor definido pela técnica de consumo.
Jimmy Hoffa
@ JimmyHoffa - Meu entendimento das restrições do REST é que elas são apátridas . Isso parece bastante inequívoco para mim.
Peter Rowell
Se o aplicativo WSJ não tivesse estado, o artigo visível teria que ser enviado pelo cliente. Esse artigo pode ser editado a qualquer momento pelos administradores do site. Não se engane, é parte do estado do aplicativo WSJ. Eu acho que a distinção que se busca é que seja um estado persistente , portanto terá mais garantias e menos sobrecarga de gerenciamento do que um estado impersistente, como sessões, juntamente com um controle mais simples da atomicidade nas transações nele. Junto com o modelo de consumo simples, é para isso que as pessoas querem descansar. (Eu acho)
Jimmy Hoffa
2

As sessões do lado do servidor violam o REST?

Eles definitivamente fazem! Ao implementar o REST, não deve haver sessão do lado do servidor; caso contrário, você possui uma solução RPC / REST híbrida.

O cliente deve enviar para um serviço RESTful todo o contexto necessário para atender à solicitação, incluindo as informações necessárias para autenticar o cliente, sempre que uma nova solicitação é feita. O servidor é livre para armazenar informações em cache para agilizar o atendimento de solicitações subsequentes, mas as informações em cache não devem corresponder a uma sessão do servidor. Em outras palavras, a própria solicitação deve conter informações suficientes para serem processadas, mesmo na ausência do estado em cache.

dasblinkenlight
fonte
1

Provavelmente depende do que você quer dizer com "dados da sessão". Esse é um termo preciso?

A comunicação segura entre duas partes geralmente envolve o servidor para gerar (e armazenar) um "token de acesso" com tempo limitado que o cliente deve fornecer a cada solicitação como uma forma de autorização. Esse token de acesso já é o que eu chamaria de "dados da sessão" - é armazenado no servidor, com tempo limitado e relacionado a um cliente (geralmente suas permissões).

Eu ficaria muito surpreso se esse tipo de operação fosse rotulado como não-RESTful. OAuth é um exemplo.

Não sou especialista e não estou muito confiante aqui; Estou apenas compartilhando minhas idéias, esperando que sejam úteis.

Kos
fonte
1

O ponto mais importante do REST é que um URI para um recurso sempre aponta para o mesmo recurso. Assim, os usuários podem passar uma referência a esse recurso e todos vêem o mesmo. Isso é chamado de Representational State Transfer (REST). Se o servidor mantiver o estado e fornecer um recurso diferente para o mesmo URI, eu diria que isso não é mais puro REST.

Puckl
fonte
isso não é necessariamente verdade, pois os usuários verão a mesma coisa. O acesso pode ditar quanto cada usuário pode ver.
Erik
@Erik Mas o usuário indicaria o quanto deseja ver na solicitação (incluindo o uso do cabeçalho Accept), para que as respostas de Puckl sejam verdadeiras.
27414 Johan Johan
1
@ John Gostaria de retornar dados diferentes para usuários diferentes, do mesmo ponto de extremidade. Caso contrário, qual é o sentido de autenticar o usuário.
Erik
@ Erik eu faria isso também. Não obstante, acredito que a autenticação esteja fora do estado do recurso, portanto, estritamente falando, se a exibição for afetada pelo usuário autenticado, não será mais RESTful. Talvez, se você quisesse seu selo RESTful, crie várias "visualizações" do recurso, dependendo de quem está solicitando acesso e autorize o acesso a apenas algumas das visualizações. Então público pode ter acesso ao / UserProfiles / {userID} / PublicView eo usuário tem acesso a / UserProfiles / {userID} / fullprofile e autorizadas amigos tenha acesso aos / UserProfiles / {userID} / friendsview
Johan
0

As sessões são basicamente usadas para adicionar estado a aplicativos RESTful sem estado. Portanto, formalmente, isso torna seu aplicativo RESTful com estado, mas manter o servidor em estado facilita a sua vida, pois você não precisa passar todos os dados para frente e para trás em cada solicitação / resposta.

As sessões e, geralmente, permitem evitar isso, e isso traz alguns benefícios positivos em desempenho (menos dados transferidos) e segurança (menos dados disponíveis para adulteração).

Portanto, embora viole oficialmente parte da definição de REST, é tão útil que é raro ver aplicativos RESTful que não usam o estado por meio de sessões.

Oleksi
fonte
Discordo. Você tem um site de compras que permite filtrar por marca, cor e tamanho. Os sites tradicionais da Web 1.0 lidariam com isso com algumas caixas de seleção, uma sessão do servidor e POST. Se eu quiser compartilhar o link para example.org/shirts, as pessoas não verão que selecionei Médio, Preto e Raízes. (Isso também causa a mensagem feia "você está recuperando dados" quando você clica em voltar.) Mas se eu compartilhar o link para (por exemplo) example.org/shirts/medium-black-roots, todos terão a mesma representação. Todas as informações de estado necessárias estão no URL (ou no corpo do POST, se necessário, mas você não pode compartilhá-las).
Jesse Buchanan
... RESTful pode não ser adequado para tudo. Seu recurso hipotético de aplicação é orientado (um site de compras certamente é!)? Talvez não seja adequado para uma RIA, com muito estado, que não é orientado a recursos. Não consigo pensar em nenhum bom exemplo para ser honesto.
Jesse Buchanan
0

O que Fielding quis dizer com essa declaração é que o servidor de aplicativos que hospeda a API REST não associa o estado do ambiente a uma solicitação por algum tipo de mecanismo dos bastidores. Considere a diferença entre um servidor de aplicativos e um servidor de banco de dados . A restrição REST é que o servidor de aplicativos deva ser sem estado . No entanto, o servidor de aplicativos pode delegar solicitações de estado de recurso ao servidor de banco de dados com base em informações que fazem parte da solicitação, como uma combinação de usuário / senha no cabeçalho da Autorização ou no próprio Uri. Afinal, o REST é baseado no modelo de cliente / servidor.

eulerfx
fonte