我正在设计一个REST服务,该服务需要创建一个引用其他各种项目作为子项的项目。该服务提供了检索可用子项的方法,这些方法可以作为键/值对绑定到下拉列表。我的问题是,在发布以创建新的顶级项目时,最佳做法是在字段中包含整个子项目,还是仅包含引用它的ID?
例如,如果我有一项服务使用户能够为笔记本电脑指定处理器和RAM。将有一个方法GET /processors
将返回将触发对象创建的处理器列表和POST /laptops
。下面两个有效载荷中的哪一个被认为是最佳做法?
POST /笔记本电脑
{
"processor": 123,
"ram" 16
}
POST /笔记本电脑
{
"processor": {"id":123, "manufacturer": "Intel", "model": "i5-4670k"}
"ram" 16
}
检索笔记本电脑时,我会返回以下内容:
GET /笔记本电脑
[{
"id:" 3000,
"processor": {"id":123, "manufacturer": "Intel", "model": "i5-4670k"}
"ram" 16
}]
答案 0 :(得分:0)
如果用于构建笔记本电脑的所有部件都已预先定义(或已经存在),则最好只使用部件的ID。所以它将是:
POST /笔记本电脑
{
"processorID": 123
}
为什么呢?因为这样可以节省带宽并简化服务器端的验证。您只需检查是否存在具有给定ID的进程,而不是检查处理器的所有字段,如果不存在,则应返回409 CONFLICT
。
如果您想在笔记本电脑创建期间让用户创建部件,则应发送特定部件的整个部分。然而,这不是一个好主意。在RESTful方法中,您应该创建所有部件,然后创建一个笔记本电脑 - 指向上一段。
最重要的是以一致的方式设计API - 在所有端点中使用相同的方式。
现在,在退回笔记本电脑时,最好只返回ID。这种方法将与创建新实体(仅发送ID)兼容,但带宽参数可能有点误导 - 客户端需要发出多个请求才能获得所有部分的详细信息。所以..在这种情况下,我将添加一个名为format
的查询参数,它接受两个值SIMPLE
(默认值)和EXTENDED
。如果传递SIMPLE
,则只返回ID,无论是否传递EXTENDED
,都会返回整个实体。