Ich habe eine Debatte darüber geführt, was mit einem abschließenden Schrägstrich in einer RESTful-API geschehen soll.
Nehmen wir an, ich habe eine Ressource namens Hunde und untergeordnete Ressourcen für einzelne Hunde. Wir können daher Folgendes tun:
GET/PUT/POST/DELETE http://example.com/dogs
GET/PUT/POST/DELETE http://example.com/dogs/{id}
Aber was machen wir mit dem folgenden Sonderfall:
GET/PUT/POST/DELETE http://example.com/dogs/
Meine persönliche Meinung ist, dass dies bedeutet, eine Anfrage an eine einzelne Hunderessource mit id = zu senden null
. Ich denke, dass die API eine 404 für diesen Fall zurückgeben sollte.
Andere sagen, die Anfrage greife auf die Hunderessource zu, dh der abschließende Schrägstrich wird ignoriert.
Kennt jemand die endgültige Antwort?
dogs
unddogs/
als gleichwertig behandeln. Für mich ist klar, dassdogs/
es sich um ein Verzeichnis handelt, das die einzelnen Hunde enthält. Es ist weniger klar, was esdogs
ist, aber ich würde es als gleichwertig behandeln, genau wie die meisten Webserver Zugriffe auf Verzeichnisse akzeptieren, ohne nachzulesen/
.Antworten:
Nichts davon ist maßgebend (da REST keine genaue Bedeutung hat). In der Originalarbeit zu REST gibt eine vollständige (nicht mit / endende) URL eine Ressource an, während eine mit einem Schrägstrich (/) endende Ressourcengruppe ist (wahrscheinlich nicht so formuliert).
Ein GET einer URL mit einem Schrägstrich am Ende soll die verfügbaren Ressourcen auflisten.
Ein PUT auf eine URL mit einem Schrägstrich soll alle Ressourcen ersetzen.
Ein DELETE in einer URL mit einem Schrägstrich soll alle Ressourcen löschen
Durch einen POST auf eine URL mit einem Schrägstrich soll eine neue Ressource erstellt werden, auf die anschließend zugegriffen werden kann. Um konform zu sein, sollte sich die neue Ressource in diesem Verzeichnis befinden (obwohl viele RESTful-Architekturen hier schummeln).
usw.
Die Wiki-Seite zu diesem Thema scheint es gut zu erklären:
Siehe Beispiel https://en.wikipedia.org/wiki/Representational_state_transfer#Applied_to_Web_services .
quelle
/
/
?GET http://example.com/dogs
Gibt möglicherweise Metainformationen zu den Hunden zurück (nicht die Liste selbst, sondern Metainformationen zur Liste der Hunde). Vielleicht oder vielleicht ist es ein Fehler.As the last character within a URI’s path, a forward slash (/) adds no semantic value and may cause confusion. It’s better to drop them completely.
Dies ist nicht der einzige Ort , der vorschlägt, keinen Trainings-Slash zu verwendenEs gibt keine, da es kein offizielles Dokument darüber gibt, was erforderlich ist, damit ein Service als REST-konform eingestuft wird.
Das heißt, ich würde den abschließenden Schrägstrich einfach für die Benutzerfreundlichkeit zulassen. Technisch gesehen könnte dies als Versuch angesehen werden, auf einen Hund mit einer Null-ID zuzugreifen. Ich sehe keinen Benutzer, der diesen Sprung ausführt, es sei denn, er hat ihn in Ihrer Dokumentation gelesen. Ich kann einen Benutzer sehen, der versucht, Code gegen Ihre API zu schreiben und den abschließenden Schrägstrich einfach aus Gewohnheit einzufügen, und mich fragt, warum er eine 404-Antwort erhält, wenn er eine Liste von Hunden haben möchte.
quelle
example.com/dogs
ist eine Ressource völlig unabhängig von jeder Ressourceexample.com/dogs/X
. Somit muss ein DELETE onexample.com/dogs
nicht alle Hunde / * löschen (obwohl es das kann, wenn das die Semantik ist). Aber DELETEexample.com/dogs/
sollte alle Hunde / * löschen.foo
,foo/
undfoo////
identisch. Im Grunde scheint es, leere Pfadsegmente herauszulösen. Wenn Sie also mit Ihrem REST-Service denselben Ansatz verfolgendogs
unddogs/
auf dasselbe verweisen würden.Zwei Wege.
Methode 1
Verwenden Sie immer abschließende Schrägstriche für alle Ressourcen, die untergeordnete Elemente enthalten können.
Betrachten Sie einfach "GET" in einem public_html-Verzeichnis mit Dateien.
Nicht möglich, wenn hallo.html eine Datei ist:
Aber möglich, wenn hallo.html ein Verzeichnis ist:
Wenn "hello.html" also jemals Kinder haben kann, ist es immer und für immer "/hello.html/" und "/hello.html/index.html" (oder einfach "/hello.html/") eine Auflistung dieser Kinder .
Methode 2
Seien Sie clever".
Der Befehl find kümmert sich nicht um den Typ von hello.html. Verzeichnis oder Datei, wen interessiert es, es ist der Name eines Objekts. Wenn wir "cp youagain.html hello.html" schreiben, kann cp herausfinden, wie man mit hello.html umgeht. cp ist schlau. Ihr Webserver ist auch schlau. Es verfügt über eine Path-Handling-Bibliothek. Es hat Routing. Es kann angeben und Ihnen sagen, ob ein Name ein Objekt oder ein Verzeichnis ist. Es kann bla zu bla umleiten / oder sogar nur die gleiche Antwort für beide liefern. Das ist der Hammer !!! Weg. So viel Technik. Wer würde jemals einfach Pfadzeichenfolgen verketten wollen, wenn wir das alles tun könnten ???
quelle