Gibt es Richtlinien für Namenskonventionen für REST-APIs? [geschlossen]

212

Gibt es beim Erstellen von REST-APIs Richtlinien oder Defacto-Standards für Namenskonventionen innerhalb der API (z. B. URL-Endpunktpfadkomponenten, Querystring-Parameter)? Sind Kamelkappen die Norm oder Unterstriche? Andere?

Beispielsweise:

api.service.com/helloWorld/userId/x

oder

api.service.com/hello_world/user_id/x

Hinweis: Dies ist keine Frage des RESTful-API-Designs, sondern der Richtlinien für Namenskonventionen, die für die eventuell verwendeten Pfadkomponenten und / oder Abfragezeichenfolgenparameter verwendet werden sollen.

Alle Richtlinien wäre dankbar.

jnorris
quelle

Antworten:

150

Ich denke, Sie sollten Kamelkappen vermeiden. Die Norm besteht darin, Kleinbuchstaben zu verwenden. Ich würde auch Unterstriche vermeiden und stattdessen Bindestriche verwenden

Ihre URL sollte also so aussehen (die von Ihnen angeforderten Designprobleme werden ignoriert :-))

api.service.com/hello-world/user-id/x
LiorH
quelle
187
Gemäß RFC2616 wird nur zwischen dem Schema und den Host-Teilen der URL die Groß- und Kleinschreibung nicht berücksichtigt. Der Rest der URL, dh der Pfad und die Abfrage, sollten zwischen Groß- und Kleinschreibung unterscheiden. w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2.3
Darrel Miller
10
Daniel, du hast recht, danke, dass du darauf hingewiesen hast. De-facto erwarten wir jedoch normalerweise, dass URLs Fälle ignorieren, insbesondere den Teil des Ressourcennamens. Es würde keinen Sinn machen, wenn sich Benutzer-ID und Benutzer-ID anders verhalten (es sei denn, einer von ihnen gibt 404 zurück)
LiorH
18
@LiorH: Warum macht es Ihrer Meinung nach "keinen Sinn", zwischen Groß- und Kleinschreibung zu unterscheiden? In vielen anderen Kontexten wird zwischen Groß- und Kleinschreibung unterschieden. Es gibt einige Webdienste (z. B. Amazon S3), die die Groß- und Kleinschreibung für URL-Endpunkte erzwingen, und ich denke, dass dies durchaus angemessen ist.
Hank
6
@ Dennis Windows - Server - Dateisysteme sind Groß- und Kleinschreibung standardmäßig, es sei denn ich irrt bin technet.microsoft.com/en-us/library/cc725747.aspx
samspot
5
@samspot Gut! Ich dachte, dass Windows beim Erstellen von Servern direkt auf Dateinamen mit Groß- und Kleinschreibung umgestellt wurde. WOW, sie drängten immer noch ihren Weg, so lange sie konnten, dh "1 MicroSoft Way". ;-)
Dennis
87

Die REST-API für Dropbox , Twitter , Google Web Services und Facebook verwendet alle Unterstriche.

jz1108
quelle
24
Eine der Nebenwirkungen ist, dass unterstrichene "Wörter" in den Google-Suchindizes zusammengehalten werden. Hyhenierte werden in separate Wörter unterteilt.
Dennis
Beispiel: dev.twitter.com/docs/api/1.1
Mike Kozelsky
11
Während die Google Maps-API Unterstriche verwendet, erfordert der Google Style Guide Camel Case. Die Google+ API und die benutzerdefinierte Such-API verwenden unter anderem Camel Case.
Benjamin
2
Dennoch verwenden sie immer noch '-' als Trennzeichen für diese URLs: P developer.google.com/custom-search/json-api/v1/reference/cse/… developer.google.com/+/best-practices dev.twitter. com / Übersicht / Fallstudien Andererseits verwenden sie camelCase in den Abfrageparametern.
Mattias
1
Niemand weiß ...
Piotr Kula
84

Schauen Sie sich die URIs für normale Webressourcen genau an. Das sind deine Vorlagen. Denken Sie an Verzeichnisbäume; Verwenden Sie einfache Linux-ähnliche Datei- und Verzeichnisnamen.

HelloWorldist keine wirklich gute Klasse von Ressourcen. Es scheint kein "Ding" zu sein. Es mag sein, aber es ist nicht sehr nomenartig. A greetingist eine Sache.

user-idkönnte ein Substantiv sein, das Sie holen. Es ist jedoch zweifelhaft, dass das Ergebnis Ihrer Anfrage nur eine Benutzer-ID ist. Es ist viel wahrscheinlicher, dass das Ergebnis der Anfrage ein Benutzer ist. Daher userist das Substantiv, das Sie abrufen

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

