Frage

Ich bin kämpfen, um zu bestimmen, wie design restful-URLs.Ich bin für die restful-Ansatz der Verwendung von URLs mit Nomen und Verben nicht verstehen nicht, wie dies zu tun.

Wir erstellen einen service zu implementieren, ein Finanz-Taschenrechner.Der Taschenrechner findet eine Reihe von Parametern, die wir hochladen werden über eine CSV-Datei.Die Anwendungsfälle umfassen:

  1. Laden Sie neue Parameter
  2. Holen Sie sich die neuesten Parameter
  3. Get-Parameter für einen bestimmten Geschäfts-Datum
  4. Stellen Sie eine Reihe von Parametern, active
  5. Überprüfen eine Reihe von Parametern,

Ich nehme an, die restful-Ansatz wäre der folgende URLs:

/parameters
/parameters/12-23-2009

Sie erreichen konnten, die ersten drei Anwendungsfälle:

  1. POST, wo man auch die parameter-Datei in die post-Anforderung
  2. HOLEN Sie sich den ersten URL
  3. HOLEN Sie sich die zweite URL

Aber wie machst du das 4. und 5. use case ohne ein verb?Würden Sie nicht brauchen URLs wie:

/parameters/ID/activate
/parameters/ID/validate

??

War es hilfreich?

Lösung

Vielleicht so etwas wie:

PUT /parameters/activation HTTP/1.1
Content-Type: application/json; encoding=UTF-8
Content-Length: 18

{ "active": true }

Andere Tipps

Allgemeine Grundsätze für eine guten URI Entwurf:

  • nicht Verwendung Abfrageparameter Zustand ändern
  • Nicht Groß- und Klein Pfade verwenden, wenn Sie es vermeiden kann; Klein ist am besten
  • Nicht Verwendung Implementierung spezifische Erweiterungen in Ihrem URIs (.php, Py, .pl, usw.)
  • nicht fallen in RPC mit URIs
  • Do beschränken Sie Ihre URI Raum so viel wie möglich
  • Do Pfadsegmente kurz halten
  • Do bevorzugen entweder /resource oder /resource/; erstellen 301 Umleitungen von dem Sie nicht verwenden
  • Do Verwendung Abfrageparameter für Unter Auswahl einer Ressource; das heißt Paginierung, Suchanfragen
  • Bewegung Sachen aus dem URI, die in einem HTTP-Header oder einen Körper
  • sein sollten

(Hinweis: Ich nicht "RESTful-URI-Design" sagte, URIs in REST im Wesentlichen undurchsichtig ist.)

Allgemeine Grundsätze für die HTTP-Methode Wahl:

  • Nicht jemals verwenden GET Zustand zu ändern; dies ist eine gute Möglichkeit, den Tag der Googlebot ruinieren haben
  • Nicht Verwendung PUT, wenn Sie eine gesamte Ressource aktualisieren
  • Nicht Verwendung PUT, wenn Sie auch berechtigterweise eine GET auf dem gleichen URI tun
  • nicht Verwendung POST Informationen abzurufen, die langlebiger ist oder das könnte sinnvoll sein, den Cache
  • Nicht eine Operation ausführen, ist nicht Idempotent mit PUT
  • Do Verwendung für so viel wie möglich
  • Do Verwendung POST in Präferenz zu setzen, wenn im Zweifel
  • Do Verwendung POST, wenn Sie zu tun haben, etwas, das RPC-like
  • fühlt
  • Do Verwendung PUT für Klassen von Ressourcen, die größer oder hierarchisch sind
  • Do Verwendung bevorzugt DELETE POST Ressourcen entfernen
  • Do Verwendung GET für Dinge wie Rechnungen, es sei denn, Ihre Eingabe groß ist, wobei in diesem Fall verwenden POST

