475 Stimmen

RESTful URL-Design für die Suche

Ich bin auf der Suche nach einer vernünftigen Möglichkeit, Suchen als RESTful URLs darzustellen.

Der Aufbau: Ich habe zwei Modelle, Autos und Garagen, wobei Autos in Garagen sein können. Meine URLs sehen also so aus:

/car/xxxx
  xxx == car id
  returns car with given id

/garage/yyy
  yyy = garage id
  returns garage with given id

Ein Auto kann allein stehen (daher das /car), oder es kann in einer Garage stehen. Wie kann man nun alle Autos in einer bestimmten Garage darstellen? Etwa so:

/garage/yyy/cars     ?

Wie wäre es mit der Vereinigung der Autos in Garage yyy und zzz?

Wie kann man eine Suche nach Autos mit bestimmten Eigenschaften richtig darstellen? Sprich: Zeige mir alle blauen Limousinen mit 4 Türen:

/car/search?color=blue&type=sedan&doors=4

oder sollte es stattdessen /cars heißen?

Die Verwendung von "Suche" scheint hier unangebracht zu sein - was ist ein besserer Weg / Begriff? Sollte es einfach sein:

/cars/?color=blue&type=sedan&doors=4

Sollten die Suchparameter Teil des PATHINFO oder QUERYSTRING sein?

Kurz gesagt, ich suche eine Anleitung für die modellübergreifende Gestaltung von REST-Url und für die Suche.

[Update] Ich mag Justins Antwort, aber er deckt nicht den Fall der Suche mit mehreren Feldern ab:

/cars/color:blue/type:sedan/doors:4

oder etwas Ähnliches. Wie kommen wir von

/cars/color/blue

auf den Fall mit mehreren Feldern?

17 Stimmen

Obwohl es auf Englisch besser aussieht, mischen /cars y /car ist nicht semantisch und daher eine schlechte Idee. Verwenden Sie immer den Plural, wenn es mehr als einen Artikel unter dieser Kategorie gibt.

5 Stimmen

Dies sind schlechte Antworten. Die Suche sollte Abfragezeichenfolgen verwenden. Abfragezeichenfolgen sind 100% RESTful, wenn sie richtig verwendet werden (dh für die Suche).

2 Stimmen

486voto

pbreitenbach Punkte 11048

Für die Suche verwenden Sie Querystrings. Dies ist perfekt RESTful:

/cars?color=blue&type=sedan&doors=4

Ein Vorteil von regulären Querystrings ist, dass sie standardisiert sind und weithin verstanden werden und dass sie von form-get generiert werden können.

144voto

Qwerty Punkte 24128

Les RESTful hübsches URL-Design geht es um die Anzeige einer Ressource auf der Grundlage einer Struktur (verzeichnisartige Struktur, Datum: Artikel/2005/5/13, Objekt und seine Attribute, ), der Schrägstrich / eine hierarchische Struktur anzeigt, verwenden Sie die -id stattdessen.

Hierarchische Struktur

Ich persönlich würde es vorziehen:

/garage-id/cars/car-id
/cars/car-id   #for cars not in garages

Entfernt ein Benutzer die /car-id Teil, es bringt die cars Vorschau - intuitiv. Der Benutzer weiß genau, wo im Baum er sich befindet und was er sieht. Er weiß auf den ersten Blick, dass Garagen und Autos in Beziehung zueinander stehen. /car-id bedeutet auch, dass es zusammengehört, im Gegensatz zu /car/id .

Suche auf

Die Suchabfrage ist so, wie sie ist, in Ordnung Es ist nur Ihre Vorliebe, die berücksichtigt werden sollte. Der witzige Teil kommt, wenn man die Suche verbindet (siehe unten).

/cars?color=blue;type=sedan   #most prefered by me
/cars;color-blue+doors-4+type-sedan   #looks good when using car-id
/cars?color=blue&doors=4&type=sedan   #also possible, but & blends in with text

Oder grundsätzlich alles, was kein Schrägstrich ist, wie oben erklärt.
Die Formel: /cars[?;]color[=-:]blue[,;+&] Ich würde allerdings nicht die & Zeichen, da es auf den ersten Blick nicht vom Text zu unterscheiden ist, falls das Ihr Ding ist.

** Wussten Sie, dass die Übergabe eines JSON-Objekts in einem URI RESTful ist? **

Listen von Optionen

/cars?color=black,blue,red;doors=3,5;type=sedan   #most prefered by me
/cars?color:black:blue:red;doors:3:5;type:sedan
/cars?color(black,blue,red);doors(3,5);type(sedan)   #does not look bad at all
/cars?color:(black,blue,red);doors:(3,5);type:sedan   #little difference

mögliche Merkmale?

Suchstrings negieren (!)
Zur Durchsuchung beliebiger Fahrzeuge, aber no schwarz y rot :
?color=!black,!red
color:(!black,!red)

Gemeinsame Suche
Suche rot o blau o schwarz Autos mit 3 Türen in Garagen id 1..20 o 101..103 o 999 pero no 5 /garage[id=1-20,101-103,999,!5]/cars[color=red,blue,black;doors=3]
Sie können dann komplexere Suchanfragen formulieren. (Sehen Sie sich CSS3-Attribut-Abgleich für die Idee des Abgleichs von Teilzeichenfolgen. Z.B. Suche nach Benutzern, die "bar" enthalten user*=bar .)

Schlussfolgerung

