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

在一个请求中创建多个项的RESTful方法,rest,post,Rest,Post,我正在开发一个小型客户机-服务器程序来收集订单。我想以一种“休息(充分)的方式”来做这件事 我想做的是: 收集所有订单行(产品和数量),并将完整的订单发送到服务器 目前,我有两种选择: 将每个订单行发送到服务器:POST数量和产品id 实际上我不想这样做,因为我想限制对服务器的请求数量,因此选项2: 收集所有订单行并立即将其发送到服务器 我应该如何实现选项2?我有几个想法: 将所有订单行包装在JSON对象中,并将其发送到服务器或使用数组发布订单行 实施方案2是一个好主意还是一个好做法,如果是,我

我正在开发一个小型客户机-服务器程序来收集订单。我想以一种“休息(充分)的方式”来做这件事

我想做的是:

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

目前,我有两种选择:

  • 将每个订单行发送到服务器:POST数量和产品id
  • 实际上我不想这样做,因为我想限制对服务器的请求数量,因此选项2:

  • 收集所有订单行并立即将其发送到服务器
  • 我应该如何实现选项2?我有几个想法: 将所有订单行包装在JSON对象中,并将其发送到服务器或使用数组发布订单行

    实施方案2是一个好主意还是一个好做法,如果是,我应该如何做


    什么是良好实践

    您不想发送100条订单行的HTTP头。您既不想生成任何超出需要的请求

    将一个JSON对象中的整个订单发送到服务器:server/order或server/order/new。 返回指向以下内容的内容:服务器/order/order\u id


    也可以考虑用“创建放”代替“< / P > > p>您的想法对我来说是有效的。实现取决于您的喜好。您可以使用JSON或仅使用参数(“order_lines[]”数组)并执行以下操作

    由于您要在单个操作(订单及其行)中一次创建更多资源,因此必须验证每个资源,并仅在所有资源都通过验证时保存它们,也就是说,您应该在事务中进行验证

    尽管批量操作(例如批量创建)在许多系统中都是必不可少的,但RESTful体系结构风格并未正式解决这些操作

    我发现按照您的建议发布一个集合基本上是有效的,但是当您需要报告失败以响应这样的请求时,就会出现问题。当由于不同原因发生多个故障或服务器不支持事务时,此类问题会更严重。
    我的建议是,如果没有性能问题,例如,当服务提供商位于LAN(而不是WAN)上或数据相对较小时,向服务器发送100个POST请求是值得的。保持简单,从单独的请求开始,如果您有性能问题,请尝试优化。

    我想最好在内部发送单独的请求。当然,您的web服务器应该支持它

    我最近一直在努力解决这个问题,下面是我正在努力的方向

    如果添加多个资源的帖子成功,则返回200 OK(我考虑使用201,但用户最终不会访问已创建的资源)以及一个页面,该页面以只读或可编辑的方式显示已添加的所有资源。例如,用户能够使用仅包含单个文件输入的表单选择多个图像并将其发布到图库。如果POST请求全部成功,则会向用户提供一组用于创建的每个图像资源表示的表单,允许用户指定每个图像资源表示的更多详细信息(名称、描述等)


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

    Facebook解释了如何执行此操作:

    简单批处理请求

    批处理API接收所表示的逻辑HTTP请求数组 作为JSON数组-每个请求都有一个方法(对应于HTTP) 方法GET/PUT/POST/DELETE等),一个相对的url( graph.facebook.com之后的URL),可选标题数组(对应 到HTTP头)和可选正文(用于POST和PUT请求)。这个 批处理API返回一个逻辑HTTP响应数组,表示为 JSON数组-每个响应都有一个状态代码、一个可选的头 数组和可选的正文(这是一个JSON编码的字符串)


    我相信另一个正确的方法是创建另一个代表您的资源集合的资源。 例如,假设我们有一个像
    /api/sheep/{id}
    这样的端点,我们可以发布到
    /api/sheep
    来创建sheep资源

    现在,如果我们想支持批量创建,我们应该考虑在<代码> /API/FLUK< /COD>(或者,如果代码缺少一个更好的有意义的名称),或者一个新的群集资源(或者<代码> /API/-集合< /代码>)。请记住,资源不需要映射到您的数据库或应用程序模型。这是一种常见的误解

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


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

    我认为他使用了HTTP POST方法。没有创建HTTP方法这样的东西,不是吗?哦,等等,没有。而是PUT。你究竟为什么要用PUT来创建内容?这正是HTTP POST方法的用途。当您希望客户端指定资源的URI时,可以使用PUT创建资源,就像在webdav中一样。我不同意海报使用PUT,但它在创建资源方面有一定的位置,尽管该位置的范围可能有限。注意:发布实体应导致该实体成为请求中所述资源的从属实体,并且不是幂等的。PUT替换地址处的实体,并且是幂等的。幂等性(word?)是消费者的一个重要期望。你找到了一个这样的期望吗
    POST /orders