您正在考虑数据模型,这很好。
与此相关的是,REST 没有指定或暗示数据模型必须完全去规范化。
通常,在获取资源时,您会收到一个信息包,其中还包括对其他相关资源的 URL 引用,例如产品图像。它还可以包括对产品类别、产品制造商等的引用。每个都可能是 URL,或者您可以从中派生 URL 的 ID。像这样的消息:
{
"id": 123456,
"description" : "Your basic paperweight",
"category" : { id: 17717, "name" : "Home furnishings" },
"manufacturer": { id : 78783, "name" : "Boeing" },
"price" : 1.99,
"imageId" : 109101
}
...可能暗示这样的 URL:
http://api.mycompany.com/product/123456
http://api.mycompany.com/category/17717
http://api.mycompany.com/manufacturer/78783
http://api.mycompany.com/image/109101
...并注意链接到资源的完整表示,如类别、制造商等,不会与原始资源一起传输。这是一个部分去规范化的数据模型。
关于您对 PUT 的评论:
这是一个见仁见智的问题,但是……对于许多开发人员 来说,允许通过 PUT 进行部分更新是完全可以接受的。因此,您可以在不指定所有内容的情况下更新资源;现有字段将保持不变。如果您选择此行为,则在处理边缘情况时可能会使您的(服务器端)代码复杂化。例如,客户如何指示他要擦除或删除字段?(传递 null 可能有效,但对于某些数据, null 是一个有意义的值。)
为什么要担心 PUT?如果您想要部分更新,很容易使用 POST,在查询参数中带有动词(例如,“partialUpdate”)。实际上,这就是 Roy Fielding 所倡导的,对我来说很有意义。
部分更新将是这样的:
POST /products/123456?action=partialUpdate
*headers*
{
"description" : "A fabulous paperweight designed in Sweden, now at a new low price." },
"price" : 1.78
}