Utilizzo delle sessioni con Jersey in un'API REST

0

Sto iniziando a sviluppare un'API REST con Jersey per recuperare un programma per un determinato torneo sportivo. Il client invia un JSON contenente un torneo con le sue diverse categorie, dominio, definizioni e configurazione. Questo sarà irraggiungibile da Jackson. E la risposta include un JSON con il programma calcolato per quel torneo, schierato da Jackson pure.

Voglio rendere l'API più "API-like" possibile, nel senso di API comuni come le API meteo o le API di mappe, in cui l'interazione client-server è un'operazione diretta, concisa, di tipo richiesta-risposta, in questo caso sarebbe "inviare un torneo, ottenere un programma", in cui nessuna associazione tra il client e i riferimenti istanziati (o le associazioni concettuali) sono lasciati nel server. Immagino che la parola per questo sarebbe "senza stato".

Tuttavia, ho bisogno di una sorta di riferimento al torneo che è stato inviato per eseguire operazioni successive su quell'oggetto instanciated. Il caso sarebbe, ad esempio, per recuperare il "prossimo" programma per il torneo. Ci sono potenzialmente molti altri casi.

Poiché utilizzo la Programmazione vincoli per calcolare gli orari, posso ottenere tutte le possibili combinazioni di programmi per un determinato torneo. Ma un'operazione diretta come descritta elimina l'istanza non appena la pianificazione viene restituita nella risposta, quindi non sarei in grado di invocare metodi come tournament.nextSchedules() perché l'oggetto tournament semplicemente non sarebbe lì . Quindi mi è stato suggerito di usare le sessioni. Quindi, presumo che avrei una mappa di ID di sessione e un'istanza di Tournament nella mia classe di servizio Web Jersey:

@Path("eventscheduler")
public class EventSchedulerService {
    private Map<String, Tournament> tournaments = new HashMap<>();
}

Quindi, se volessi eseguire un'azione su un particolare torneo, dovrei semplicemente recuperare la relativa corrispondenza su un ID di sessione, che può essere passato nell'URL come @PathParam .

Ecco le mie domande:

  • Come potrei farlo con Jersey? Come posso generare una sessione e archiviarla come previsto? Nota che questo non ha nulla a che fare con la sicurezza . L'unico scopo dell'utilizzo di sessioni è quello di essere in grado di identificare un particolare riferimento di Tournament .
  • Come posso impostare un tempo di scadenza su una sessione? Non vorrei avere un cliente legato per sempre a un'istanza di un torneo particolare. Anche se probabilmente creerò un metodo per eliminare esplicitamente un client in una sessione, oltre a eliminare la mappatura, vorrei anche che scada e venga rimosso dal dizionario. Come si può fare?

Si noti inoltre che nessun database viene utilizzato e non è destinato ad essere utilizzato poiché non è l'obiettivo di questo progetto e non dovrebbe essere necessario.

    
posta dabadaba 31.05.2016 - 12:03
fonte

1 risposta

4

Non dovrebbe essere necessario usare le sessioni per questo scenario.

Quando il client crea una nuova risorsa Tournament (rappresentata in JSON) può PUT o POST quella risorsa sul server. Quale sceglierai dipenderà da chi è responsabile per l'identificatore univoco del Torneo. Se il client sa già quale URL dovrebbe essere per quel Torneo (diciamo che è basato sul nome), può semplicemente mettere questa risorsa su quell'URL sul server (per esempio /tournaments/west_coast_regionals_2016 )

Se il server determina l'URL, il client deve POSTARE la risorsa Torneo a una risorsa di raccolta (ad esempio /tournaments ) e tale risorsa genera un ID univoco per la risorsa e lo restituisce al client.

In entrambi i casi il client recupera l'URL della risorsa appena inviata al server. Se mai vuole accedere di nuovo a quella risorsa, usa solo quell'URL.

GET /tournaments/west_cost_regionals_2016

E il server restituisce tale risorsa al client. Se il server ha elaborato una pianificazione, può fornire ulteriori informazioni al corpo della risposta, oppure il modo in cui è possibile aggiungere una nuova risorsa contenente solo le informazioni sull'evento successivo

GET /tournaments/west_cost_regionals_2016/next_event

Utilizzare una sessione dovrebbe essere completamente inutile.

    
risposta data 31.05.2016 - 15:40
fonte

Leggi altre domande sui tag