Progettare una API con una catena di query

3

Sto cercando di scrivere un resto GET API per servire i risultati della query. L'intero flusso che si verifica sul server è:

  1. Recupera dati utente
  2. Chiama la prima query, se i risultati vengono generati: restituisci risultati, altrimenti continua
  3. Chiama la seconda query, se i risultati sono generati: restituisci risultati, altrimenti continua
  4. E e continua così.

Il problema è che voglio ricordare quale query ha generato i risultati e la volta successiva che l'utente effettua la richiesta, chiama e avvia la catena da lì invece che i precedenti. Inoltre, poiché il passaggio 1 genera sempre gli stessi dati per quell'utente specifico, voglio saltare anche questo nelle query successive. Quale sarebbe la migliore pratica per questo?

L'endpoint suggerisce alcuni elementi all'utente come raccomandazioni. Per generare questi, recupero gli oggetti visti dall'utente ed eseguo determinate query, ad esempio, in base al tipo, seconda in base al prezzo e così via. I dati dell'utente aiutano in queste query, ad esempio, i prezzi delle cose che ha visto, il tipo di prodotti e così via. Dal momento che gli utenti che hanno visto gli articoli sono sensibili, non voglio inviarli di nuovo al client.

Ho pensato di inviare alcuni dati di supporto come il numero di query al client (app per dispositivi mobili) e anche i dati utente del passaggio 1 indietro all'utente e inviarlo al server dal client mentre effettua le chiamate successive, ma il Non voglio inviare dati sensibili all'utente dal server al client.

Un altro modo in cui pensavo era usare una cache come Redis ma il problema è che l'aggiunta di una cache su Heroku sarebbe costosa. Qualsiasi altro modo?

    
posta mik dass 30.03.2018 - 17:04
fonte

2 risposte

1

Aggiungi un parametro di query facoltativo al tuo endpoint che specifica quale fase del processo sono attivi. In ogni risposta dall'API, includi un'intestazione Link . L'URI di destinazione include il parametro di query per il passaggio successivo. Usa il nome rel next per indicare che quella richiesta è la successiva della serie. I clienti possono seguire quel link per effettuare la prossima chiamata nella sequenza. I client possono lasciare il parametro di query per iniziare dall'inizio oppure possono seguire il link per ottenere il passaggio successivo. Non devi passare altre informazioni al cliente.

Per quanto riguarda il costo della generazione dei dati utente, per prima cosa verifica che sia un problema reale. In tal caso, puoi memorizzarlo in una semplice cache in memoria o in una tabella di database.

    
risposta data 30.03.2018 - 17:59
fonte
0

HTTP è intrinsecamente un protocollo stateless e tentare di hackerare insieme un endpoint che restituisce risultati diversi a seconda del numero di volte che lo chiamate è una pessima idea.

Perché? stai creando un sistema con risultati inaffidabili e il client non ha il controllo su di essi.

La soluzione
Penso che tu stia cercando l'impaginazione API. Invita l'utente a inviare il numero di pagina che desidera recuperare nel corpo della richiesta. Quindi, a seconda della pagina che stanno richiedendo, puoi eseguire la query corretta.

Questo è un esempio di come appare la richiesta con impaginazione:

{
    "query": "john",
    "page": 3,
    "limit": 10
}

In pratica, stiamo dicendo al server che vogliamo 10 risultati per pagina e che vogliamo vedere la pagina 3 dei risultati. E l'implementazione di questo nel back-end dovrebbe essere abbastanza semplice con l'uso delle funzioni di offset e limite del database.

    
risposta data 30.03.2018 - 17:55
fonte

Leggi altre domande sui tag