Verschiedene Erholsamen Repräsentationen der gleichen Ressource

Meine Anwendung ist eine Ressource, die sich an /foo. In der Regel ist es vertreten durch einen HTTP-response-payload wie diese:

{"a": "some text", "b": "some text", "c": "some text", "d": "some text"}

Den client nicht immer müssen alle vier Mitglieder dieses Objekt. Was ist die Erholsam semantische Möglichkeit für den client dem server mitteilen, was er braucht in der Darstellung? z.B. wenn es will:

{"a": "some text", "b": "some text", "d": "some text"}

Wie sollte es GET es? Einige Möglichkeiten (ich bin auf der Suche nach einer Berichtigung, falls ich missverstanden, REST):

  • GET /foo?sections=a,b,d.
    • Den query-string (genannt Abfrage string, nachdem alle) zu bedeuten scheint "Ressourcen finden, welche dieser Bedingung und erzählen Sie mir davon", nicht "repräsentieren diese Ressource, um mich nach dieser Anpassung".
  • GET /foo/a+b+d Meine Lieblings - wenn REST-Semantik nicht gerade dieses Problem, wegen seiner Einfachheit.
    • Bricht URI Deckkraft, die Verletzung von HATEOAS.
    • Scheint zu brechen, die die Unterscheidung zwischen Ressource (der einzige Sinn, der ein URI ist, zu identifizieren eine Ressource) und Darstellung. Aber das ist fraglich, denn es ist konsistent mit /widgets repräsentieren eine vorzeigbare Liste der /widget/<id> Ressourcen, die ich hatte noch nie ein problem mit.
  • Lösen meine Zwänge, reagieren GET /foo/a usw, und der client eine Anfrage pro Komponente /foo es will.
    • Multipliziert overhead, das kann zu einem Alptraum werden, wenn /foo hat Hunderte von Komponenten ein-und der Kunde muss 100.
    • Wenn ich will eine HTML-Darstellung der /foo muss ich Ajax verwenden, was problematisch ist, wenn ich nur eine einzige HTML-Seite, die gecrawlt werden können, erbracht durch minimalistische Browser, etc.
    • Zu pflegen, HATEOAS, es erfordert auch links zu den "sub-Ressourcen" zu existieren, die in anderen Darstellungen, wahrscheinlich in /foo: {"a": {"url": "/foo/a", "content": "some text"}, ...}
  • GET /foo, Content-Type: application/json und {"sections": ["a","b","d"]} im request-body.
    • Unbookmarkable und uncacheable.
    • HTTP nicht definiert ist Körper Semantik für GET. Es ist legal HTTP, aber wie kann ich garantieren, einige Benutzer den proxy nicht Streifen den Körper von einer GET Anfrage?
    • Meine REST-client wird nicht lassen Sie mich einen Körper auf einer GET Anfrage, so dass ich nicht verwenden können, dass für die Prüfung.
  • Einen benutzerdefinierten HTTP-header: Sections-Needed: a,b,d
    • Würde ich eher vermeiden, benutzerdefinierte Header, wenn möglich.
    • Unbookmarkable und uncacheable.
  • POST /foo/requests, Content-Type: application/json und {"sections": ["a","b","d"]} im request-body. Erhalten 201 mit Location: /foo/requests/1. Dann GET /foo/requests/1 erhalten die gewünschte Darstellung /foo
    • Klobig; erfordert hin-und-her und einigen seltsam aussehenden code.
    • Unbookmarkable und uncacheable, da /foo/requests/1 ist nur ein alias, das würde nur einmal verwendet und nur solange aufbewahrt, wie es gefordert wird.
  • Ich würde mich für den query-string-Ansatz. Der query-string ist ein Teil der URL und das ist, wo die scoping information gehen sollte. Es ist auch, wie Facebook es tut. Hier ist ein netter screencast Erörterung dieser Angelegenheit: Lehren einen Hund zur RUHE. Es zeigt einige andere Formate, die Sie möglicherweise in Betracht zu.
  • Könnten Sie die 2-Repräsentationen der gleichen Ressource und mit content-negotiation.. 100% erholsam. vnd.jordan.foo mit allen, vnd.jordan.foo.minimal würde nicht zählen d. wenn das nur ein Beispiel und nicht ein allgemeiner Fall gehst du mit _fields, dass auch 100% erholsamen und individuell. Ihre Lieblings-a+b+d ist WIRKLICH schlecht, so vermeiden Sie es 🙂 foo/Anfragen/1 ist auch schlecht.. nicht, weil es nicht performant oder logisch ist, sondern weil es so Brauch ist. REST wird hauptsächlich über die Verwendung von best practices und Vermeidung von überraschungen 🙂 NEIN, um benutzerdefinierte Header. KEINE zu BEKOMMEN, mit dem Körper.. Sorry für den strukturlosen Kommentar 🙂
  • _fields ist, was Sie nennen "Abschnitte", du hast Recht es sieht aus wie ein filter, aber _fields wird Häufig verwendet und akzeptiert, nicht Wundern würde jeder Entwickler.
InformationsquelleAutor Jordan | 2013-04-29
Schreibe einen Kommentar