2013-03-11 75 views
1

我想围绕如何设计一个RESTful API来创建对象图形。例如,考虑一个电子商务API,在资源有以下关系:RESTful创建对象图形

订单(主要对象)

  • 具有一对多的地址
  • 具有一对多的订单行项目(哪些呢订单包括)
  • 具有一对多的付款
  • 具有一对多的联系方式

订单资源通常与其关联一起有意义。孤立地说,它只是一个没有商业意义的笨蛋容器。但是,每个关联对象都有自己的生命,可能需要独立操作,例如。编辑订单的送货地址,改变对一个订单的联系人信息,后从订单删除线项目已放置等

有两个选项用于设计API:

  • 的订单API端点智能地发送到POST /orders
  • 的订单资源只创建本身和客户端必须进行后续POST请求到新创建的端点内容处理“嵌套资源”创建本身及其相关资源,如POST /orders/123/addresses,PUT /orders/123/line-items/987,e tc

虽然第二个选项更容易在服务器端实现,但它使客户端为80%的用例做了额外的工作。

第一个选项有以下开放式问题:

  • 一个人如何沟通,为新创建资源的网址是什么? Location标题只能传递一个URL,但服务器可能会创建多个资源。
  • 如何处理错误?如果其中一个关联有错误会怎么样?我们拒绝整个对象图吗?这个错误如何传达给客户?

什么是RESTful +务实的方式来处理这个问题?

+0

“通常有意义”意味着订单*可以*在没有其他资源的情况下存在吗?方案2的两个步骤之间的资源是否处于无效状态? – 2013-03-11 07:39:10

+0

在创建订单时,80%的关联数据可用。但是,在20%的情况下,我们*可能*想要在DB中存储部分对象以在稍后阶段更新和处理。例如,我们可能想要跳过付款信息并稍后添加。 – 2013-03-11 07:50:00

回答

0

这两个选项都可以实现RESTful。你问:

如何沟通新创建的资源的URL? Location标题只能传递一个URL,但服务器可能会创建多个资源。

就可以这样做,你在GET情况沟通links s到其他资源的方式相同。使用link元素或者您的方法将资源的URL嵌入到表示形式中。

1

我如何处理这是第一种方法。您不应该假定客户会提出所有需要的请求。在一个请求上创建所有实体。

根据您的使用情况,您可能还希望在创建实体时实施“全有或全无”方法;即,如果某件事情下降,一切都会回滚。你可以通过在你的数据库上使用一个事务来做到这一点(如果所有事情都是通过不同的请求完成的,你也不能这样做)。确定这是否是您想要的行为对您的情况非常具体。例如,如果您正在创建一个订单声明,您可以使用此命令(您不想创建缺少项目的订单),但是如果您上传照片,它可能没有问题。

为了返回链接到客户端,我总是返回一个JSON对象。您可以使用指向每个创建资源的链接轻松填充此对象。通过这种方式,客户可以确定在成功发布后如何表现。

+0

有数据库事务的好处在那里,但是传递错误消息增加了复杂性。在对象图的特定对象中传递错误消息的RESTful方法是什么? – 2013-03-12 08:46:46

+0

只要你记录你的API的行为如何,它取决于你。也许在我提到的响应JSON对象中包含错误信息而不是链接? – 2013-03-12 16:23:27

+0

在RESTful API中是否存在返回错误的事实标准/约定?特别是当创建一个对象图失败时? – 2013-03-13 05:17:12