Allgemeine Grundsätze des Web-Service-Designs mit HTTP:

  • Nicht setzen Metadaten in den Körper einer Antwort, die in einem Header sein sollte
  • Nicht setzen Metadaten in einer separaten Ressource, es sei denn, einschließlich wäre es erheblichen Aufwand erstellen
  • Do verwenden Sie die entsprechende Statuscode
    • 201 Created nach Erstellen einer Ressource; Ressource muss zu dem Zeitpunkt existieren die Antwort gesendet
    • 202 Accepted nach einer Operation erfolgreich durchzuführen oder eine Ressource asynchron zu schaffen
    • 400 Bad Request, wenn jemand tut eine Operation auf Daten, die eindeutig gefälscht ist; Dies könnte ein Fehler bei der Überprüfung sein für Ihre Anwendung; reservieren 500 für nicht abgefangene Ausnahmen im Allgemeinen
    • 401 Unauthorized wenn jemand greift auf Ihre API entweder ohne einen notwendigen Authorization Header liefert oder wenn die Anmeldeinformationen innerhalb der Authorization ungültig sind; nicht über diesen Antwortcode verwenden, wenn Sie keine Anmeldeinformationen über einen Authorization Header erwartet.
    • 403 Forbidden, wenn jemand Ihre API in einer Art und Weise zugreift, die bösartige sein könnte oder wenn sie nicht berechtigt sind
    • 405 Method Not Allowed wenn jemand POST verwendet, wenn sie PUT verwendet haben sollte, etc
    • 413 Request Entity Too Large, wenn jemand versucht, Ihnen eine unannehmbar große Datei zu senden
    • 418 I'm a teapot href="http://tools.ietf.org/html/rfc2324#section-2.3.2" rel="noreferrer"> bei dem Versuch, mit einer Teekanne Kaffee zu brauen
  • Do Verwendung Caching-Header, wenn Sie können
    • ETag Header sind gut, wenn Sie ganz einfach eine Ressource zu einem Hash-Wert reduzieren
    • Last-Modified sollte Ihnen zeigen, dass um einen Zeitstempel zu halten, wenn die Ressourcen aktualisiert werden, ist eine gute Idee,
    • Cache-Control und Expires sollten vernünftige Werte gegeben werden
  • Do alles können Sie zu ehren Caching-Header in einer Anfrage (If-None-Modified, If-Modified-Since)
  • Do Verwendung umleitet, wenn sie Sinn machen, aber diese sollten für einen Web-Service
  • selten

In Bezug auf Ihre Frage sollte POST für 5 # 4 und # verwendet werden. Diese Operationen fallen unter die „RPC-like“ Richtlinie über. Für # 5, denken Sie daran, dass POST muss nicht unbedingt Content-Type: application/x-www-form-urlencoded verwenden. Dies könnte genauso gut eine JSON oder CSV-Nutzlast sein.

Jedes Mal, wenn es sieht aus wie Sie ein neues Verb brauchen, darüber nachzudenken, dass Verb in ein Substantiv statt drehen. Zum Beispiel dreht ‚aktivieren‘ in ‚Aktivierung‘ und ‚Validate‘ in ‚Validierung‘.

Aber nur von dem, was Sie geschrieben haben, würde ich sagen, Ihre Anwendung viel größere Probleme hat.

Jedes Mal, wenn eine Ressource namens ‚Parameter‘ wird vorgeschlagen, soll es rote Fahnen in jedem Projektmitarbeiter Geist sandte nach oben. ‚Parameter‘ kann buchstäblich auf jede Ressource anzuwenden; es ist nicht spezifisch genug.

Was genau ist ein ‚Parameter‘ darstellen? Wahrscheinlich eine Reihe von verschiedenen Dingen, von denen jede eine separate Ressource gewidmet haben sollte.

Eine andere Möglichkeit, um diese zu erhalten - wenn Sie Ihre Anwendung mit den Endnutzern (diejenigen, die vermutlich wenig über Programmierung wissen) diskutieren, was die Worte sind sie sich wiederholt verwenden

Das sind die Worte, die Sie Ihre Anwendung werden die Gestaltung sollte sich um.

Wenn Sie noch nicht haben diese Umwandlung mit dem künftigen Nutzer - alles stoppt jetzt und nicht schreiben, eine andere Zeile Code, bis Sie tun! Erst dann wird Ihr Team eine Vorstellung davon hat, was muss gebaut werden.

Ich weiß nichts über Finanz-Software, aber wenn ich raten müsste, würde ich einige der Ressourcen sagen könnten durch Namen gehen wie „Report“, „Zahlung“, „Transfer“ und „Währung“.

Es gibt eine Reihe von guten Büchern zu diesem Teil des Software-Design-Prozesses. Zwei Ich kann empfehlen sind Domain Driven Design und Analyse Patterns .

Das design Ihrer urls hat nichts damit zu tun, ob Ihre Anwendung ist Erholsam ist oder nicht.der Begriff "RESTful URLS" ist also Unsinn.

Ich denke, man sollte ein bisschen mehr zu Lesen, was REST eigentlich ist.REST behandelt die URLS als undurchsichtig, und als solche, die nicht wissen, was in Ihnen ist, ob es Verben oder Nomen oder was auch immer.Gegebenenfalls möchten Sie Ihre design-URLS, aber das ist über die Benutzeroberfläche, nicht RUHEN.

Das heißt, kommen wir nun zu deiner Frage:Die letzten beiden Fälle sind nicht Erholsam, und passen nicht in jede Art von restful-Schema.Diese sind das, was man nennen könnte RPC.Wenn Sie ernsthaft über den REST müssen Sie überdenken, wie Ihre Anwendung funktioniert von Grund auf.Entweder das, oder aufzugeben, die RUHE und tun Sie einfach, Ihre app als RPC-app.