Für mich ergibt das Sinn. Konzentrieren Sie sich darauf, Ihre REST-Anfrage zu einer Art Nominalphrase zu machen - einem Pfad durch eine Hierarchie (oder Taxonomie oder ein Verzeichnis). Verwenden Sie möglichst einfache Substantive und vermeiden Sie nach Möglichkeit Nominalphrasen.

Im Allgemeinen bedeuten zusammengesetzte Nominalphrasen einen weiteren Schritt in Ihrer Hierarchie. Also hast du nicht /hello-world/user/und /hello-universe/user/. Du hast /hello/world/user/und hello/universe/user/. Oder möglicherweise /world/hello/user/und /universe/hello/user/.

Es geht darum, einen Navigationspfad zwischen Ressourcen bereitzustellen.

S.Lott
quelle
4
Meine Frage betrifft eher die Namenskonvention der eventuellen Pfadnamen und / oder Querystring-Parameter, wie auch immer sie sein mögen. Ich stimme Ihren Designempfehlungen zu, also danke, aber mit dieser Frage frage ich nur nach Namenskonventionen.
Jnorris
1
Nur zu beachten, nichts hindert Sie daran, REST für nicht hierarchische Ressourcen zu verwenden. Die tatsächlichen URI-Namenskonventionen, die Sie verwenden, sind unerheblich. Verwenden Sie einfach alles, was Sie für gut halten und das Sie auf dem Server leicht analysieren können. Der Client sollte nichts über das Generieren Ihrer URIs wissen, da Sie die URIs in Ihren Antworten über Hypertext an Ressourcen senden müssen.
Aehlke
30

'UserId' ist völlig falsch. Der Verb- (HTTP-Methoden) und Nomen-Ansatz war das, was Roy Fielding für die REST-Architektur bedeutete . Die Substantive sind entweder:

  1. Eine Sammlung von Dingen
  2. Eine Sache

Eine gute Namenskonvention ist:

