9

Questa domanda è solo per confermare che sono chiaro su questo concetto."Sessioni" con Google Cloud Endpoint

Per quanto ho capito, Google Cloud Endpoint sono tipo di implementazione di Google di REST servizi, in modo che essi non possono mantenere i dati "di sessione" in memoria, quindi:

  • Utenti deve inviare dati di autenticazione ad ogni richiesta.
  • Tutti i dati che voglio utilizzare in seguito su devono essere persistenti, vale a dire, con ogni richiesta API che ricevo, devo accedere al Datastore, fare qualcosa e memorizzare nuovamente i dati.

È corretto? E se è così, è davvero buono in termini di prestazioni?

risposta

3

Il datastore è piuttosto veloce soprattutto se si esegue una ricerca chiave (come richiesto per la query). se si utilizza NDB, si avrà il vantaggio di memorizzare automaticamente le proprie ricerche.

+0

Grazie @Shay! Scusa la mia ignoranza, ma quando dici "ricerca chiave" intendi usare direttamente "getObjectById" invece di una query, giusto? E che cos'è NDB? – MikO

+0

Quindi sei un ragazzo Java, NDB è per Python. –

+0

E sì: la ricerca dei tasti utilizza getObjectById –

2

Sì, il codice backend dell'API di Cloud Endpoint (Java o Python) è ancora in esecuzione su App Engine, quindi si ha lo stesso accesso a tutte le risorse che si avrebbero su App Engine.

Sebbene non sia possibile impostare cookie lato client per le sessioni, è comunque possibile ottenere un utente per una richiesta e archiviare i dati specifici dell'utente nel datastore. Come accennato da @Shay Erlichmen, se accoppi il datastore con memcache e una cache in contesto (come fa ndb), puoi fare queste ricerche molto velocemente.

Per fare ciò in Python o Java, è necessario specificare allowed_client_ids o audiences nell'annotazione/decoratore sull'API e/o sui metodi. Vedi lo docs per maggiori informazioni.

Python:

Se si desidera ottenere un utente in Python, chiamare

endpoints.get_current_user() 

dall'interno di una richiesta che è stato annotato con allowed_client_ids o audiences. Se restituisce None, non esiste un utente valido (e si dovrebbe restituire un 401).

Java:

Per avere un utente, su un metodo annotato (o metodo di cui un'API annotato), semplicemente specificare un oggetto utente nella richiesta:

import com.google.appengine.api.users.User; 

... 

    public Model insert(Model model, User user) throws 
     OAuthRequestException, IOException { 

e come in Python, verificare se user è null per determinare se un token OAuth 2.0 valido è stato inviato con la richiesta.

4

Sì, è possibile utilizzare la sessione, solo mettere un altro Paramether nel metodo API con HttpServlet:

@ApiMethod 
public MyResponse getResponse(HttpServletRequest req, @Named("infoId") String infoId) { 
    // Use 'req' as you would in a servlet, e.g. 
    String ipAddress = req.getRemoteAddr(); 
    ... 
} 
+0

Ho capito da questa domanda: [collegamento] (http://stackoverflow.com/questions/15056830/getting-raw-http-data-headers-cookies-etc-in-google-cloud-endpoints) –

+4

È davvero interessante , ma non è corretto ... Il fatto che tu possa passare un parametro HttpRequest non significa affatto che tu possa usare le sessioni ... Come spiegato nel link da cui hai copiato la tua risposta, questo è utile per ottenere richiesta informazioni Ma l'Endpoint non inoltra la richiesta (come Servlets) ma restituisce solo un oggetto MyResponse, quindi la sessione andrà persa ... – MikO

+0

Dai un'occhiata a questo link https://cloud.google.com/appengine/docs/java/config/appconfig e cerca "Abilitazione sessioni". Con questo, il tuo server avrà una sessione con MaxInactiveInterval uguale a -1, che indica che la sessione non dovrebbe mai scadere. – user3081007