考虑这种情况
GET /api/users(?include=custom_fields) - returns an array of users, optionally including relations as nested properties
GET /api/users/1(?include=custom_fields) - returns a single user object
POST /api/users - creates a new user (if the request includes an array of "custom_fields" these are created and linked)
PUT /api/users/1 - replaces user entity with supplied payload
PATCH /api/users/1 - updates the user properties provided
DELETE /api/users/1 - deletes
GET /api/users/1/custom_fields - gets all users custom_fields
PUT /api/users/1/custom_fields - deletes all existing custom_fields and creates ones provided
PATCH /api/users/1/custom_fields - appends if not exists, or creates new custom fields for this user
DELETE /api/users/1/custom_fields - deletes all custom fields for user
DELETE /api/users/1/custom_fields/{id} - deletes custom field for use by id.
这一切对我来说都很有意义并且按预期工作,但是我现在在我的管理区域中实现了“用户编辑”屏幕,这显示了用户对象和自定义字段。
现在我可以看到保存此表单的唯一RESTFUL方式是:
PATCH到/ api / users / {id}
保存用户。当那样做的时候,
PUT到/ api / users / {id} / custom_fields
更新自定义字段。
不理想但会起作用,但是我知道肯定会有其他相关资源,如用户角色,电子邮件等。
这并没有改变这种情况,只是意味着更多的终点。
这件事对我来说有些气味。简单地保存用户即时必须向至少两个端点发出请求。如果没有两个不同的请求,你会建议如何处理这个问题?
答案 0 :(得分:1)
最简单的解决方案是将所有这些(自定义字段,角色等)包含在User
表示中,您似乎已经在GET
和{{1}上执行此操作}。只需将其扩展到POST
和PUT
。
如果您已经在用户上为PATCH
方法支持了一些media-type
,那么您可以设想扩展它以定义添加/删除自定义字段,角色,以及您需要的任何内容。