Hrmmm, vielleicht auch nicht.

Die Idee hier ist, dass Sie zu behandeln, alles als Ressource, so dass nach einer Reihe von Parametern hat eine URL, die Sie können finden es aus, fügen Sie einfach

Holen Sie sich [parametersurl]/validationresults

post [paramatersurl]

Körper:{command:"aktivieren"}

aber wieder aktivieren, was ist RPC, REST nicht.

Die activate und Validierung Anforderungen sind Situationen, in denen Sie den Status einer Ressource versuchen, zu ändern. Nicht anders ist es, dass eine Bestellung „abgeschlossen“ oder eine andere Anfrage „vorgelegt“ zu machen. Es gibt zahlreiche Möglichkeiten, diese Art von Zustandsänderung zu modellieren, sondern eine, die ich so oft finden arbeitet, ist Sammlung Ressourcen für die Ressourcen des gleichen Staates zu schaffen und dann die Ressource zwischen den Sammlungen zu bewegen, um den Zustand zu beeinflussen.

z. Erstellen Sie einige Ressourcen wie

/ActiveParameters
/ValidatedParameters

Wenn Sie eine Reihe von Parametern aktiv, machen wollen, dann fügen Sie diesen Satz auf die ActiveParameters Sammlung. Sie könnten entweder den Satz von Parametern als Einheit Körper passieren, oder Sie können eine URL als Abfrage-Parameter übergeben, wie folgt:

POST /ActiveParameters?parameter=/Parameters/{Id}

Das gleiche kann mit dem / ValidatedParameters erfolgen. Wenn die Parameter nicht gültig sind, dann kann der Server zurückgeben „Bad Request“ auf die Anforderung, die Parameter zu Sammlung von validierten Parameter hinzuzufügen.

Ich würde die folgende Meta-Ressource und Methoden vor.

Stellen Parameter aktiv und / oder bestätigen sie:

> PUT /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Content-Type: application/json
> Connection: close
>
> {'active': true, 'require-valid': true}
>
< HTTP/1.1 200 OK
< Connection: close
<

Überprüfen Sie, ob die Parameter aktiv und gültig:

> GET /parameters/<id>/meta HTTP/1.1
> Host: example.com
> Connection: close
>
< HTTP/1.1 200 OK
< Content-Type: application/json
< Connection: close
<
< {
<     'active': true,
<     'require-valid': true,
<     'valid': {'status': false, 'reason': '...'}
< }
<

In einer REST-Umgebung, jede URL ist eine einzigartige Ressource. Was sind Ihre Ressourcen? Ein Finanzrechner wirklich hat keine offensichtlichen Ressourcen. Sie müssen graben, in das, was man Parameter aufrufen und die Ressourcen herausziehen. Zum Beispiel könnte ein Amortisations Kalender für ein Darlehen eine Ressource sein. Die URL für den Kalender könnte gehören start_date, Laufzeit (in Monaten oder yers), Zeit (bei Interesse eingemischt wird), Zinssatz und anfängliches Prinzip. Mit all diesen Werten haben Sie einen bestimmten Kalender der Zahlungen:

http://example.com/amort_cal/2009-10-20/30yrsfixed/monthly/5.00/200000

Nun, ich weiß nicht, was Sie Berechnung aber Ihr Konzept einer Parameterliste klingt nicht RESTful. Als jemand anderes gesagt, Ihre Anforderungen über Sound mehr XMLRPC. Wenn Sie REST versuchen, müssen Sie Substantive. Die Berechnungen sind nicht Substantive, sie Verb sind, die auf Substantive wirken. Sie müssen sich drehen Sie es um die Substantive aus Ihrem calcs zu ziehen.

Edit: Ja, die URI verhindert GET Anfragen von verbleibenden Idempotent hätte.


Für die Validierung jedoch die Verwendung von HTTP-Statuscodes, die Gültigkeit eines Antrags zu informieren (um einen neuen zu erstellen oder einen vorhandenen ‚parameter‘ ändern) würde ein Erholsamer Modell passen.

Bericht zurück mit einem 400 Bad Request Statuscode, wenn die vorgelegten Daten ist / sind ungültig und muss der Antrag vor dem erneut eingereicht geändert werden ( HTTP / 1.1 Statuscodes ).

Dies setzt allerdings bei Einreichung Zeit auf der Validierung, anstatt sie wie in Ihrem Anwendungsfall aufzuschieben. Die anderen Antworten haben geeignete Lösungen für dieses Szenario.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top