2011-10-10 21 views
9

Sono nuovo ai servizi web RESTful e RESTlet. ABBIAMO solo esperienza nella creazione di applicazioni Web basate su servlet (Servlet/JSP su JBoss/Apache). Ora stiamo costruendo un'applicazione basata su RESTlet in cui l'API lato server viene utilizzata da due tipi di client: il Web utilizza il browser e lo swing basato sul desktop.Come applicare "sessioni" nei servizi Web RESTful tramite RESTlet?

Quello che ho capito è che, come per REST concetti a) del server non può mantenere le sessioni per migliorare la scalabilità e pochi altri motivi b) ogni richiesta dal client deve essere autosufficiente

Ora, io sono davvero confuso come ottenere questo. Supponiamo di prendere una semplice applicazione per il carrello degli acquisti.

Passaggio 1) Il client invia la richiesta di autenticazione, il server autentica e il server risponde OK.

Passaggio 2) Il client invia una richiesta per aggiungere un articolo al carrello. Il server risponde OK.

Passaggio 3) Il client invia un'altra richiesta per aggiungere il secondo articolo alla carta acquisti. Il server risponde OK.

Normalmente, in una normale app Web, una sessione viene creata nel passaggio 1 sul server e da quel momento in poi tutte le richieste relative a quel client vengono automaticamente associate alla stessa sessione e viene memorizzato lo stato della sessione (Carrello acquisti in questo caso) nell'oggetto di sessione e recuperarlo/aggiornarlo con le richieste successive dal client.

Ora, nello scenario di cui sopra:

1) come si fa autenticare e autorizzare client nella Fase 2 e 3 se non v'è nessuna sessione mantenuto sul server?

2) il client deve inviare alcune informazioni aggiuntive con ciascuna richiesta?

3) Come si recupera il carrello acquisti specifico del cliente nel passaggio 3?

4) Il client deve inviare il suo carrello acquisti che è stato creato/restituito dal server al passaggio 2 di nuovo nel passaggio 3?

Ovviamente, questo è il caso di utilizzo più semplice e quindi tutti quelli che sviluppano servizi Web RESTful devono progettare la propria app per gestirli. Qual è il modo migliore e più comune per gestire la gestione delle sessioni, l'autenticazione, l'autorizzazione nei servizi web RESTful usando RESTLet? Se dobbiamo mantenere la cache sul lato server con i dati del cliente, in che modo questo è diverso dal server che mantiene le sessioni per nostro conto?

Grazie in anticipo, profonda

risposta

15

1) come si fa autenticare e autorizzare client nella Fase 2 e 3 se non v'è alcuna sessione mantenuto sul server?

2) il cliente deve inviare alcune informazioni aggiuntive con ciascuna richiesta ?

Sì. Devi inviare i dati di autenticazione/autorizzazione ad ogni richiesta. Questo è ciò che impedirà al server di "ricordare" chi sei (ad es., server stateless, nessuna sessione)

3) Come si recupera il carrello acquisti specifico del cliente nel passaggio 3?

Facciamo una domanda diversa: cosa succede se il server si riavvia? Vuoi che tutti i dati del carrello acquisti si perdano? Probabilmente no. Il che implica che devi conservarlo da qualche parte in modo che possa sopravvivere al riavvio. Implica la conservazione persistente. Potrebbe essere sul server o sul client ...

... ora, cosa succede se il client si riavvia? È possibile scegliere di creare una "risorsa" del carrello acquisti per quell'utente utilizzando una richiesta POST (quando l'utente aggiunge il primo elemento) o averla creata nel momento in cui il client esegue l'accesso (inutile). Quindi si continua ad aggiornare il carrello acquisti utilizzando PUT/DELETE e recuperarlo tramite GET.

Dovrebbe essere nel DB? Potrebbe essere, dipende se è così che vuoi che sia. Se deve essere persistente, è un buon posto per tenerlo in modo che possa sopravvivere al riavvio.

Quindi, come ricevere il carrello acquisti specifico del cliente? Bene, basta inviare una richiesta GET per la risorsa !!! Questo è tutto! Il primo POST creerà una risorsa con un URL appropriato e sarà quindi possibile utilizzarlo.

I servizi Web riposati hanno anche URL riposanti, quindi questa è una parte fondamentale del design.

4) Ha il cliente ha bisogno di inviare è Carrello che è stato creato /restituito dal server nel passo 2 di nuovo al punto 3?

No. Come accennato in precedenza. Ma se stai usando cookies o LocalStorage o qualche altra informazione sul lato client, allora forse lo fai.

Ovviamente, questo è il caso d'uso più semplice e così ognuno sviluppo servizi web RESTful deve essere progettando la loro app per gestire questa situazione. Qual è il modo migliore e più comune per gestire la gestione delle sessioni, l'autenticazione , l'autorizzazione a servizi web RESTful utilizzando Restlet?

Sì. È semplice, ma ci vuole un po 'per pensare in termini di "risorse" piuttosto che di "servizi". Nel design riposante tutto è (o può essere) una risorsa, incluse transazioni, carrelli della spesa ecc.,

Tuttavia, l'autorizzazione/autenticazione fanno parte del pacchetto di richiesta http e vengono inviate con ogni richiesta. Ti suggerisco di leggere su quelli.

Se dobbiamo mantenere la cache sul lato server con i dati del cliente allora come è questo diverso dal server di mantenere le sessioni per nostro conto ?

grande differenza! Stai memorizzando nella cache per le prestazioni o il mantenimento di una sessione? Se il sistema si riavvia il sistema funzionerà senza problemi su una cache vuota? Se sì, stai memorizzando nella cache per la performance altrimenti stai mantenendo lo stato.

Consiglio vivamente di leggere RESTful Web Services di Richardson & Ruby per edificare i concetti di cui sopra e ottenere maggiori informazioni su come sono progettati i servizi di riposo ... ci vuole un po 'di tempo per abituarsi.

+0

ma perché è male se il server si ricorda chi sei (e solo quello). se non si aderisce dogmaticamente alle specifiche REST, è possibile scendere a compromessi e salvarsi dall'invio dell'autenticazione ogni singola richiesta. – amphibient

+0

Il tuo design può sopravvivere al riavvio? Inoltre c'è sempre qualche assegno per assicurarsi che sia la stessa persona e non una sessione rubata. – PhD

Problemi correlati