Beim Entwurf einer API haben wir uns die Frage gestellt, ob eine PUT-Payload die ID der zu aktualisierenden Ressource enthalten soll.
Dies ist, was wir derzeit haben:
PUT /users/123 Payload: {name: "Adrian"}
Unser Routencode extrahiert die ID aus der URI und fährt mit der Aktualisierung fort.
Die ersten Benutzer unserer API fragen sich, warum wir keine ID in der Nutzlast zulassen:
PUT /users/123 Payload: {id: 123, name: "Adrian"}
Der Grund, warum wir dies nicht zugelassen haben, ist, dass die ID in der Nutzlast und im URI dupliziert ist.
Wenn wir uns das genauer überlegen, verknüpfen wir die Ressource mit dem URI.
Wenn der URI nicht über die ID verfügt, muss die Nutzlast geändert werden:
PUT /no/id/here Payload: {name: "Adrian"} < What user???
Gibt es Gründe, dies nicht zu tun?
/users
(keine Notwendigkeit, 'neu' hinzuzufügen).Die Antwort auf diese Frage hängt davon ab, ob der Client die ID ändern darf.
Wenn der Client die ID über einen PUT ändern kann, ändert sich der URI für die Ressource, und Sie sollten einen Wert 301 dauerhaft verschoben angeben, wenn eine Ressource auf den alten URI zugreift.
So beginnt man zum Beispiel mit einer Ressource bei
und der Client PUT das Folgende auf die Ressource
Die Ressource wurde aktualisiert und ihr URI ist jetzt
Das
Location
Feld in der PUT-Antwort sollte den neuen URI enthalten. Wenn Sie zu gehen,/users/123
sollten Sie eine301
Antwort erhalten, wobei das Feld Location auf die neue/users/222
Ressource verweist .In den meisten Fällen möchten Sie jedoch nicht, dass der Client die ID ändern kann, da dies sehr schnell zu Problemen führen kann. In diesem Fall kann die ID nur vom Server geändert werden. Sie sollten sie aus dem PUT-Body herausnehmen, da der Client diesen Status nicht aktualisieren kann.
Wenn Sie eine Anforderung an einen anderen URI auf derselben Ressource eingeben, sagen Sie
Wenn diese Ressource dann nicht vorhanden ist, sollte der Server sie erstellen und währenddessen eine ID erstellen
quelle