2014-10-14 8 views
8

Esistono convenzioni di denominazione per nomi di parametri generici nell'URL di ReST?convenzioni di denominazione dei parametri del percorso URL REST

Nel mio esempio, desidero ottenere l'indirizzo di un reparto in base all'ID reparto o all'ID dell'organizzazione sotto il quale il reparto sta rientrando.

Quindi il nome del parametro percorso urto deptOrOrgId - è valido in base alle convenzioni di denominazione o dovrei usare un nome generico come sectionID o officeID o qualcosa per rappresentare sia l'ID di reparto che l'ID di organizzazione?

Grazie.

+0

Farà qualche controllo basato sul deptOrOrgId? Come fare qualche funzione se è departmentID e fare qualcos'altro se il suo OrganisationID – Adheep

+0

è puramente per ottenere l'indirizzo di un dipartimento. ex, per ottenere l'indirizzo di un dipartimento IT è sufficiente l'ID del dipartimento IT. Se viene fornito l'ID dell'organizzazione, devo ottenere l'elenco dei reparti e trovare il reparto IT al suo interno e restituire l'indirizzo del reparto IT. quindi il mio parametro url dovrebbe accettare DepartmentId o organisationId per restituire un indirizzo di reparto. – rsudha

+1

Il modo standard per gestire ciò è avere un URL costante 'http: // nomehost/[percorso contesto]/get? DepartmentId = [x] & organisationId = [y]' In base al valore disponibile in departmentId e organizationId, devi gestirlo nella tua implementazione come hai menzionato nel commento sopra. – Adheep

risposta

3

Verifica sezione URI risorsa Esempi di Naming Convention Tutorial. Spero che otterrai la tua risposta.

Inoltre, questo book definisce tre regole di base per la progettazione di URL che agiscono come un punto di partenza:

• variabili Usa percorso per codificare gerarchia:/padre/figlio

• caratteri di punteggiatura messo in variabili di percorso per evitare che implica gerarchia dove non esiste:/genitore/child1; child2

• variabili utilizzare Query implicare input in un algoritmo, ad esempio: /ricerca q = meduse 0123?start = 20

Altre linee guida includono:

• URI non dovrebbe idealmente cambiare nel tempo.

• Servizi che offrono una risorsa univocamente identificabili tramite una chiave dovrebbero usare la notazione di riposo di base (ad esempio,/account/(accountid))

• Servizi che offrono funzionalità di ricerca/filtrante opzionale dovrebbero usare parametro di query? key1 = valore & key2 = valore notazione (ad es /strumenti? ticker = FT)

• Servizi che prevedono argomenti obbligatori sopra GET dovrebbe avere loro come variabili di percorso (ad esempio/accounthistory/(fromdate)/(todate)

• Tutti i nomi di servizio resto dovrebbe utilizzare severe nomi bassa di casi (ad es /client)

• Gli elementi del URI dovrebbe mappa per entità di business e la mappatura dovrebbe essere coerenti. ad esempio, un ente commerciale chiamato contentpartner dovrebbe essere coerente indicato come contentpartner (s) in tutti gli URI (piuttosto che un mix di partner, cp ecc.). Un buon punto di partenza sarebbe il nome dell'oggetto dominio.

• I parametri che non definiscono una risorsa ma la qualificano (ad esempio, la locale che alimenta le traduzioni dei dati) non devono far parte dello spazio URI normale in .Prendi in considerazione l'utilizzo di intestazioni o parametri di query opzionali per questi

• Usa nomi, non verbi. La potenza di REST deriva dal fatto che esiste un set di verbi limitato (operazioni) combinato con un ampio set di nomi (o risorse) . Di conseguenza, il modo in cui questi nomi sono costruiti è di grande importanza.

• Evitare i suffissi. Quando si progettano gli ISU è fondamentale che facciano riferimento allo alla cosa su cui si sta operando piuttosto che all'operazione eseguita. In secondo luogo, il cliente è interessato alla risorsa - non all'implementazione del software server che alimenta il servizio. È auspicabile evitare suffissi come .jsp o .aspx.

• Utilizzare Accetta Testata per la negoziazione dei contenuti

• Keep It intuitiva. Gli URI dovrebbero essere leggibili o ipotetici. Il metodo più semplice per eseguire questa operazione consiste nel costruire una gerarchia URI, raggruppando elementi correlati . Tali modelli di categoria e sottocategoria sono molto facili da capire.

8

Ecco un ulteriore paio di convenzioni in materia di collegamenti e percorsi di progettazione in API REST che potrebbe aiutare:

1. Percorso Parametri vs Query String

  • params percorso (/parent/child1;child2) sono cool ma le stringhe di query possono esprimere quanto possono essere i parametri del path, sono standard ed espliciti. es:
    • /parent?id=child1&id=child2
    • o /parent?id=child1;child2 ... ecc

2.Plurale o singolare

Uso il plurale per ogni collezione (o un tavolo, o una cartella) è buono in quanto implica che la risorsa è una lista di altri risorsa

/users, /users/user1, /users?active=true

risorsa Nesting : Predefinito per non annidare a meno che non vi sia una relazione forte

Se una risorsa figlio candidato può esistere indipendentemente dal genitore, non vi è alcun punto nel raggruppamento perché potrebbe finire con più percorsi per la stessa cosa:

  • /departments/{departments}/employees/{employee}
  • /branch-offices/{branch}/employees/{employee}
  • /employees/{employee}

Con quest'ultimo si può fare tutto il resto:

  • tutto impiegati in un reparto /employees?department={department}
  • tutti i dipendenti in un ramo /employees?branch={branch}

3. Utilizzare nidificazione solo sui rapporti di forza

Quando la risorsa nidificato non può esistere al di fuori del genitore (Composition in termini UML per esempio)

  • /books/{book}/pages/{page} Non si cercherebbe mai una pagina senza specificare un libro
  • /players/{player}/stats} (aga in, dipende dal vostro modelli di dominio)