[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

Wobei {media_type} einer der folgenden ist: json, xml, rss, pdf, png, sogar html.

Es ist möglich, die Sammlung durch Hinzufügen eines 's' am Ende zu unterscheiden, wie zum Beispiel:

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

Dies bedeutet jedoch, dass Sie nachverfolgen müssen, wo Sie die 's' platziert haben und wo nicht. Außerdem spricht die Hälfte des Planeten (Asiaten für den Anfang) Sprachen ohne explizite Pluralformen, sodass die URL für sie weniger freundlich ist.

Dennis
quelle
Was ist mit {var} gemeint? Wenn ich nach einem Benutzer mit Namen suche, wäre das zum Beispiel ... / user / username / tomsawyer?
Hans-Peter Störr
1
Wenn Sie drei Variablen (var) mit den Namen x, y, z hätten, würde Ihre
Dennis
@hstoerr Nur um sicherzugehen, dass ich klar war, verwenden die meisten Skriptsprachen eine Art 'Ersetzung von Variablen in geschweiften Klammern'. {Var} bedeutet also, dass sich dort eine Variable (ihr Name) befindet, und der folgende {Wert} ist der Wert des {var} davor. Beispiel: sub.domain.tld / script / {var} / {value} .json [www.yelp.com/food_reviews/review_averages_higher_than/4.json] würde versuchen, die json-Ergebnisse von yelp.com für Lebensmittelberichte zu erhalten ein Wert höher als 4.
Dennis
Dies ist meiner Meinung nach die beste Antwort und ein großes Lob für internationales Denken.
Beiller
14

Nein. REST hat nichts mit URI-Namenskonventionen zu tun. Wenn Sie diese Konventionen als Teil Ihrer API außerhalb des Bandes und nicht nur über Hypertext einfügen, ist Ihre API nicht RESTful.

Weitere Informationen finden Sie unter http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

aehlke
quelle
44
Ruhe dich aus ... es ist immer noch schön, gut aussehende URLs zu haben.
HDave
1
Stimmen Sie mit @HDave überein, es ist sehr im Sinne von REST, URLs zu haben, die leicht zu verstehen sind. Sie arbeiten mit URLs. Warum möchten Sie nicht, dass diese so einfach zu verstehen sind wie die Variablen- und Parameternamen in Ihrem Code?
Mahemoff
4
@ Mahemoff Entschuldigung, das bin ich super pedantisch. Aber wie Ihre URLs aussehen, hat nichts mit REST zu tun. Das bedeutet nicht, dass sie keine gute Sache sind, sie sind nur orthogonal zu dem, was REST beschreibt. Es ist irreführend zu sagen, dass es bei REST darum geht, URLs auf diese Weise zu strukturieren, da dies dazu führt, dass Leute RPC-APIs als REST beschreiben, nur weil sie lesbare / strukturierte URLs haben.
Aehlke
5
Zusammenfassend sind gut aussehende URLs großartig und jeder sollte sie haben. Es hat jedoch nichts mit REST zu tun.
Aehlke
1
@aehlke danke für die Aufklärung. Bei Rest geht es nicht um URL-Strukturen. Ich verstehe nicht, warum es für die Leute so schwer zu verstehen ist.
user1431072
9

Domain-Namen unterscheiden nicht zwischen Groß- und Kleinschreibung, der Rest der URI jedoch durchaus. Es ist ein großer Fehler anzunehmen, dass URIs nicht zwischen Groß- und Kleinschreibung unterscheiden.


quelle
2

Ich glaube nicht, dass der Kamelfall das Problem in diesem Beispiel ist, aber ich stelle mir eine restlichere Namenskonvention für das obige Beispiel vor:

api.service.com/helloWorld/userId/x

Anstatt userId zu einem Abfrageparameter zu machen (was vollkommen legal ist), bezeichnet mein Beispiel diese Ressource in IMO auf eine REST-fähigere Weise.

Gandalf
quelle
Dies ist keine Frage des RESTful-API-Designs, sondern der Richtlinien für Namenskonventionen, die für die eventuell verwendeten Pfadkomponenten und / oder Abfragezeichenfolgenparameter verwendet werden sollen. Sollten sich in Ihrem Beispiel die Pfadkomponenten in Kamelkappen befinden, wie Sie sie verwendet haben, oder Unterstriche?
Jnorris
Nun, da in REST Ihre URLs Ihre Schnittstellen sind, ist es eine Art API-Frage. Obwohl ich glaube, dass es keine spezifischen Richtlinien für Ihr Beispiel gibt, würde ich mich persönlich für Kamelkoffer entscheiden.
Gandalf
Sie sollten keine Abfrageparameter für Ressourcen verwenden, die auf einer beliebigen Ebene des HTTP-Stacks zwischengespeichert werden sollen.
Aehlke
@aehlke Das genaue Gegenteil gilt auch. Wenn Sie nicht möchten, dass Abfrageparameter zwischengespeichert werden, verwenden Sie den GET-Stil für die Parameter. ~ OR ~ make DARN SURE, um Anti-Caching-Header für alles zu ändern / einzufügen, was nicht zwischengespeichert werden soll. Außerdem gibt es einen Header, der ein Hash des Objekt- / Seiten-Returends ist. Verwenden Sie diesen Header, um Änderungen von Dingen anzuzeigen, die zwischengespeichert werden sollen, die jedoch aktualisiert werden, wenn Änderungen vorgenommen werden.
Dennis
@aehlke Ich habe etwas über Caching erfahren und füge es hinzu. Ich erinnere mich an eine CodeCamp-Präsentation, in der eine der Beschleunigungen all diese Header ausführte und dann den Dateinamen und alle Verweise darauf änderte, wenn sich der Inhalt änderte, um Kreditnehmer und Proxys nach einer langen Cache-Zeit dazu zu bringen, eine neuere Version auf den Server zu bringen einstellen. Hier sind alle wichtigen Details: developer.google.com/speed/docs/best-practices/caching
Dennis
2

Wenn Sie Ihre Clients mit Oauth2 authentifizieren, benötigen Sie wahrscheinlich einen Unterstrich für mindestens zwei Ihrer Parameternamen:

  • Kunden ID
  • client_secret

Ich habe camelCase in meiner (noch nicht veröffentlichten) REST-API verwendet. Beim Schreiben der API-Dokumentation habe ich darüber nachgedacht, alles in snake_case zu ändern, damit ich nicht erklären muss, warum die Oauth-Parameter snake_case sind, während andere Parameter dies nicht sind.

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

Michael
quelle
0

Ich würde sagen, dass es vorzuziehen ist, so wenige Sonderzeichen wie möglich in REST-URLs zu verwenden. Einer der Vorteile von REST besteht darin, dass die "Schnittstelle" für einen Dienst einfach zu lesen ist. Camel Case oder Pascal Case ist wahrscheinlich gut für die Ressourcennamen (Benutzer oder Benutzer). Ich glaube nicht, dass es bei REST wirklich harte Standards gibt.

Ich denke auch, dass Gandalf Recht hat. In REST ist es normalerweise sauberer, keine Abfragezeichenfolgenparameter zu verwenden, sondern Pfade zu erstellen, die definieren, mit welchen Ressourcen Sie umgehen möchten.

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

Andy White
quelle