rest - sinonimo - rinuncia volontaria alla cittadinanza




Se le applicazioni REST devono essere apolidi, come gestisci le sessioni? (9)

Ho bisogno di qualche chiarimento. Ho letto di REST e ho creato applicazioni RESTful. Secondo wikipedia, REST stesso è definito come trasferimento di stato di rappresentanza . Perciò non capisco tutto questo senzatetto ingenuo che tutti continuano a vomitare.

Da Wikipedia:

In qualsiasi momento, un cliente può essere in transizione tra stati dell'applicazione o "a riposo". Un client in uno stato di riposo è in grado di interagire con il proprio utente, ma non crea alcun carico e non consuma memoria per client sul set di server o sulla rete.

Stanno solo dicendo di non usare il deposito di dati a livello di sessione / applicazione ???

Ho ottenuto che un obiettivo di REST è rendere l'accesso URI coerente e disponibile, ad esempio, invece di nascondere le richieste di paging nei post, rendendo il numero di pagina di una richiesta una parte dell'URI GET. È sensato per me. Ma sembra che stia esagerando dicendo che nessun dato per client (dati di sessione) dovrebbe mai essere memorizzato sul lato server.

Cosa accadrebbe se avessi una coda di messaggi e il mio utente volesse leggere i messaggi, ma mentre li leggeva voleva bloccare determinati messaggi dei mittenti che arrivavano per tutta la durata della sua sessione? Non avrebbe senso archiviarlo in un posto sul lato server e fare in modo che il server invii solo messaggi (o ID messaggio) che non sono stati bloccati dall'utente?

Devo davvero inviare l'intero elenco di mittenti dei messaggi da bloccare ogni volta che richiedo il nuovo elenco dei messaggi? La lista dei messaggi pertinente non dovrebbe / non dovrebbe essere nemmeno una risorsa disponibile al pubblico in primo luogo.

Di nuovo, sto solo cercando di capire questo. Qualcuno per favore chiarisci.

Aggiornare:

Ho trovato una domanda di overflow dello stack che ha una risposta che non mi fa arrivare fino in fondo: come gestire lo stato in REST che dice che lo stato del client che è importante dovrebbe essere trasferito su ogni richiesta .... Ugg .. sembra un sacco di spese generali ... è giusto ??


Stanno solo dicendo di non usare il deposito di dati a livello di sessione / applicazione ???

No. Non lo dicono in modo banale.

Stanno dicendo che non definire una "sessione". Non effettuare il login Non eseguire il logout. Fornire le credenziali con la richiesta. Ogni richiesta è indipendente.

Hai ancora archivi di dati. Hai ancora autenticazione e autorizzazione. Non perdi tempo a stabilire sessioni e mantenere lo stato della sessione.

Il punto è che ogni richiesta (a) è completamente isolata e (b) può essere banalmente sviluppata in una gigantesca server farm parallela senza alcun lavoro effettivo. Apache o Squid possono passare richieste RESTful in modo cieco e con successo.

Cosa accadrebbe se avessi una coda di messaggi e il mio utente volesse leggere i messaggi, ma mentre li leggeva voleva bloccare determinati messaggi dei mittenti che arrivavano per tutta la durata della sua sessione?

Se l'utente desidera un filtro, quindi fornire semplicemente il filtro su ogni richiesta.

Non avrebbe senso ... lasciare che il server invii solo messaggi (o ID messaggio) che non sono stati bloccati dall'utente?

Sì. Fornire il filtro nella richiesta URI RESTful.

Devo davvero inviare l'intero elenco di mittenti dei messaggi da bloccare ogni volta che richiedo il nuovo elenco dei messaggi?

Sì. Quanto può essere grande questa "lista di mittenti da bloccare"? Un breve elenco di PK?

Una richiesta GET può essere molto grande. Se necessario, puoi provare una richiesta POST anche se sembra una specie di query.


