Sto cercando di trovare alcune opinioni sulle migliori pratiche per restituire diversi tipi di dati per lo stesso "endpoint". Sorprendentemente, non riesco a trovare molto su questo argomento.
Fondamentalmente, sto costruendo un'API per il nostro sito Web, che è un'app a pagina singola. Il client utilizza la memorizzazione nella cache per archiviare i dati tra le pagine e questi dati vengono aggiornati, se necessario, dal server (tramite websocket). Esistono diversi percorsi che restituiscono un elenco di dati. Ogni elemento nell'elenco può potenzialmente essere abbastanza grande e la lista stessa può contenere molti elementi.
Poiché il frontend utilizza già il caching, vogliamo ridurre la quantità di dati non necessari inviati al client, ove possibile. Un'opzione per realizzare ciò è fornire un modo per il frontend per ottenere un elenco degli ID delle risorse per una particolare richiesta. Sulla base di questo elenco, il client potrebbe quindi richiedere i dati di cui ha bisogno (ad esempio se si verifica un errore di cache).
Questo approccio è interessante, ma solleva diverse domande.
- Cosa succede se il frontend sa già che non ha nessuna delle risorse? Invece di richiedere un elenco di ID, dovrebbe essere in grado di richiedere direttamente i dati.
- Qual è l'approccio migliore? I possibili approcci e i loro (dis) vantaggi appaiono di seguito.
Domanda
Esiste un approccio non elencato di seguito che sembra appropriato? C'è un approccio che mi è mancato potrebbe essere migliore? Questo sembra eccessivo?
aproaches
-
Invia i dati - Opzione Nucleare # 1.
I vantaggi
- Semplicità
- Il tipo di reso è coerente
Svantaggi
- Il client potrebbe già avere molti dati, sprecando larghezza di banda
-
Utilizza la stessa route e dichiara un parametro query che determina il tipo di dati da restituire - Sebbene non sia l'opzione peggiore, sembra sporca restituendo diversi tipi di dati dallo stesso endpoint (sì, So che puoi specificare
Content-Type
nelle richieste, ma questa intestazione dice al server quale rappresentazione dei dati è desiderata, non in realtà ciò che tipo di dati da restituire).I vantaggi
- Il client può determinare quando vuole i dati o solo gli ID
Svantaggi
- Il tipo di reso dipende dal valore della query param
- Aggiunta logica condizionale
-
Consenti selezione campi. : questo approccio segue Suggerimento 7 su questo blog .
I vantaggi
Svantaggi
- Aggiunta complessità non necessaria - La selezione del campo non ha senso per la nostra app. Pertanto, l'unico valore valido per questo parametro sarebbe il campo ID
- Il formato dei dati dipende dalla query param - mentre il tipo di dati tecnicamente rimane lo stesso, la sua struttura è diversa in ogni richiesta. Non è qualcosa che mi piace davvero.
-
Prependi la rotta originale con
/ids
- I client sarebbero in grado di inviare una richiesta GET allo stesso percorso che avrebbero per i dati effettivi aggiunti da/ids
. Ad esempio, anziché/cars
, la richiesta verrebbe inviata a/ids/cars
.I vantaggi
- Sembra più semanticamente significativo rispetto all'uso di un parametro di query
Svantaggi
- GET sarebbe l'unica richiesta logica che verrebbe mai inviata a questi endpoint
- DRY o logica condizionale aggiunta - O deve essere aggiunto un nuovo endpoint che sostanzialmente duplica l'endpoint originale o lo stesso endpoint utilizzato con la stessa logica condizionale necessaria per il punto 2
-
Utilizza un valore per
Accept
eContent-Type
intestazioni simili aapplication/json+id
- Questo è un approccio simile a quello utilizzato da LTI. I vantaggi e gli svantaggi (per quanto ne so) sono gli stessi del punto 2. -
Invia sempre solo l'ID - Opzione Nucleare # 2.
I vantaggi
- Semplicità
- Il tipo di reso è coerente
- Potenzialmente si ottengono meno dati inviati al client
Svantaggi
- Poiché il numero di risorse disponibili potrebbe essere elevato, questo potrebbe comportare molte richieste GET (oltre 200) se la cache è (quasi) vuota, vanificando in definitiva lo scopo di questo approccio
- Semanticamente meno significativo - Sto facendo una richiesta per le risorse, non i loro ID!