Progettazione dell'API REST: includi la funzionalità per vedere se esistono risorse nel DB o la gestione degli errori API di recupero lo gestisce?

2

Quando si progetta un'API REST, è pratica comune includere endpoint che consentono di vedere se esistono o meno risorse potenziali nel database (prima di recuperarle)?

Ad esempio, se voglio richiedere i dati del prodotto utilizzando un recupero, dovrei controllare se la potenziale risorsa esiste anche nel database prima di recuperarlo, o dovrei semplicemente lasciare che l'API di recupero prenda l'errore che un la risorsa esistente produrrebbe?

È anche comune creare endpoint che possano essere usati per dirti se una risorsa esiste nel database o no, o dovrebbe essere tutto fatto attraverso la gestione degli errori sul fetch proposto stesso?

    
posta connected_user 20.02.2017 - 20:15
fonte

2 risposte

7

Se vuoi verificare l'esistenza di una risorsa ma non recuperarla, dovresti utilizzare HEAD .

This method can be used for obtaining metadata about the selected representation without transferring the representation data and is often used for testing hypertext links for validity, accessibility, and recent modification.

Ci può essere una buona ragione per creare un endpoint separato (come un client che non ha accesso a quel verbo e non vuole aggiungere il verbo tunneling support), ma nella stragrande maggioranza dei casi un endpoint separato è ingiustificato.

È normale e non irragionevole che un'API si aspetti che i client gestiscano correttamente un errore 404 se la risorsa che stanno cercando non esiste. La maggior parte dei clienti preferisce salvare un roundtrip e gestire il 404 anziché effettuare prima una chiamata di HEAD . Se i tuoi clienti desiderano / necessitano di supporto per un controllo di esistenza, devi aggiungere il supporto per HEAD alla tua API e indirizzare i client a tale verbo.

    
risposta data 20.02.2017 - 20:57
fonte
3

Come consumatore del tuo servizio utilizzerei effettivamente queste chiamate di tipo "esiste"? tenendo presente che

  1. Avrei ancora bisogno di gestire il caso in cui l'API diceva che l'oggetto esiste ma la chiamata effettiva al recupero dei dati non la trova (perché qualcun altro l'ha cancellata nel momento sbagliato). Quindi avrei bisogno di avere due diverse aree logiche per gestire i dati mancanti. Sembra più da mantenere.

  2. Posso ignorare l'API "esiste" e potrei comunque chiamare l'API di recupero dei dati e lasciare che fallisca. Questo potrebbe essere più efficiente per me se i dati di solito esistono-- ridurrà il mio numero di round trip fino al 50%.

  3. Entrambe le chiamate API probabilmente consumano larghezza di banda al livello del database, quindi aumentando le chiamate si stanno riducendo le prestazioni.

Penso che l'API "esiste" non sia poi così utile. L'unica eccezione sarebbe se esiste un caso d'uso specifico in cui un controllo di esistenza deve essere reso indipendente dal recupero dei dati.

Inoltre, tieni presente che l'API non deve contenere informazioni sulle eccezioni. Se c'è un errore nel recupero dei dati nel database, il tuo servizio dovrebbe mapparlo a un'eccezione di qualche tipo del client.

    
risposta data 20.02.2017 - 20:47
fonte

Leggi altre domande sui tag