Stateless significa che lo stato del servizio non persiste tra richieste e risposte successive. Ogni richiesta porta le proprie credenziali utente ed è autenticata individualmente. Ma nello stato ogni richiesta è nota da qualsiasi richiesta precedente. Tutte le richieste stateful sono orientate alla sessione, ovvero ogni richiesta deve conoscere e conservare le modifiche apportate nelle richieste precedenti.

L'applicazione bancaria è un esempio di applicazione stateful. Dove l'utente effettua il primo accesso, effettua la transazione e si disconnette. Se dopo l'uscita l'utente proverà a effettuare la transazione, non sarà in grado di farlo.

Sì, il protocollo http è essenzialmente un protocollo stateless ma per renderlo a livello ci facciamo dei cookie HTTP. Quindi, SOAP è di default. Ma può essere allo stesso modo statico, dipende dalla struttura che stai usando.

HTTP è stateless ma possiamo ancora mantenere la sessione nella nostra applicazione java usando un meccanismo di tracciamento delle sessioni diverso.

Sì, possiamo anche mantenere la sessione in webservice indipendentemente dal fatto che si tratti di REST o SOAP. Può essere implementato utilizzando qualsiasi libreria di terze parti o è possibile implementarla da soli.

Tratto da http://gopaldas.org/webservices/soap/webservice-is-stateful-or-stateless-rest-soap


La spiegazione fondamentale è:

Nessuno stato della sessione client sul server.

Per stateless significa che il server non memorizza nessuno stato sulla sessione client sul lato server.

La sessione client è archiviata sul client. Il server è senza stato significa che ogni server può servire qualsiasi client in qualsiasi momento, non ci sono affinità di sessione o sessioni appiccicose . Le informazioni relative alla sessione vengono archiviate sul client e passate al server in base alle esigenze.

Ciò non preclude agli altri servizi a cui il server web parla di mantenere lo stato sugli oggetti di business come i carrelli degli acquisti, ma non sullo stato corrente dell'applicazione / sessione del client.

Lo stato dell'applicazione del client non deve mai essere archiviato sul server, ma trasferito dal client a ogni luogo che ne ha bisogno.

Ecco da dove viene la ST in REST , State Transfer . Si trasferisce lo stato in giro invece di avere il server memorizzarlo. Questo è l'unico modo per ridimensionare a milioni di utenti simultanei. Se non altro perché milioni di sessioni sono milioni di sessioni.

Il carico della gestione della sessione viene ammortizzato su tutti i client, i client memorizzano il loro stato di sessione e i server possono servire molti ordini di grandezza o più client in modo stateless.

Anche per un servizio che pensi abbia bisogno solo di migliaia di utenti simultanei, devi comunque rendere il tuo servizio senza stato. Decine di migliaia sono ancora decine di migliaia e ci sarà il tempo e il costo dello spazio ad esso associati.

Stateless è il modo in cui il protocollo HTTP e il web in generale sono stati progettati per funzionare ed è un'implementazione più semplice complessiva e si dispone di un singolo percorso di codice anziché di una serie di logica lato server per mantenere un gruppo di stati di sessione.

Ci sono alcuni principi di implementazione molto basilari:

Questi sono principi non implementazioni, il modo in cui si soddisfano questi principi può variare.

In sintesi, i cinque principi chiave sono:

  1. Dare ad ogni "cosa" un ID
  2. Collega le cose insieme
  3. Usa metodi standard
  4. Risorse con rappresentazioni multiple
  5. Comunicare statelessly

Non c'è nulla su autenticazione o autorizzazione nella dissertation REST.

Perché non c'è nulla di diverso dall'autenticazione di una richiesta che è RESTful da una che non lo è. L'autenticazione è irrilevante per la discussione RESTful.

Spiegare come creare un'applicazione senza stato per i tuoi particolari requisiti, è troppo ampio per .

L'implementazione dell'autenticazione e dell'autorizzazione relativa al REST è ancora più ampia e vari approcci alle implementazioni sono spiegati in modo approfondito su Internet in generale.

