Esistono linee guida sulla convenzione di denominazione per le API REST? [chiuso]


212

Quando si creano API REST, esistono delle linee guida o degli standard defacto per le convenzioni di denominazione all'interno dell'API (ad esempio: componenti del percorso dell'endpoint URL, parametri di querystring)? I cappelli dei cammelli sono la norma o i trattini bassi? altri?

Per esempio:

api.service.com/helloWorld/userId/x

o

api.service.com/hello_world/user_id/x

Nota: non si tratta della progettazione dell'API RESTful, ma piuttosto delle linee guida della convenzione di denominazione da utilizzare per i componenti del percorso e / o i parametri della stringa di query utilizzati.

Qualsiasi linea guida sarebbe apprezzata.

Risposte:


150

Penso che dovresti evitare i cappelli di cammello. La norma è usare lettere minuscole. Vorrei anche evitare i trattini bassi e utilizzare invece i trattini

Quindi il tuo URL dovrebbe assomigliare a questo (ignorando i problemi di progettazione come richiesto :-))

api.service.com/hello-world/user-id/x

187
Secondo RFC2616, solo lo schema e le parti host dell'URL non fanno distinzione tra maiuscole e minuscole. Il resto dell'URL, ovvero il percorso e la query DOVREBBE essere case sensitive. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller

10
Daniel, hai ragione, grazie per averlo sottolineato. Tuttavia, di fatto ci aspettiamo che url ignori i casi, in particolare la parte del nome della risorsa. Non avrebbe senso per userid e UserId comportarsi diversamente (a meno che uno di loro non ritorni 404)
LiorH

18
@LiorH: Perché pensi che "non abbia senso" distinguere tra maiuscole e minuscole? Molti altri contesti fanno distinzione tra maiuscole e minuscole per ottenere buoni risultati. Ci sono alcuni servizi web (ad esempio Amazon S3) che fanno rispettare la sensibilità caso per gli endpoint URL, e penso che sia del tutto appropriato.
Hank,

6
I file system del server @Dennis Windows non fanno distinzione tra maiuscole e minuscole per impostazione predefinita, a meno che non mi sbagli di
grosso

5
@samspot Buono! Ho pensato che Windows fosse andato dritto ai nomi di file con distinzione tra maiuscole e minuscole quando hanno creato i server. WOW, stavano ancora spingendo LORO il più a lungo possibile, cioè "1 MicroSoft Way". ;-)
Dennis,

87

L'API REST per Dropbox , Twitter , Google Web Services e Facebook utilizza tutti i trattini bassi.


24
Uno degli effetti collaterali di ciò è che le "parole" sottolineate vengono mantenute intere, insieme negli indici di ricerca di Google. I trattini sono divisi in parole separate.
Dennis,


11
Mentre l'API di Google Maps utilizza caratteri di sottolineatura, la Guida di stile di Google richiede Camel Case. L' API di Google+ e l' API di ricerca personalizzata , tra gli altri, utilizzano Camel Case.
Benjamin,

2
Eppure usano ancora "-" come separatore di questi URL: P developers.google.com/custom-search/json-api/v1/reference/cse/… developers.google.com/+/best-practices dev.twitter. com / panoramica / casi di studio D'altra parte usano camelCase nei parametri della query.
Mattias,

1
Nessuno lo sa ...
Piotr Kula,

84

Osserva attentamente gli URI per le normali risorse web. Quelli sono il tuo modello. Pensa agli alberi delle directory; usa semplici nomi di file e directory simili a Linux.

HelloWorldnon è davvero una buona classe di risorse. Non sembra essere una "cosa". Potrebbe essere, ma non è molto simile al nome. A greetingè una cosa.

user-idpotrebbe essere un sostantivo che stai recuperando. È dubbio, tuttavia, che il risultato della tua richiesta sia solo un user_id. È molto più probabile che il risultato della richiesta sia un Utente. Pertanto, userè il nome che stai recuperando

www.example.com/greeting/user/x/

Ha senso per me. Concentrati sul rendere la tua richiesta REST una specie di frase del sostantivo - un percorso attraverso una gerarchia (o tassonomia o directory). Usa i nomi più semplici possibili, se possibile evitando frasi di nome.

