140

I am working on a small client server program to collect orders. I want to do this in a "REST(ful) way".

What I want to do is:

Collect all orderlines (product and quantity) and send the complete order to the server

At the moment I see two options to do this:

  1. Send each orderline to the server: POST qty and product_id

I actually don't want to do this because I want to limit the number of requests to the server so option 2:

  1. Collect all the orderlines and send them to the server at once.

How should I implement option 2? a couple of ideas I have is: Wrap all orderlines in a JSON object and send this to the server or use an array to post the orderlines.

Is it a good idea or good practice to implement option 2, and if so how should I do it.

What is good practice?

4

7 回答 7

89

我相信解决此问题的另一种正确方法是创建另一个代表您的资源集合的资源。例如,假设我们有一个类似的端点/api/sheep/{id},我们可以 POST/api/sheep来创建一个绵羊资源。

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

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

我认为可以安全地假设操作资源也可能意味着创建其他几个实体作为副作用。

于 2015-11-17T22:20:25.060 回答
55

尽管批量操作(例如批量创建)在许多系统中是必不可少的,但它们并没有被 RESTful 架构风格正式解决。

我发现按照您的建议发布集合基本上可以工作,但是当您需要报告失败以响应此类请求时会出现问题。当由于不同原因发生多个故障或服务器不支持事务时,此类问题会更​​严重。我给你的建议是,如果没有性能问题,比如服务商在局域网(不是广域网)或者数据比较少的时候,向服务器发送 100 个 POST 请求是值得的。保持简单,从单独的请求开始,如果您遇到性能问题,请尝试优化。

于 2009-01-08T19:40:33.940 回答
10

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)、可选的 headers 数组(对应于 HTTP 头)和一个可选的 body(用于 POST 和 PUT 请求)。Batch API 返回表示为 JSON 数组的逻辑 HTTP 响应数组 - 每个响应都有一个状态代码、一个可选的 headers 数组和一个可选的 body(它是一个 JSON 编码的字符串)。

于 2014-09-16T19:18:45.123 回答
8

你的想法对我来说似乎有效。实施取决于您的偏好。您可以为此使用 JSON 或仅使用参数(“order_lines []”数组)并执行

POST /orders

由于您将在单个操作(订单及其行)中一次创建更多资源,因此验证每一个资源并仅在所有资源都通过验证时才保存它们至关重要,即。你应该在交易中做到这一点。

于 2009-01-04T20:23:09.583 回答
7

我最近实际上一直在努力解决这个问题,这就是我正在努力的方向。

如果添加多个资源的 POST 成功,则返回 200 OK(我正在考虑 201,但用户最终不会登陆已创建的资源)以及显示已添加的所有资源的页面,无论是读取- 仅或可编辑的时尚。例如,用户能够使用仅包含单个文件输入的表单来选择多个图像并将其发布到画廊。如果 POST 请求完全成功,则为用户提供一组用于创建的每个图像资源表示的表单,允许他们指定有关每个图像资源的更多详细信息(名称、描述等)。

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

于 2013-10-24T15:40:50.020 回答
6

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

于 2009-06-25T00:10:15.333 回答
-3

您不会希望发送 100 个订单行的 HTTP 标头。您既不想生成任何不必要的请求。

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

还可以考虑使用CREATE PUT 而不是 POST

于 2009-01-04T20:04:14.940 回答