在一个请求中创build多个项目的RESTful方法

我正在一个小客户服务器程序来收集订单。 我想以“rest(完全)”的方式做到这一点。

我想要做的是:

收集所有的订单(产品和数量),并将完整的订单发送到服务器

目前我看到两个select来做到这一点:

  1. 将每个订单发送到服务器:POST qty和product_id

我其实不想这样做,因为我想限制服务器的请求数量,所以选项2:

  1. 收集所有的订单,并立即发送到服务器。

我应该如何执行选项2? 我有几个想法是:将所有订单行包装在JSON对象中,并将其发送到服务器或使用数组来发布订单。

实施scheme2是一个好主意还是好的做法,如果是的话,我该怎么做。

什么是好的做法?

我相信另一个正确的方法是创build另一个资源来代表你的资源集合。 例如,假设我们有一个像/api/sheep/{id}这样的端点,我们可以将这个端点传递给/api/sheep来创build一个绵羊资源。

现在,如果我们想支持批量创build,我们应该在/api/flock (或/api/<your-resource>-collection如果缺less一个更好的有意义的名称)考虑新的flock资源。 请记住, 资源不需要映射到您的数据库或应用程序模型 。 这是一个常见的误解。

资源是更高层次的表示,与您的数据无关。 对资源进行操作可能会产生重大的副作用,如向用户发出警报,更新其他相关数据,启动长期存在的进程等。例如,我们可以将文件系统甚至UNIX命令映射为REST API 。

我认为可以肯定的是,运营资源也可能意味着创build其他几个实体作为副作用。

尽pipe批量操作(例如批量创build)在许多系统中都是必不可less的,但它们并没有通过RESTful架构风格正式解决。

我发现按照您的build议发布一个集合基本上可行,但是当您需要报告失败以响应这样的请求时会出现问题。 当不同的原因发生多个故障或服务器不支持事务时,这样的问题会变得更糟。 我的build议是,如果没有性能问题,例如当服务提供商在LAN(而不是WAN)上,或者数据量比较小时,发送100个POST请求到服务器是值得的。 保持简单,从单独的请求开始,如果你有性能问题,尝试优化。

Facebook解释如何做到这一点: https : //developers.facebook.com/docs/graph-api/making-multiple-requests

简单的批量请求

批处理API接受以JSON数组表示的逻辑HTTP请求数组 – 每个请求都有一个方法(对应于HTTP方法GET / PUT / POST / DELETE等),relative_url(graph.facebook之后的URL部分)。 com),可选头数组(对应于HTTP头)和可选主体(用于POST和PUT请求)。 批API返回一个逻辑HTTP响应数组,表示为JSON数组 – 每个响应都有一个状态码,一个可选的标题数组和一个可选的正文(这是一个JSON编码的string)。

你的想法似乎对我有效。 执行是您的偏好问题。 你可以使用JSON或只是参数(“order_lines []”数组),并做

 POST /orders 

既然你要一次创build更多的资源(顺序和行),validation每一个都是至关重要的,并且只有当它们全部通过validation时,才能保存它们。 你应该做一个交易。

我想最好在单个连接中发送单独的请求。 当然,你的networking服务器应该支持它

其实我最近还在摔跤,这就是我正在努力的方向。

如果添加多个资源的POST成功,则返回一个200 OK(我正在考虑一个201,但用户最终没有login创build的资源)以及显示所有已添加资源的页面只有或可编辑的时尚。 例如,用户能够使用仅包括单个文件input的表单来select多个图像并将其张贴到图库。 如果POST请求完全成功,则向用户呈现创build的每个图像资源表示的一组表单,允许他们指定关于每个(名称,描述等)的更多细节。

在创build一个或多个资源失败的情况下,POST处理程序将中止所有处理,并将每个单独的错误消息附加到一个数组。 然后,返回一个419冲突,并将用户路由到显示错误数组内容的419冲突错误页面,以及回到提交的表单的方式。

我相信Pipelining是你需要的答案,这在之前的评论“单一连接”中有描述。

您不会希望发送100个订单项的HTTP标头。 你既不想产生更多的需求。

将一个JSON对象中的整个订单发送到服务器:server / order或server / order / new。 返回一些指向:server / order / order_id

另外考虑使用CREATE PUT而不是POST