Welches ist das beste Design für eine RESTful URI mit mehreren obligatorischen Parametern?

8

Ich möchte sehen, ob mehr erfahrene Web-Service-Veteranen den besten Weg zur Gestaltung eines REST-fähigen URI kommentieren können, in dem ich obligatorische Parameter brauche. Zum Beispiel möchte ich einen URI entwerfen, der Daten anfordert:

%Vor%

Nach meinem Verständnis besteht der Ansatz jedoch darin, dass mehr Daten auf den höheren Ebenen zurückgegeben werden, während detailliertere Daten zurückgegeben werden, wenn spezifischere URI-Schlüsselwörter verwendet werden, aber in meinem Fall sind dafür mindestens drei Werte erforderlich . Diese 3 Werte wären ein Datumswert, ein Kontowert und proprietäre Verteilungscodewerte. Zum Beispiel:

%Vor%

Wird das als "RESTful" -URL angesehen oder gibt es einen besseren Ansatz, der mehr Sinn ergibt? Jede Eingabe wird sehr geschätzt.

BTW, Python ist die Sprache der Wahl. Danke!

    
Carlos 08.07.2012, 20:19
quelle

4 Antworten

5

URIs können per definitionem nicht "unwiederholbar" sein, weil die URI-Spezifikation vom REST-Architekturstil geleitet wurde. Wie Sie einen URI verwenden, kann den REST-Stil verletzen durch:

  1. Nicht der Einschränkung "client-server" folgen; B. mithilfe von WebSockets Server Push implementieren.
  2. Nicht der Einschränkung "Identifizierung von Ressourcen" folgen; beispielsweise einen Teil der URI verwendet, um Steuerdaten oder Ressourcen Metadaten angeben eher kleben als eine Ressource zu identifizieren, oder durch Ressource über irgendeinen anderen Mechanismus als die URI (wie der Sitzungszustand oder andere Out-of-band-Mechanismen) identifiziert.
  3. Nicht der Einschränkung "Manipulation von Ressourcen durch Repräsentationen" folgen; B. indem Sie den querystring-Teil eines URI verwenden, um den Status zu übertragen.
  4. Nicht der Einschränkung "selbstbeschreibende Nachrichten" folgen; Verwenden Sie beispielsweise HTTP GET, um den Status zu ändern, oder übertragen Sie JSON mit dem Inhaltstyp "text / html".
  5. Nicht der Einschränkung "Hypermedia als Bedingung für den Anwendungszustand" folgen; B. nicht, dass die Hyperlinks des Benutzeragenten folgen, sondern stattdessen davon ausgehen, dass sie sie mithilfe von Out-of-Band-Wissen aufbauen.
  6. Nicht nach der Einschränkung „Schichtsystem“, durch den Client erfordert Informationen über die Innereien zu wissen, wie der Server funktioniert (insbesondere den Client erfordert sie in einer Anfrage zur Verfügung zu stellen).

Keine der oben genannten Optionen sind notwendigerweise schlechte Entscheidungen . Sie können die beste Wahl für Ihr System sein, weil sie bestimmte architektonische Eigenschaften (wie Effizienz oder Sicherheit) fördern. Sie sind nicht Teil des REST-Stils.

Die Tatsache, dass Ihre Ressource durch mehrere obligatorische Segmente identifiziert wird, ist ein wesentlicher Bestandteil des Entwurfs von URIs. Wie Anton hervorhebt, ist die Wahl zwischen example.com/request/distribution?acct=123&date=20030102&distcode=1A;1B;1C und, sagen wir, example.com/accounts/123/distributions/20030102/1A;1B;1C nur eine der Datenkonstruktionen und nicht ein Problem der URI-Schicht selbst. Es gibt nichts Falsches, zum Beispiel beim Antworten auf eine PUT-, POST- oder DELETE-Anfrage an die erste. Ein Client, der einem Link zu keinem der beiden Links folgt, wird als fehlerhaft betrachtet. Ein System, von dem erwartet wird, dass es entweder durch eine andere Möglichkeit als eine Hypermedia-Antwort für den Client verfügbar gemacht wird, würde als "nicht reversibel" betrachtet werden.

    
fumanchu 09.07.2012, 00:59
quelle
3

Es ist besser, zunächst REST-konforme APIs zu erstellen, nicht URIs. Es hat mehr mit Ihrem Datendesign zu tun als beispielsweise mit Ihrer bevorzugten Sprache.

ZB haben Sie eine Verteilungsressource. Sie möchten es in Ihrer webbasierten API darstellen, daher muss es über eine entsprechende eindeutige Ressourcen-ID (URI) verfügen. Es sollte einfach, lesbar und kaum zu ändern sein. Dies wäre ein anständiges Beispiel:

%Vor%

Denken Sie zweimal nach, bevor Sie weitere Dinge und eine Hierarchie in Ihre URIs einfügen .

Sie möchten Ihre URIs nicht ändern, wenn sich Ihr Datenmodell oder Ihr Authentifizierungsschema weiterentwickelt. Ändern URIs ist uncool und Schmerzen für Sie und Entwickler, die Ihre API verwenden. Also, wenn Sie die Authentifizierung auf dem Back-End übergeben müssen, sollten Sie wahrscheinlich GET verwenden Parameter oder HTTP-Header (AWS S3 API zum Beispiel erlaubt beide ).

Setzen zu viel in GET-Parameter (zB http://example.com/api/distribution/?id=<some_unique_id> ) kann wie eine schlechte Idee erscheinen, aber IMO ist es nicht wirklich wichtig [0] -wie lange Sie halten Ihre API-Dokumentation zugänglich und up-to-date .

[0] Update: Für schreibgeschützte APIs mindestens. Für CRUD-APIs ist es, wie @daniel gezeigt hat, bequemer, wenn Sie Endpunkte wie im ersten Beispiel oben haben. Auf diese Weise können Sie HTTP-Methoden verwenden, indem Sie GET, PUT, DELETE für einzelne Ressourcen in /api/distribution/<id> und POST in /api/distribution aktivieren, um neue Distributionen zu erstellen.

die Antwort Bei der Recherche, fand eine schöne Präsentation über RESTful APIs: Entwerfen von HTTP-Schnittstellen und RESTful-Webdiensten .

    
Tony 08.07.2012 23:07
quelle
0

Der REST-konforme Weg besteht darin, die Daten als Ressource darzustellen, nicht als Parameter für eine Anfrage:

%Vor%     
Dmitri 08.07.2012 21:56
quelle
-1

Wenn Sie an RESTful denken, sollten Sie meistens auch an CRUD denken.

%Vor%

ist gut für eine GET-Anfrage, um etwas anzuzeigen (das R in CRUD).

Aber welche URLs halten Sie für die CUD-Teile?

    
daniel 08.07.2012 21:29
quelle

Tags und Links