Progettazione dell'API REST: distinzione tra ricerca e acquisizione di tutte le istanze di una risorsa

2

Al momento, la mia interfaccia REST (piuttosto standard) si presenta così:

POST /foo         # creates a new foo
PUT  /foo/{id}    # updates a specific foo
GET  /foo/{id}    # returns a specific foo
GET  /foo         # returns a collection of foos

Solo i client autenticati sono in grado di utilizzare queste operazioni. Quando si utilizza GET o PUT , i client possono solo recuperare o manipolare le proprie istanze foo. Quindi chiamare GET /foo restituisce solo un elenco di foos di un particolare utente, non tutti i foos esistenti.

Quello che voglio fare ora è introdurre una ricerca conforme a REST. Di solito dovresti semplicemente aggiungere parametri all'URI, qualcosa del genere:

GET  /foo?param1=val1&param2=val2&...

Tuttavia, in questo caso, voglio che i clienti siano in grado di cercare tutti i foo e quindi recuperare i foos che non necessariamente appartengono a loro. Ovviamente le rappresentazioni delle risorse apparirebbero un po 'diverse, senza dati sensibili del cliente.

Perché dovrei farlo, qual è lo scopo?

Immagina un'asta online per le auto. Un utente dovrebbe essere in grado di ottenere un elenco delle proprie aste attive (le macchine che desidera vendere) utilizzando GET /cars . D'altra parte, gli utenti che cercano un'auto dovrebbero essere in grado di eseguire una ricerca, ad esempio GET /cars?color=metallic-blue .

Ma penso che non sia una buona idea usare lo stesso URI sia per la ricerca che per l'elenco delle proprie aste (nonostante le operazioni bot restituiscano macchine), principalmente perché le rappresentazioni delle risorse della risposta sarebbero leggermente diverse (ad esempio la ricerca restituisce un risultato più generale senza dati sensibili). Ma come altro potrei farlo? Basta introdurre un nuovo URI, forse qualcosa come GET /cars/search?.. ?

    
posta ceran 25.07.2016 - 00:17
fonte

1 risposta

1

Se stai fornendo una API REST, allora i tuoi api consumatori dovrebbero fare affidamento sulla definizione del tuo tipo di media per capire i collegamenti disponibili all'interno. In questa prospettiva, l'URI che scegli è opaco - la macchina leggerà il valore uri come unità e non tenterà di estrarre informazioni semantiche da esso.

Se stai fornendo un web api, aspettando che i tuoi api consumatori costruiscano la propria uris, allora vuoi scegliere l'ortografia dove l'intento semantico è prontamente compreso dai lettori umani. Vincoli di progettazione suggeriti

  • Mantieni il modello uri il più semplice possibile, in modo che i consumatori non siano obbligati a tenere traccia di alcune eccezioni
  • Semplifica il riconoscimento da parte del lettore di risorse con una semantica significativamente diversa
  • Segui le convenzioni di ortografia URI standard ; dati gerarchici nel segmento del percorso appropriato, dati non gerarchici nella query.

In questo caso, hai davvero due diverse risorse per la raccolta auto; la collezione del mondo e il sottoinsieme di quelli specifici per le aste di questo utente. Quindi forse

# Global collection
/cars/...

# Private collection
/myAuctions/cars/...

Con rappresentazioni distinte, la mia ipotesi è che probabilmente stai meglio rendendo esplicito quale rappresentazione viene restituita da quale risorsa. Ciò si verifica in particolare se la lingua del tuo dominio ha termini specifici per le diverse risorse

# Global collection
/cars/.../windowSticker

# Private collection
/myAuctions/cars/.../vehicleHistory

Il terzo pubblico da considerare è il tuo team di sviluppo; scegliere gli identificatori di risorse che sono difficili da implementare correttamente è l'ultima risorsa. Dovresti considerare quanto è facile riconoscere quali risorse sono indirizzate a quali implementazioni, facilitando la condivisione delle implementazioni quando questa è la cosa giusta da fare, rendendo difficile la condivisione delle implementazioni quando questa è la cosa sbagliata da fare e così via.

    
risposta data 26.07.2016 - 03:49
fonte

Leggi altre domande sui tag