2015-08-24 50 views
1

我正在设计一个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

如果所有部分t帽子用于构建笔记本电脑是预定义的(或者已经存在),最好只使用该部分的ID。因此,这将是:

POST /笔记本电脑

{ 
    "processorID": 123 
} 

为什么?因为这样您可以节省带宽并简化服务器端的验证。不是检查处理器的所有字段,只是检查是否存在给定ID的进程 - 如果不是409 CONFLICT应该返回。

如果您希望启用用户到创建笔记本电脑创建过程中的部件,则应发送特定部件的整个主体。然而,这不是一个好主意。在RESTful方法中,您应创建所有部分,然后创建一台笔记本电脑 - 指向上一段。

最重要的是以一致的方式设计API - 在所有端点中都采用相同的方式。

现在,当谈到返回笔记本电脑时,最好只返回ID。这种方法将与创建新实体(仅发送ID)兼容,但带宽参数可能有点误导 - 客户需要提出多个请求以获取所有部分的详细信息。所以..在这种情况下,我将添加名为format的查询参数,它接受两个值SIMPLE(默认)和EXTENDED。如果只传递SIMPLE则返回ID是否EXTENDED通过则返回整个实体。

相关问题