Filtri
I parametri di query sono una buona misura semantica per questo, e molte API sono implementate in questo modo, si veda ad esempio API OpenStack . Utilizzando i parametri di query in cui ogni filtro associa un singolo valore direttamente a un singolo attributo, è facile combinare i filtri per o che rappresentano un'intersezione logica tra due set di risultati (AND) o a unione logica (OR), ma non entrambi allo stesso tempo. Per esempio. la seguente richiesta può essere interpretata in due modi:
GET /blogs/:blog_id/posts?created_at=today&author=12
La richiesta può essere sia dicendo: Dammi tutti i post per il blog dato che sono stati creati oggi e il cui ID autore è 12, o si può dire: Dammi tutti i post per il blog dato che sono stati creati oggi o il cui ID autore è 12. Si può presumere che sia usato convenzione all'interno della tua specifica API, credo che la maggior parte delle persone creda che il carattere e commerciale preferisca l'approccio AND, ma non c'è motivo per cui non possa essere un'unione dei due set.
Potrebbe essere necessario interrogare risorse per cui è necessaria una logica più complessa per determinare quali risultati si formano. In questo caso devi essere un po 'più intelligente nel modo in cui imposti i parametri di query per i filtri e probabilmente avrai bisogno di qualche forma di linguaggio di query da implementare. I parametri effettivi nell'URL non verrebbero mappati agli attributi delle tue risorse, ma i valori contengono invece riferimenti agli attributi, insieme ad altre cose assortite che le lingue hanno come operatori come ">", "<" e parole chiave come AND e OR. Vedi ad esempio JIRA JQL :
GET /blogs/:blog_id/posts?query=created_at IS today AND (author IS 1 OR author IS 2)
Gli approcci possono essere combinati, in modo da poter disporre di un mapping uno-a-uno per i parametri / gli attributi di query e tuttavia supportare ancora un filtraggio più efficace:
GET /blogs/:blog_id/posts?created_at=today&author=in:1,2
Da un punto di vista concettuale non credo ci sia molta differenza tra l'utilizzo dei parametri di query e l'aggiunta di ulteriori stringhe sul percorso. Potrei semplicemente rappresentare la prima richiesta in questo modo:
GET /blogs/:blog_id/posts/created_at/today/author/12
Ho la sensazione però che supportare questo approccio sarebbe un po 'più difficile per abbinare le rotte contro contro solo usando i parametri di query e per determinare se una determinata sezione del percorso è un' attributo 'o un' valore ', ma il tuo il chilometraggio può variare. Ne parlo principalmente perché potresti volere che alcuni filtri più fondamentali siano effettivamente rappresentati sul percorso per un facile riconoscimento / facilità d'uso:
GET /blogs/:blog_id/posts/new
Tale richiesta potrebbe restituire gli stessi risultati di questa richiesta:
GET /blogs/:blog_id/posts?created_at=today
Dati incorporati
Esistono sistemi che fanno esattamente ciò che stai suggerendo. Vedi ad esempio campionato / frattale . Lo fanno un po 'più lontano, in cui è possibile passare parametri ai dati incorporati per filtrarli (che può essere combinato con gli approcci dall'alto). Ciò significa che puoi effettuare richieste come:
GET /blogs?include=posts.comments:created(today)
Questa richiesta restituirà tutti i blog, i loro post e solo i commenti creati "oggi" (rispetto a tutti i commenti su tutti i post).
Le dimensioni del tuo set di risorse potrebbero avere un fattore limitante su quanto sia reattiva la tua API, quindi se hai una risorsa di livello superiore con una catena di 40 risorse correlate al di sotto di essa potresti aver bisogno di fare attenzione nelle tue richieste di mantenere da sovraccaricare il tuo server delle risorse o fornire un limite massimo alla profondità della catena di relazioni che puoi percorrere.
Ci sono anche preoccupazioni sulle implicazioni per l'impaginazione. Se stai impaginando la risorsa di livello superiore che stai richiedendo, impagisci anche le risorse incorporate? Il supporto delle HATEOAS relazioni di collegamento in stile può aiutare il cliente a ottenere riferimenti per un'ulteriore immersione nella lista dei dati incorporati impaginati che potrebbe essere interessata in e può mitigare il problema, ma è un fattore da prendere in considerazione.