2013-12-12 8 views
9

Ich arbeite am Entwerfen einer Ressource für diesen Dienst, die eine Reihe von veränderbaren Eigenschaften und eine Reihe von unveränderlichen (z. B. status, die vom Dienst generiert wird und nicht etwas, das der Client ändern kann) hat.Wie sollte ein RESTful-Service schreibgeschützte Eigenschaften auf änderbaren Ressourcen verfügbar machen?

Ich muss dies in Antworten auf GET Anfragen für die Ressource enthalten, aber bin mir nicht sicher, was zu tun ist, wenn jemand dann die Ressource mit einer PUT Anfrage sendet.

Das Erzwingen des Anrufers zu wissen, welche Eigenschaften unveränderlich sind, fühlt sich falsch an, aber stillschweigend verwerfen Aktualisierungen fühlen sich auch falsch. Die Antwort mit der aktualisierten Ressource auf die Anfrage PUT könnte das Problem lösen, aber es ist unvollkommen, da der Anrufer keine Diff seiner Anfrage und die Antwort des Dienstes machen sollte, um herauszufinden, ob eine Eigenschaft akzeptiert wurde.

Irgendwelche Gedanken auf dem richtigen Weg?

P.S. Ich schaute auf How should I update a REST resource?, aber es ist anders als diese Frage und fördert eine übermäßig gesprächige API-Design.

Antwort

6

Ich würde vorschlagen, den Richtlinien zu http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10 zu folgen. Die Definition von HTTP 409 umfasst Folgendes:

1) Die Anforderung konnte aufgrund eines Konflikts mit dem aktuellen Status der Ressource nicht abgeschlossen werden.

2) Der Antworttext SOLLTE genügend Informationen enthalten, damit der Benutzer die Ursache des Konflikts erkennen kann.

Da also Änderungen an unveränderbaren Eigenschaften ein Problem mit dem Status der Ressource sind, scheint HTTP 409 zu gelten.

Für die Kommunikation des Problems mit dem Client scheint die Anleitung darin zu bestehen, Details in den Antworttext aufzunehmen.

Sie könnten auch die Änderbarkeit von Eigenschaften in der Repräsentation selbst (auf der GET) kommunizieren. Beispielsweise.

<MyObject> 
    <Foo>17</Foo> 
    <Bar readOnly="true">22</Bar> 
    .... 
+0

Ich denke, das ist wahrscheinlich der Weg zu gehen: Wenn sie versuchen, die unveränderliche Eigenschaft zu ändern, dann ist es ein 409; Wenn sie es in Ruhe lassen, nehmen wir es von ihnen zurück und legen es still weg. Der Endstatus entspricht ihren Erwartungen und die Eigenschaft bleibt schreibgeschützt. – ehdv

2

Sie könnten die Antworten Ihrer API so entwerfen, dass die schreibgeschützten Eigenschaften tatsächlich von den änderbaren Eigenschaften getrennt sind. Zum Beispiel:

{ 
    id: 42, 
    status: "terrific", 
    properties: { 
     // mutable properties here 
    } 
} 

Ich habe beide geschrieben und APIs konsumiert, die dies tun, und es ist gut gelungen.

+5

Ich wäre besorgt über diesen Ansatz, da es eine Eigenschaft des Eigentums in die Hierarchie einfügt. Außerdem könnte sich die Änderbarkeit ändern, beispielsweise wenn ein Teil einer Ressource aus irgendeinem Grund vorübergehend gesperrt wurde. – ehdv

1

Verwenden Sie HTTP PATCH mit JSON-Patch-Dokumenten - damit können Sie genau die Eigenschaften festlegen, die Sie ändern möchten. Siehe http://tools.ietf.org/html/rfc6902.

Aber es ist nichts falsch daran, sowohl unveränderliche als auch veränderbare Elemente zurückzugeben. Der Server ist frei, zu ignorieren, an was auch immer er nicht Änderungen vornehmen möchte. Ich habe eine ausführliche Diskussion zu diesem Thema hier geschrieben: http://soabits.blogspot.dk/2013/01/http-put-patch-or-post-partial-updates.html

+1

_ "Mit [HTTP PATCH] können Sie genau die Eigenschaften bestimmen, die Sie ändern möchten." _ Klar, aber das hilft dem Kunden nicht zu wissen, welche Eigenschaften änderbar sind und welche nicht, und ich denke wirklich nicht Ihr Blogbeitrag ist ein überzeugendes Argument dafür, dass es in Ordnung ist, alles zu ignorieren, was nicht geändert werden soll. Ich sage nicht, dass Sie falsch liegen, ich denke nur, dass Sie einige Behauptungen nicht unbedingt gerechtfertigt haben. –

+0

Das Patchen an sich teilt dem Client nicht mit, welche Felder er ändern kann. Dies würde in der ursprünglichen Darstellung ein Hypermedia-Element erfordern: ein "Form" -Element, das erklärt, welche Felder unveränderlich sind und welche nicht. Wenn sich die Menge der unveränderlichen Felder zur Laufzeit ändert, dann ist das die einzige Lösung, die ich sehen kann. Wenn die Menge der unveränderlichen Felder festgelegt ist, sehe ich kein Problem damit, dass der Client mit diesem Wissen fest codiert ist. In einem größeren Maßstab jedoch ist Hypermedia der Weg zu gehen: Dies wird Client-Server-Kopplung zu lockern und ermöglichen den Server im Laufe der Zeit zu entwickeln, ohne die Clients zu brechen. –

+0

Und wenn wir der Antwort hypermediale Elemente hinzufügen, dann wird es noch seltsamer, alles zurückzuschieben. Ich meine, warum sollten Form (und Link) Elemente zurück zum Server PUT (sie sind sicherlich unveränderlich)? Was, würde ich behaupten, spricht für PATCH (wie auch für traditionelle POST mit x-www-form-urlencodierten Schlüssel/Wert-Paaren oder JSON ... aber dann wird die NULL-Behandlung zu einem Problem, wie ich im Blogpost argumentierte). –