如何构建RESTful API以部分更新大型资源

时间:2014-02-10 05:55:02

标签: http rest spring-mvc

我正在构建订购服务并坚持更新方案。

我已经公开了一个用于下订单的POST URI:

Request:
POST /orders
Host: 127.0.0.1:9999

假设订单包含大量信息。例如,订单有两个备注,一个用于客户,一个用于员工。如何构建RESTfule api以进行更新?以下是我可能遇到的解决方案:

:一种。客户端检索整个订单表示并使用PUT / POST更新整个资源

1.当客户想要修改客户备注时,请使用

GET /orders/{orderId}
Host: 127.0.0.1:9999

在客户端检索订单资源:

{orderId:1234,
 ............,
 customerRemark:'Red color is prefered',
 staffRemark:'Some internal business process tips'}

2。更新客户端上的订单资源,然后使用:

发布/放置它
 POST/PUT /orders/{orderId}
 Host: 127.0.0.1:9999
 BODY:{order represenetation modified}

但这有点不方便,因为客户更新客户备注(b2c网站)并不关心员工备注(这是后台系统的关注点),反之亦然。

B.分成较小的资源

1.Split客户评论和员工评论作为订单的单独子资源:

GET /orders/{orderId}/remark/customer
Host: 127.0.0.1:9999    

GET /orders/{orderId}/remark/Staff
Host: 127.0.0.1:9999    

2.使用POST / PUT单独更新它们:

PUT /orders/{orderId}/remark/customer
Host: 127.0.0.1:9999    

PUT /orders/{orderId}/remark/Staff
Host: 127.0.0.1:9999

此解决方案可以充分利用HTTP动词(即如果客户想要删除备注,请使用DELETE),但它也是一种因为备注不是实体而只是域中的值。

哪一个更好?或者还有其他解决方案吗?

1 个答案:

答案 0 :(得分:1)

这个场景中有一个HTTP动词PATCH

如果您想坚持使用更常见的动词,请执行/orders/{orderId}的POST。确实如果你遵循HTTP的意图,你应该只使用PUT来完成资源替换。在POST到资源时,你可以做任何你想要的事情,所以可以用于部分更新。

如果它们对您的应用程序有意义,请使用子资源,而不仅仅是方便的部分更新黑客。