I commenti che chiedono aiuto / informazioni su questo / dovrebbero essere segnalati come non più necessari .


Dai un'occhiata a questa presentazione.

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

Secondo questo modello, creare risorse restie transitorie per gestire lo stato se e quando realmente necessario. Evita sessioni esplicite.


Hai assolutamente ragione, il supporto di interazioni completamente prive di stato con il server pone un onere aggiuntivo sul client. Tuttavia, se si considera il ridimensionamento di un'applicazione, il potere di calcolo dei client è direttamente proporzionale al numero di client. Pertanto il ridimensionamento a un numero elevato di clienti è molto più fattibile.

Non appena si mette un po 'di responsabilità sul server per gestire alcune informazioni relative alle interazioni di un cliente specifico, tale onere può crescere rapidamente fino a consumare il server.

È un compromesso.


L'apolidia significa che ogni richiesta HTTP avviene in completo isolamento. Quando il client effettua una richiesta HTTP, include tutte le informazioni necessarie affinché il server soddisfi tale richiesta. Il server non fa mai affidamento sulle informazioni delle richieste precedenti. Se quell'informazione fosse importante, il cliente dovrebbe inviarlo di nuovo nella richiesta successiva. L'apolidia porta anche nuove funzionalità. È più facile distribuire un'applicazione senza stato su server con bilanciamento del carico. Anche un'applicazione stateless è facile da memorizzare nella cache.

Ci sono in realtà due tipi di stato. Stato dell'applicazione che vive sul client e sullo stato delle risorse che vive sul server.

Un servizio Web deve solo preoccuparsi dello stato dell'applicazione quando si sta effettivamente facendo una richiesta. Il resto del tempo, non sa nemmeno che esisti. Ciò significa che ogni volta che un client effettua una richiesta, deve includere tutti gli stati dell'applicazione in cui il server dovrà elaborarlo.

Lo stato delle risorse è lo stesso per ogni client e la sua posizione corretta è sul server. Quando carichi un'immagine su un server, crei una nuova risorsa: la nuova immagine ha il proprio URI e può essere la destinazione delle richieste future. È possibile recuperare, modificare ed eliminare questa risorsa tramite HTTP.

Spero che questo aiuti a differenziare ciò che significano l'apolidia e vari stati.


La principale differenza tra stateless vs Stateful è che i dati vengono passati di nuovo al server ogni volta. In caso di apolidi, il cliente deve fornire tutte le informazioni in modo che molti parametri possano essere superati in ogni richiesta. In Stateful, il cliet passa quei parametri una volta e vengono mantenuti dal server fino a quando non vengono modificati di nuovo dal client.

IMO, API dovrebbe essere senza stato che consente di scalare molto rapidamente.


REST è molto astratto. Aiuta ad avere alcuni esempi buoni, semplici e reali.

Prendiamo ad esempio tutte le principali app di social media: Tumblr, Instagram, Facebook e Twitter. Hanno tutte una vista a scorrimento continuo dove più si scorre verso il basso, più contenuti si vedono, sempre più indietro nel tempo. Tuttavia, tutti abbiamo vissuto quel momento in cui perdi la posizione in cui sei stato spostato e l'app ti riporta in cima. Ad esempio, se esci dall'app, quando la riapri, torni di nuovo in cima.

Il motivo è perché il server non ha memorizzato lo stato della sessione. Purtroppo, la posizione di scorrimento è stata appena memorizzata nella RAM sul client.

Fortunatamente non è necessario accedere di nuovo quando si riconnette, ma è solo perché il certificato di accesso memorizzato sul lato client non è scaduto. Elimina e reinstalla l'app e dovrai ricollegarti perché il server non ha associato il tuo indirizzo IP alla tua sessione.

Non hai una sessione di accesso sul server, perché rispettano il REST.

Ora gli esempi sopra non implicano affatto un browser Web, ma sul back-end, le app comunicano tramite HTTPS con i loro server host. Il mio punto è che REST non deve coinvolgere cookie e browser, ecc. Esistono vari modi per memorizzare lo stato della sessione lato client.

Ma parliamo dei browser web per un secondo, perché questo fa emergere un altro importante vantaggio di REST di cui nessuno qui sta parlando.

Se il server ha tentato di memorizzare lo stato della sessione, come si dovrebbe identificare ogni singolo client?

Non poteva usare il loro indirizzo IP, perché molte persone potevano usare lo stesso indirizzo su un router condiviso. Allora, come?

Non può utilizzare l'indirizzo MAC per molte ragioni, non ultimo perché è possibile accedere contemporaneamente a più account Facebook su più browser più l'app. Un browser può facilmente fingere di essere un altro e gli indirizzi MAC sono altrettanto facili da falsificare.

Se il server deve memorizzare uno stato lato client per identificarti, deve archiviarlo nella RAM più del tempo necessario per elaborare le richieste, oppure deve memorizzare nella cache tali dati. I server hanno una quantità limitata di RAM e cache, per non parlare della velocità del processore. Lo stato lato server si aggiunge a tutti e tre, in modo esponenziale. Inoltre, se il server memorizza qualsiasi stato relativo alle sessioni, deve archiviarlo separatamente per ogni browser e app con cui si è attualmente connessi, nonché per ogni altro dispositivo utilizzato.

Quindi ... spero che ora capiate perché REST è così importante per la scalabilità. Spero che tu possa iniziare a capire perché lo stato della sessione lato server sia la scalabilità del server che le incudini saldate sono per l'accelerazione dell'auto.

Dove le persone si confondono è pensando che "stato" si riferisca a, come, le informazioni memorizzate in un database. No, si riferisce a qualsiasi informazione che deve essere nella RAM del server quando la stai usando.


Vedo che il problema di base qui è mescolare Session with State . E mentre REST specifica che NON si deve memorizzare lo stato sul server, nulla impedisce di memorizzare una sessione utente.

Gestire lo stato sul server significa che il server sa esattamente cosa sta facendo il client (quale pagina sta visualizzando in quale sezione dell'applicazione). E questo è quello che non dovresti aver bisogno di fare.

Sono d'accordo con le altre persone che dicono che si dovrebbe mantenere la memoria di sessione a una dimensione minima; e mentre questo è buon senso, dipende anche dall'applicazione. Quindi, in breve, è ancora possibile mantenere una sessione con i dati memorizzati nella cache per gestire le richieste con meno carico sul server e gestire l'autenticazione fornendo un token di autenticazione / accesso temporaneo da utilizzare per il client. Ogni volta che la sessione / token è scaduta, generane una nuova e chiedi al client di usarla.

Qualcuno potrebbe obiettare che il client dovrebbe generare meglio il token. Dico che funziona in entrambi i modi e che dipenderà dall'applicazione e da chi lavorerà con l'API.

Mantenere alcuni dati sensibili sulla sessione sul server dovrebbe essere il modo giusto per farlo. Non è possibile fidarsi del client per mantenere il carrello della spesa che (ad esempio) contiene un campo denominato "isFreeGift". Tali informazioni dovrebbero essere conservate sul server.

Il link video fornito da Santanu Dey nella sua risposta è utile. Guardalo se non l'hai fatto.

Solo una nota a margine: sembra che tutte le risposte già date sembrano ignorare il fatto che alcune operazioni potrebbero causare un carico pesante sul server. Ciò è rilevante in termini di consumo di energia, consumo di hardware e costi (per i server affittati dal ciclo della CPU). Un buon sviluppatore non dovrebbe essere pigro nell'ottimizzare la propria applicazione, anche se l'operazione può essere eseguita molto rapidamente su una CPU moderna su un server in affitto per il quale non pagano la bolletta dell'elettricità e della manutenzione.

Anche se la domanda è di qualche anno, spero che la mia risposta sia comunque utile.





session-state