Generalmente, le frasi di nomi composti di solito significano un altro passo nella tua gerarchia. Quindi non hai /hello-world/user/e /hello-universe/user/. Hai /hello/world/user/e hello/universe/user/. O forse /world/hello/user/e /universe/hello/user/.

Il punto è fornire un percorso di navigazione tra le risorse.


4
La mia domanda riguarda maggiormente la convenzione di denominazione degli eventuali percorsi e / o parametri di querystring, qualunque essi siano. Sono d'accordo con i tuoi consigli di progettazione, quindi grazie, ma con questa domanda sto solo chiedendo delle convenzioni di denominazione.
jnorris,

1
Solo per notare, non c'è nulla che ti impedisca di utilizzare REST per risorse non gerarchiche. Le convenzioni di denominazione URI effettive che utilizzi sono irrilevanti, basta usare tutto ciò che pensi sia bello ed è facile da analizzare sul server. Il client non dovrebbe sapere nulla sulla generazione degli URI poiché è necessario inviare gli URI alle risorse tramite ipertesto nelle risposte.
aehlke,

30

"UserId" è totalmente l'approccio sbagliato. L'approccio Verb (metodi HTTP) e Noun è ciò che Roy Fielding ha significato per l'architettura REST . I nomi sono:

  1. Una raccolta di cose
  2. Una cosa

Una buona convenzione di denominazione è:

[POST or Create](To the *collection*)
sub.domain.tld/class_name.{media_type} 

