Quale URI dell'API REST dovrebbe essere usato per interrogare una relazione con un singolo oggetto del modello?

2

Sto sviluppando un'API REST per un servizio di gestione degli utenti (utilizzato da altri micro servizi). Il mio modello contiene i tipi User e Server tra gli altri. La relazione da Server a User è molti-a-uno (ogni utente ha una chiave esterna non nulla alla tabella del server). Il tipo Server ha un campo chiamato address .

Devo implementare un endpoint REST che utilizza l'ID utente come input e restituisce Server address come output (ottenere un output più complesso va bene fintanto che non è esagerato).

I miei pensieri iniziali erano di andare per il seguente URI che restituisce il singolo Server oggetto:

users/{id}/server

Ho cercato le convenzioni URI ma sembrano sempre fare riferimento all'elenco degli oggetti (vedi qui per esempio):

users/{id}/servers

Che nel mio caso restituirebbe sempre una lista con un singolo oggetto Server . Sembra un po 'strano per me.

I miei criteri principali per la scelta dell'URI sono le convenzioni tradizionali. Voglio che l'API sia tanto intuitiva quanto può esserlo per gli sviluppatori che la consumano. Quale endpoint dovrei usare? Sentiti libero di suggerire altre opzioni.

    
posta Alon 25.09.2016 - 01:54
fonte

3 risposte

4

Oltre alla risposta di @RobertHarvey.

Se sei preoccupato per il lavoro di dev, allora la scelta dovrebbe essere flessibile , piuttosto che politicamente corretta .

Usando /user/{id}/servers , prepariamo l'API per possibili relazioni 0-N . Questo approccio offre alcuni vantaggi rispetto alla sua alternativa:

  • Lavorare con gli array vuoti è più facile che farlo con null. (IMO)

  • Consente le possibili relazioni 0-N

Il punto las ci porta al prossimo vantaggio. Uno che conta.

Se cambiamo l'API da una singola risposta ( /user/{id}/server ) a più di una ( /user/{id}/servers ), saremo forzati a fare versioni dell'API per garantire la compatibilità con le versioni precedenti.

Altrimenti, i client che consumano il servizio potrebbero non riuscire.

Pensare a ulteriori aggiornamenti /user/{id}/servers è quello che apporta maggiore flessibilità. Anche quando serve solo una singola riga.

    
risposta data 25.09.2016 - 12:34
fonte
3

Usa l'URI che ha senso per la tua particolare semantica dell'applicazione.

Se si desidera restituire un oggetto server singolo, l'URI dovrebbe avere il formato:

users/{id}/server

Se in futuro potresti restituire più oggetti server e non vuoi dover aggiungere un nuovo endpoint in un secondo momento, usa il modulo

users/{id}/servers

Se vuoi veramente solo l'indirizzo di un server, e non un intero oggetto server, puoi anche farlo:

users/{id}/serverAddress
    
risposta data 25.09.2016 - 02:01
fonte
3

My main criteria for choosing the URI is keeping to mainstream conventions. I want the API to be as intuitive as it can be for the developers consuming it.

Il fatto che questo sia così importante implica che la tua API potrebbe non essere effettivamente RESTful. Con HATEOAS implementato, un client potrebbe leggere questi link da un'altra risposta servita dalla tua API senza la necessità per un essere umano di mai leggere l'URL (a meno che non si analizzi i log). La pagina di esempio che rimandi a indica che l'obiettivo della tua documentazione in un'API REST dovrebbe essere sulle rappresentazioni piuttosto che sugli endpoint .

So, what makes an API a good API? We will use the following tenets gathered from various authors across the web:

...

  • Has documention sufficient to guide the user of the API (and that does not redundantly document REST principles but instead focuses on representations, validation rules, security, etc.).
  • ...
  • Requires knowledge only of a single URI entry point and access to documentation specifying the media types. (Note this is an hypermedia 'stretch goal'.)

Per quanto riguarda REST, semplicemente non conta come tutti, ma un numero molto basso di endpoint dovrà essere noto a un programmatore che scrive un client per la propria API. Il resto dovrebbe essere libero di cambiare e non deve essere necessariamente leggibile. Che siano leggibili o meno, è una questione di preferenza e non un principio REST.

Detto questo, dovresti scegliere quello che si adatta alla semantica della tua API.

Inoltre, è altamente improbabile che tu abbia effettivamente bisogno che la tua API sia veramente RESTful.

Se scegli di fornire un numero di endpoint insieme alla documentazione per le persone che scrivono programmi che raggiungono questi endpoint, ti suggerisco di andare con users/{id}/servers .

Perché? Mi sembra più utile.

Se la tua API è RESTful, letteralmente non importa. Sarai libero di cambiarlo da users/{id}/servers a /jabber{id}wocky ei client non dovrebbero rompersi finché capiscono le rappresentazioni che stai restituendo e le rappresentazioni contengono i giusti collegamenti e abbastanza metadati per il client dell'applicazione per capire cosa il link rappresenta.

Se la tua API è solo un'API Web generica che serve i dati su HTTP senza sovrascrivere la semantica dei metodi HTTP (diciamo, un Livello 2 in Richardson's Maturity Model ), gli URL degli endpoint contano di più. Penso che users/{id}/servers appaia più robusto. Se si decide di rendere possibile che un utente abbia più server assegnati (qualunque cosa ciò significhi nel proprio dominio aziendale), questo dovrebbe essere più semplice da estendere. Se le persone iniziano a scrivere client che aspettano users/{id}/server , diventerà strano se introdurrai più server per utente. La semantica di questo endpoint dovrà cambiare in qualche modo (sarà solo il primo server? Primo basato su quali criteri?). Ti prego che questa è una ipotesi selvaggia da parte mia. È difficile prendere questo tipo di decisione senza comprendere lo scopo della tua API e le proprietà di tali risorse.

Inoltre, questa scelta può essere importante o meno in termini di manutenibilità a seconda di come ci si avvicina al controllo delle versioni dell'API. Ma questo è un argomento molto ampio da solo.

    
risposta data 25.09.2016 - 11:08
fonte

Leggi altre domande sui tag