1

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

订单(主要对象)

  • 拥有多个地址
  • 有许多订单行项目(订单由什么组成)
  • 有多次付款
  • 有很多联系信息

Order 资源通常与它的关联一起有意义。孤立地看,它只是一个没有商业意义的愚蠢容器。但是,每个关联对象都有自己的生命,可能需要独立操作,例如。编辑订单的送货地址,更改订单的联系信息,在下订单后从订单中删除订单项等。

设计 API 有两种选择:

  • Order API 端点通过处理发送到的内容中的“嵌套资源”智能地创建自己及其关联的资源POST /orders
  • Order 资源只创建自己,客户端必须向新创建的端点发出后续 POST 请求,例如POST /orders/123/addresses,PUT /orders/123/line-items/987等。

虽然第二个选项在服务器端实现起来更简单,但它让客户端为 80% 的用例做额外的工作。

第一个选项有以下悬而未决的问题:

  • 如何传达新创建资源的 URL?标Location头只能传达一个 URL,但是服务器可能会创建多个资源。
  • 如何处理错误?如果其中一个关联有错误怎么办?我们是否拒绝整个对象图?该错误是如何传达给客户的?

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

4

2 回答 2

1

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

根据您的用例,您可能还希望在创建实体时强制执行“全有或全无”方法;即,如果有东西掉下来,一切都会回滚。您可以通过在数据库上使用事务来做到这一点(如果一切都通过单独的请求完成,您也无法做到这一点)。确定这是否是您想要的行为取决于您的具体情况。例如,如果您正在创建一个订单声明,您可以使用它(您不想创建缺少物品的订单),但是如果您正在上传照片,它可能没问题。

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

于 2013-03-12T00:20:20.497 回答
0

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

如何传达新创建资源的 URL?标Location头只能传达一个 URL,但是服务器可能会创建多个资源。

这将与您links在案例中与其他资源通信的方式相同GET。使用link元素或您的方法是将资源的 URL 嵌入到表示中。

于 2013-03-11T09:07:27.303 回答