RESTful创建对象图

时间:2013-03-11 07:25:17

标签: api rest api-design

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

订单(主要对象)

  • 有很多地址
  • 包含许多订单行项目(订单包括哪些内容)
  • 有很多付款
  • 有很多联系信息

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

设计API有两种选择:

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

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

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

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

处理这个问题的RESTful +实用方法是什么?

2 个答案:

答案 0 :(得分:1)

我如何处理这是第一种方式。您不应该假设客户端将提供所需的所有请求。在一个请求上创建所有实体。

根据您的使用案例,您可能还希望在创建实体时强制执行“全有或全无”方法;也就是说,如果出现问题,一切都会回滚。您可以通过在数据库上使用事务来完成此操作(如果所有操作都通过单独的请求完成,您也无法执行此操作)。确定这是否是您想要的行为是非常特定于您的情况。例如,如果您要创建订单声明,您可以使用它(您不想创建缺少订单的订单),但是如果您要上传照片则可能没问题。

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

答案 1 :(得分:0)

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

  

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

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