4. Bene ok ... Utilizzare percorsi nidificati sui rapporti non così forte troppo, ma trattarli come alias

Naturalmente si potrebbe desiderare di fare nidificare anche se non esiste una relazione forte o un ciclo di vita delle risorse legato (l'esempio di dipartimento/dipendente) per qualche ragione (DX, forse la leggibilità?). se lo fai, forse si dovrebbe prendere in considerazione il percorso nidificato come un alias solo:

  • per /departments/{department}/employees
  • riscrittura interno /employees?department={department}

5. Se si vuole hateoas, poi il design percorso dovrebbe non essere la priorità assoluta

D'altra parte, la leggibilità del client non è importante se si desidera abbracciare REST HATEOAS. I client API non dovrebbero indovinare i tuoi collegamenti o avere i loro modelli codificati. Invece, la tua API fornisce collegamenti seguiti dai clienti.Esempio:

La radice percorso potrebbe per esempio la lista tutti i link principali:

GET/

200 OK 
Content-Type: application/json 
{ 
    links:{ 
     "employees":"/url-for-employees{?department,branch,name}" 
     "departments":"/them-deps" 
    } 
} 

I collegamenti sono volutamente brutta in questo esempio. Il numero dipendenti con chiave è in realtà un URL template con parametri facoltativi.

L'API client cerca poi per il collegamento con chiave employee, (in questo caso/url-per-dipendenti) - indipendentemente da quello che sembra - e lo chiama:

GET /url-for-employees 

200 OK 
Content-Type: application/json 
Link: </url-for-employees{?department,branch,name}>; rel="search", 
</url-for-employees?page=2>; rel="next" 

['body is an array containing the first set/page of employees'] 

Avviso l'intestazione link contenente 2 link, uno per la ricerca e uno per ottenere la pagina successiva di dipendenti (rel = next ").

I vantaggi di HATEOS sono fuori portata qui ma almeno uno è che sei libero di riorganizzare il tuo percorsi senza rompere i client API

5. Ultimo, provare cose sul file system

Uno potrebbe utilizzare il file system di delineare/deridere un API riposante: creare cartelle, file (e forse link simbolici/alias/scorciatoie) sul disco rigido, sfogliali, cambiali, lava risciacquo e ripeti fino a quando sei felice con la struttura :)

$ mkdir myapi 
$ cd myapi 
$ touch index.json 
$ mkdir employees 
$ touch employees/index.json 
$ touch employees/smith.json 
$ mkdir departments 
$ touch departments/index.json 
$ touch departments/accounting.json 
$ mkdir departments/accounting 
$ mkdir departments/accounting/employees 
$ ln -s employees/smith.json departments/accounting/employees/smith.json 
$ ls -l departments/accounting/employees 
smith.json -> employees/smith.json 
Problemi correlati