Dies ist vielleicht der wichtigste Teil für Sie, denn Sie können es tun, wie Sie wollen, aber bedenken Sie, dass RESTful URI stellt eine leicht verständliche Struktur dar, z. B. eine verzeichnisartige /directory/file , /collection/node/item Daten /articles/{year}/{month}/{day} .. Und wenn Sie eines der letzten Segmente weglassen, wissen Sie sofort, was Sie bekommen.

Also, all diese Figuren sind unverschlüsselt erlaubt :

  • ohne Vorbehalt: a-zA-Z0-9_.-~
    In der Regel sind beide Verwendungen, verschlüsselt und unverschlüsselt, gleichwertig.
  • Sonderzeichen: $-_.+!*'(),
  • reserviert: ;/?:@=&
    Sie können für den Zweck, den sie darstellen, unverschlüsselt verwendet werden, andernfalls müssen sie verschlüsselt werden.
  • unsicher: <>"#%{}|^~[]`
    Warum unsicher und warum sollte lieber verschlüsselt werden: RFC 1738 siehe 2.2

Siehe auch RFC 1738#Seite-20 für weitere Charakterklassen.

RFC 3986 siehe 2.2
Ungeachtet dessen, was ich zuvor gesagt habe, gibt es hier eine gemeinsame Unterscheidung von Abgrenzungen, was bedeutet, dass einige "sind" wichtiger sind als andere.

  • generische Begrenzungszeichen: :/?#[]@
  • Sub-Delimeter: !$&'()*+,;=

Lesen Sie weiter:
Hierarchie: siehe 2.3 , siehe 1.2.3
url pfad parameter syntax
CSS3-Attribut-Abgleich
IBM: RESTful Web Services - Die Grundlagen
Hinweis: RFC 1738 wurde durch RFC 3986 aktualisiert.

37voto

Doug Domeny Punkte 4340

Obwohl es einige Vorteile hat, die Parameter im Pfad zu haben, gibt es, IMO, einige Faktoren, die überwiegen.

  • Nicht alle für eine Suchanfrage benötigten Zeichen sind in einer URL erlaubt. Die meisten Interpunktions- und Unicode-Zeichen müssten als Abfrage-String-Parameter URL-kodiert werden. Ich kämpfe mit demselben Problem. Ich würde gerne XPath in der URL verwenden, aber nicht jede XPath-Syntax ist mit einem URI-Pfad kompatibel. Also für einfache Pfade, /cars/doors/driver/lock/combination wäre es angebracht, die ' combination Element im XML-Dokument der Fahrertür. Aber /car/doors[id='driver' and lock/combination='1234'] ist nicht so freundlich.

  • Es besteht ein Unterschied zwischen dem Filtern einer Ressource auf der Grundlage eines ihrer Attribute und dem Spezifizieren einer Ressource.

    Zum Beispiel, da

    /cars/colors gibt eine Liste aller Farben für alle Autos zurück (die zurückgegebene Ressource ist eine Sammlung von Farbobjekten)

    /cars/colors/red,blue,green würde eine Liste von Farbobjekten zurückgeben, die rot, blau oder grün sind, und nicht eine Sammlung von Autos.

    Für die Rückgabe von Autos würde der Weg wie folgt aussehen

    /cars?color=red,blue,green o /cars/search?color=red,blue,green

  • Parameter im Pfad sind schwieriger zu lesen, weil Name/Wert-Paare nicht vom Rest des Pfads isoliert sind, der nicht aus Name/Wert-Paaren besteht.

Eine letzte Bemerkung. Ich bevorzuge /garages/yyy/cars (immer Plural) zu /garage/yyy/cars (vielleicht war es ein Tippfehler in der ursprünglichen Antwort), weil dadurch der Wechsel zwischen Singular und Plural vermieden wird. Bei Wörtern mit einem angefügten "s" ist die Änderung nicht so schlimm, aber die Änderung /person/yyy/friends a /people/yyy scheint umständlich zu sein.

36voto

Rich Apodaca Punkte 26962

Um die Antwort von Peter zu ergänzen: Sie könnten die Suche zu einer erstklassigen Ressource machen:

POST    /searches          # create a new search
GET     /searches          # list all searches (admin)
GET     /searches/{id}     # show the results of a previously-run search
DELETE  /searches/{id}     # delete a search (admin)

Die Suchressource würde Felder für Farbe, Marke, Modell, Garagenstatus usw. enthalten und könnte im XML-, JSON- oder einem anderen Format angegeben werden. Wie bei der Ressource "Auto und Garage" könnte der Zugriff auf die Suche auf der Grundlage einer Authentifizierung eingeschränkt werden. Benutzer, die häufig dieselben Suchvorgänge durchführen, können diese in ihren Profilen speichern, so dass sie nicht neu erstellt werden müssen. Die URLs werden so kurz sein, dass sie in vielen Fällen leicht per E-Mail ausgetauscht werden können. Diese gespeicherten Suchanfragen können die Grundlage für benutzerdefinierte RSS-Feeds usw. bilden.

Es gibt viele Möglichkeiten für die Verwendung von Suchanfragen, wenn man sie als Ressourcen betrachtet.

Die Idee wird in diesem Artikel näher erläutert Eisenbahnsendung .

11voto

Peter Hilton Punkte 16948

Justins Antwort ist wahrscheinlich der richtige Weg, obwohl es in manchen Anwendungen sinnvoll sein kann, eine bestimmte Suche als eigenständige Ressource zu betrachten, z. B. wenn Sie benannte gespeicherte Suchen unterstützen möchten:

/search/{searchQuery}

oder

/search/{savedSearchName}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X