以RESTful方式更新集合

时间:2018-04-04 11:58:52

标签: rest api api-design

我的情况是我有类似购物车的东西。我有一组具有已知ID的产品,然后我想创建一个具有修改价格的子集,然后修改此子集

超集

[{  
   "productId":1,
   "price":1.99
},
{  
  "productId":2,
  "price":2.99
},
{  
  "productId":3,
  "price":3.99
},
{  
   "productId":4,
   "price":4.99
}]

...

修改后的子集

[{  
   "productId":1,
   "price":1.59
},
{  
  "productId":3,
  "price":2.59
}]

然后我想再次修改子集看起来像

[{  
   "productId":1,
   "price":1.79
},
{  
  "productId":2,
  "price":3.59
}]

我能想到的是客户端发送一个像

这样的POST请求
{  
   "productsAdded":[  
      {  
         "productId":2,
         "price":3.59
      }
   ],
   "productsModified":[  
      {  
         "productId":1,
         "price":1.79
      }
   ],
   "productsDeleted":[  
      {  
         "productId":3,
         "price":2.59
      }
   ]
}

约束是我想避免多次调用来纠正动词而不是发送整个子集。由于实际对象具有更多字段,并且子集中有数千个对象。然后更新保存状态触发器长时间运行并忘记任务。

我看到的问题是客户端可能需要创建一个delta 状态和服务器必须从消息中重建状态。

这可能不是一个坏方法,但我想知道是否有其他解决方案

2 个答案:

答案 0 :(得分:3)

  

以RESTful方式更新集合

Atom Publishing Protocol是围绕修改REST架构风格中的原子条目集合的想法而构建的。您可以从审查该设计开始。

  

我能想到的是客户端发送一个像

这样的POST请求

这非常接近JSON Patch代表。

这个想法是,如果客户端和服务器共享相同(通常是标准化的)对媒体类型的理解,那么即使它们是独立开发的,它们也可以继续协作。

因此,使用POST将更改的JSONPatch表示传递给资源是一个很好的起点;如果您不喜欢JSONPatch(可能因为它是域不可知的),您可以定义自己更具体的媒体类型并使用它。

(注意:虽然消息类型称为“补丁”,但实际上并不需要在API中使用PATCH method。POST本身,PATCH本身或两者都是可接受的替代方案。)

答案 1 :(得分:-1)

您提出的解决方案包含您提到的所有警告以及更多内容。建议:

  1. 使用独立请求单独修改每个对象 适当的HTTP动词POST,PUT,PATCH,DELETE。
  2. 使用以下命令返回要在服务器上处理的整个集合 适当的HTTP动词PUT。
  3. 使用适当的HTTP谓词PATCH返回要在服务器上处理的部分集合。
  4. 其他参考链接: