Update eine einzelne Eigenschaft in einer REST-API
In der Gestaltung einer neuen API, wir tun unser bestes, um zu Folgen dem Muster aufgebaut, durch REST. Die Frage die ich habe ist die beste Methode zu Folgen, wenn Sie versuchen zu aktualisieren, eine einzelne Eigenschaft. Zum Beispiel:
Stellen Sie sich vor Sie haben ein einfaches Auto-Ressource:
{
"make": "Chevrolet",
"model": "Chevelle",
"year": 1966,
"color": "black",
"for_sale": true
}
Angenommen, dass die Eigenschaft for_sale
ist etwas, das Sie erwarten, wird regelmäßig durch den Anwender. Ich habe ein paar Optionen:
-
PUT
die gesamte Ressource mitfor_sale
eingestelltfalse
. Für eine relativ kleine Ressource, diese scheint in Ordnung, doch in den meisten Fällen unsere Ressourcen sind ziemlich groß, sodass eine Menge von Abfällen in den Versand die gesamte Ressource zu aktualisieren einzelner, oft geänderten Eigenschaft. -
POST
und führen eine teilweise Aktualisierung durch nur darunter, um das element zu aktualisieren, wie etwa:
{"for_sale":false}
Dies ist besser, als es erfordert viel weniger Aufwand.
Aber ich habe irgendwie scheinen die zu sein, erreichen für etwas, was noch einfacher ist, aber ich kann nicht scheinen, um herauszufinden, der richtige Ansatz. Es wäre Recht bequem, bieten eine einfache PUT
an eine URL (nicht erforderlich ist, jeden Wunsch Körper) zu aktualisieren diese Eigenschaft. Ich sehe, was Google tut in Ihrer API um dies zu erreichen, aber es fühlt sich nur ein bit-RPC-ish, obwohl ich mag die Einfachheit.
POST
/blogs/blogId/posts/postId/comments/commentId/approve
(markiert einen Kommentar als nicht-spam)
POST
/blogs/blogId/posts/postId/comments/commentId/spam
(markiert einen Kommentar als spam)
Kann jemand bieten einige Ratschläge, die beste Art und Weise zu nähern, die Aktualisierung einer einzelnen Immobilie innerhalb einer Ressource (auf möglichst leichte Art und Weise), dass gefolgt, der REST-Prinzipien? Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eigentlich, denke ich, dass die PATCH-Methode ist speziell für diesen Zweck konzipiert. Sie sollten es verwenden, um ein partielles update auf das Objekt, sondern als ein full-update. Hier ist ein blog-Eintrag erklärt, dass dies in mehr detail.
Wie Sie erwähnt haben, das ist :
PUT
die gesamte Ressource mit for_sale auf false gesetzt. Für eine relativ kleine Ressource, diese scheint in Ordnung, doch in den meisten Fällen unsere Ressourcen sind ziemlich groß, sodass eine Menge von Abfällen in den Versand die gesamte Ressource zu aktualisieren einzelner, oft geänderten Eigenschaft.Wahr ist, ist also für diese Art von Szenarien werde ich vorschlagen, die folgenden Ansatz :
URI sollte so etwas wie dieses :
POST /api/cars/C1234
Request Body:
{"for_sale":false}
Da nicht alle web-Server (und vergessen clients) - Unterstützung
PATCH
also Menschen wurden mit Unterstützung sowohl für partielle updates mit POST:Dies ist wieder nicht perfekt, RESTful API-design, aber ich habe gesehen, und dieses gefolgt als best practice.
POST
IMO nicht gemeint ist, für ein update an alle. Es ist gut für das erstellen von Sachen und sendet einige RPC -, DDD-Stil-Befehle wie/api/cars/1/sell
. Ihre Lösung sieht eher aus wie ein hack.