[GET or Read](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[PUT or Update](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[DELETE](of *one* thing)
sub.domain.tld/class_name/id_value.{media_type}

[GET or Search](of a *collection*, FRIENDLY URL)
sub.domain.tld/class_name.{media_type}/{var}/{value}/{more-var-value-pairs}

[GET or Search](of a *collection*, Normal URL)
sub.domain.tld/class_name.{media_type}?var=value&more-var-value-pairs

Dove {media_type} è uno di: json, xml, rss, pdf, png, persino html.

È possibile distinguere la collezione aggiungendo una 's' alla fine, come:

'users.json' *collection of things*
'user/id_value.json' *single thing*

Ma questo significa che devi tenere traccia di dove hai messo la 's' e dove non l'hai fatto. Inoltre metà del pianeta (asiatici per cominciare) parla lingue senza plurali espliciti, quindi l'URL è meno amichevole con loro.


Cosa si intende con {var}? Se cerco un utente per nome, ad esempio ... / utente / nome utente / tomsawyer?
Hans-Peter Störr,

1
Se avessi tre variabili (var) s denominate x, y, z, allora il tuo URL sarebbe simile a: sub.domain.tld / x / value_of_x / y / value_of_y / z / value_of_z
Dennis

@hstoerr Solo per essere sicuro di essere chiaro, la maggior parte dei linguaggi di script usa una sorta di "sostituzione della variabile parentesi graffa". Quindi {var} significa che una variabile (il suo nome) risiede lì, e quindi il seguente {valore} è dove il valore di {var} prima di esso. Esempio: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/fooderog/review_averages_higher_than/4.json] cercherebbe di ottenere i risultati json da yelp.com per le presentazioni di cibo che mostrano un valore superiore a 4.
Dennis

Questa è la migliore risposta secondo me e complimenti per pensare a livello internazionale.
beiller

14

No. REST non ha nulla a che fare con le convenzioni di denominazione URI. Se includi queste convenzioni come parte dell'API, fuori banda, anziché solo tramite ipertesto, l'API non è RESTful.

Per ulteriori informazioni, consultare http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven


44
Riposati ... è comunque bello avere URL belli da vedere.
HDave il

1
Concordo con @HDave, è molto nello spirito di REST avere URL facilmente comprensibili. Stai lavorando con gli URL, perché non vorresti che fossero compresi così facilmente come i nomi delle variabili e dei parametri nel tuo codice?
mahemoff,

4
@mahemoff scusa, sono io che sono super pedante. Ma l'aspetto dei tuoi URL non ha nulla a che fare con REST. Ciò non significa che non siano una buona cosa da avere, sono solo ortogonali a ciò che REST descrive. È fuorviante affermare che REST si occupa di strutturare gli URL in questo modo, poiché porta le persone a descrivere le API RPC come REST solo perché hanno URL leggibili / strutturati.
aehlke,

5
In breve, gli URL belli sono fantastici e tutti dovrebbero averli. Tuttavia, non ha nulla a che fare con REST.
aehlke,

1
@aehlke grazie per avermi chiarito. Il resto non riguarda le strutture URL. Non capisco perché sia ​​così difficile da capire per le persone.
user1431072

9

I nomi di dominio non fanno distinzione tra maiuscole e minuscole, ma il resto dell'URI può sicuramente esserlo. È un grosso errore supporre che gli URI non facciano distinzione tra maiuscole e minuscole.



2

Non penso che il caso del cammello sia il problema in questo esempio, ma immagino che una convenzione di denominazione più RESTful per l'esempio sopra sarebbe:

api.service.com/helloWorld/userId/x

piuttosto che rendere userId un parametro di query (che è perfettamente legale) il mio esempio indica quella risorsa, IMO, in un modo più RESTful.


Questa non è una questione di progettazione dell'API RESTful, piuttosto delle linee guida della convenzione di denominazione da utilizzare per gli eventuali componenti del percorso e / o parametri della stringa di query utilizzati. Nel tuo esempio, i componenti del percorso devono trovarsi nei cappucci dei cammelli come hai usato o sottolineati?
jnorris,

Bene poiché in REST i tuoi URL sono le tue interfacce, allora è una specie di domanda API. Anche se non credo ci siano linee guida specifiche per il tuo esempio, andrei personalmente con il caso del cammello.
Gandalf,

Non è necessario utilizzare i parametri di query per le risorse che si desidera memorizzare nella cache a qualsiasi livello dello stack HTTP.
aehlke,

@aehlke È vero anche il contrario. Se NON si desidera memorizzare nella cache i parametri della query, utilizzare lo stile GET per i parametri, ~ O ~ assicurarsi che DARN SURE modifichi / inserisca le intestazioni anti-cache per tutto ciò che non si desidera memorizzare nella cache. Inoltre, c'è un'intestazione che è un hash dell'oggetto / pagina ritorna, usalo per indicare i cambiamenti di cose che vuoi mettere in cache, ma aggiornate quando ci sono modifiche.
Dennis,

@aehlke Ho scoperto la memorizzazione nella cache e la sto aggiungendo. Ricordo una presentazione di CodeCamp in cui uno degli speedup stava eseguendo tutte queste intestazioni, quindi cambiando il nome del file e tutti i riferimenti ad esso quando i suoi contenuti venivano cambiati per far sì che borwser e proxy potessero server una versione più recente dopo un lungo periodo di cache impostato. Ecco tutti i dettagli gory: developers.google.com/speed/docs/best-practices/caching
Dennis

2

Se autentichi i tuoi clienti con Oauth2, penso che avrai bisogno di sottolineatura per almeno due dei nomi dei tuoi parametri:

  • Identificativo cliente
  • client_secret

Ho usato camelCase nella mia API REST (non ancora pubblicata). Durante la stesura della documentazione API ho pensato di cambiare tutto in snake_case, quindi non devo spiegare perché i parametri di Oauth sono snake_case mentre altri non lo sono.

Vedi: https://tools.ietf.org/html/rfc6749


0

Direi che è preferibile utilizzare il minor numero possibile di caratteri speciali negli URL REST. Uno dei vantaggi di REST è che rende l '"interfaccia" per un servizio di facile lettura. Il caso Camel o il caso Pascal è probabilmente buono per i nomi delle risorse (Utenti o utenti). Non credo che ci siano davvero degli standard rigidi nei confronti di REST.

Inoltre, penso che Gandalf abbia ragione, di solito in REST è più pulito non utilizzare i parametri della stringa di query, ma creare invece percorsi che definiscono le risorse con cui si desidera gestire.

http://api.example.com/HelloWorld/Users/12345/Order/3/etc

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.