我正试图围绕如何设计RESTful API来创建对象图。例如,考虑一下eCommerce API,其中资源具有以下关系:
订单(主要对象)
Order资源通常与它的关联一起有意义。孤立地说,它只是一个没有商业意义的愚蠢容器。然而,每个相关对象都具有它自己的生命,并且可能需要独立操作,例如。编辑订单的送货地址,根据订单更改联系信息,从放置后的订单中删除订单项等等。
设计API有两种选择:
POST /orders
的内容中的“嵌套资源”智能地创建自身及其关联资源POST /orders/123/addresses
,PUT /orders/123/line-items/987
等。虽然第二个选项在服务器端更容易实现,但它使客户端为80%的用例做了额外的工作。
第一个选项有以下未解决的问题:
Location
标头只能传递一个URL,但服务器可能会创建多个资源。处理这个问题的RESTful +实用方法是什么?
答案 0 :(得分:1)
我如何处理这是第一种方式。您不应该假设客户端将提供所需的所有请求。在一个请求上创建所有实体。
根据您的使用案例,您可能还希望在创建实体时强制执行“全有或全无”方法;也就是说,如果出现问题,一切都会回滚。您可以通过在数据库上使用事务来完成此操作(如果所有操作都通过单独的请求完成,您也无法执行此操作)。确定这是否是您想要的行为是非常特定于您的情况。例如,如果您要创建订单声明,您可以使用它(您不想创建缺少订单的订单),但是如果您要上传照片则可能没问题。
为了返回到客户端的链接,我总是返回一个JSON对象。您可以使用指向所创建的每个资源的链接轻松填充此对象。通过这种方式,客户可以确定成功发布后的行为方式。
答案 1 :(得分:0)
这两个选项都可以实现RESTful。你问:
如何传达新创建资源的URL?
Location
标头只能传递一个URL,但服务器可能会创建多个资源。
这与将links
传递给GET
案例中的其他资源的方式相同。使用link
元素或您的方法将资源的URL嵌入到表示中。