Restful设计支持bulkcreate吗?

Restful设计支持bulkcreate吗?,rest,restful-architecture,Rest,Restful Architecture,我有一个api让用户添加一本书http://127.0.0.1/book 如果用户希望一次创建100本书怎么办 我找到了一些讨论 LiorH说: Although bulk operations (e.g. batch create) are essential in many systems, they are not formally addressed by the RESTful architecture style. 这是一个宁静的设计建议吗 我喜欢一次发布一个项目 但我的搭档希

我有一个api让用户添加一本书
http://127.0.0.1/book

如果用户希望一次创建100本书怎么办

我找到了一些讨论
LiorH
说:

Although bulk operations (e.g. batch create) are essential in many systems,  
they are not formally addressed by the RESTful architecture style.
这是一个宁静的设计建议吗

我喜欢一次发布一个项目
但我的搭档希望一次创建所有内容
我认为,如果其中一些格式有效,而另一些格式无效,那么一次创建全部将出现问题

我想确保REST讨论的是交换您关心的事物的表示。如果您关心书籍集,那么为其创建一个表示,并允许客户端发布它们

这些服务中最棘手的部分总是响应,因为通常的模式是在
POST
ing一个资源之后,您的响应是或重定向到新创建的资源的URI

但是,没有什么能阻止您使用URI列表进行响应,这意味着
POST
ing一组书籍的结果就是一组已创建的资源

然而,这里有一个很大的警告,那就是失败语义。如果只创作了一些书,会发生什么?有没有可能只有一些书被创建,然后客户必须处理这些?这就是事情变得相当棘手的地方,这就是为什么很多人试图避免这样做的原因。从根本上说,它没有什么问题,但它使API变得复杂了很多,性能提升可能比人们想象的要小


你为什么不能一次创作一本书呢?我建议让API尽可能简单,除非你有令人信服的理由让它变得更复杂。

REST讨论了交换你关心的事物的表示。如果您关心书籍集,那么为其创建一个表示,并允许客户端发布它们

这些服务中最棘手的部分总是响应,因为通常的模式是在
POST
ing一个资源之后,您的响应是或重定向到新创建的资源的URI

但是,没有什么能阻止您使用URI列表进行响应,这意味着
POST
ing一组书籍的结果就是一组已创建的资源

然而,这里有一个很大的警告,那就是失败语义。如果只创作了一些书,会发生什么?有没有可能只有一些书被创建,然后客户必须处理这些?这就是事情变得相当棘手的地方,这就是为什么很多人试图避免这样做的原因。从根本上说,它没有什么问题,但它使API变得复杂了很多,性能提升可能比人们想象的要小

你为什么不能一次创作一本书呢?我建议让API尽可能简单,除非你有令人信服的理由让它更复杂。

我喜欢文章中描述的方法。我将根据您的背景总结主要观点。尽管如此,我还是建议阅读全文:

要求 通常,使用
POST
方法将单个元素添加到集合中。因此,我们可以有一个资源,它可以为其方法同时接受单个元素和元素集合。根据输入有效负载,处理检测是否必须进行单个或批量添加

事实上,在资源路径(如
/books/bulk
)中使用操作名称的另一个资源并不是真正的RESTful,因此这不是正确的方法

创建单个元素时,我们可以有如下内容:

POST /books
Content-Type: application/json
{
    "title": "The Lord of the Rings - The Fellowship of the Ring",
    "author": "J. R. R. Tolkien",
    (...)
}
以及在批量操作的情况下:

POST /books
Content-Type: application/json
[
    {
        "title": "The Lord of the Rings - The Fellowship of the Ring",
        "author": "J. R. R. Tolkien",
        (...)
    },
    {
        "title": "The Lord of the Rings - The Two Towers",
        "author": "J. R. R. Tolkien",
        (...)
    },
    (...)
]
回应 创建单个元素时,响应非常简单,通常包含两个内容:

  • 状态代码
    201
    (已创建)
  • 标题
    位置
    包含新创建元素的URL
位置
标题接受一个值,可以在响应中定义一次。 也就是说,由于
POST
方法的语义取决于RESTful服务设计器,因此我们可以利用头
链接
来提供此提示,如下所述:

201 Created
Link: <http://example.com/api/book/{id}>, <http://example.com/api/book/{id}>
在插入错误的情况下:

500 Internal Server Error
Content-type: application/json
[
    {
        "index": 1,
        "messages": [
            "The book can't be added because of the error #22 (description)"
        ]
    },
    (...)
]
对于非事务处理,响应的状态代码将始终为
200
,如果有错误,将在响应负载中描述,如下所示:

200 OK
Content-type: application/json
[
    {
        "index": 1,
        "status": "error",
        "messages": [
            "The book can't be added because of the error #22 (description)"
        ]
    },
    {
        "index": 2,
        "status": "success",
        "auto-generated-id": "43"
    },
    (...)
]
正如文章中所描述的那样,我喜欢这家公司的做法。我将根据您的背景总结主要观点。尽管如此,我还是建议阅读全文:

要求 通常,使用
POST
方法将单个元素添加到集合中。因此,我们可以有一个资源,它可以为其方法同时接受单个元素和元素集合。根据输入有效负载,处理检测是否必须进行单个或批量添加

事实上,在资源路径(如
/books/bulk
)中使用操作名称的另一个资源并不是真正的RESTful,因此这不是正确的方法

创建单个元素时,我们可以有如下内容:

POST /books
Content-Type: application/json
{
    "title": "The Lord of the Rings - The Fellowship of the Ring",
    "author": "J. R. R. Tolkien",
    (...)
}
以及在批量操作的情况下:

POST /books
Content-Type: application/json
[
    {
        "title": "The Lord of the Rings - The Fellowship of the Ring",
        "author": "J. R. R. Tolkien",
        (...)
    },
    {
        "title": "The Lord of the Rings - The Two Towers",
        "author": "J. R. R. Tolkien",
        (...)
    },
    (...)
]
回应 创建单个元素时,响应非常简单,通常包含两个内容:

  • 状态代码
    201
    (已创建)
  • 标题
    位置
    包含新创建元素的URL
位置
标题接受一个值,可以在响应中定义一次。 也就是说,由于
POST
方法的语义取决于RESTful服务设计器,因此我们可以利用头
链接
来提供此提示,如下所述:

201 Created
Link: <http://example.com/api/book/{id}>, <http://example.com/api/book/{id}>
在插入错误的情况下:

500 Internal Server Error
Content-type: application/json
[
    {
        "index": 1,
        "messages": [
            "The book can't be added because of the error #22 (description)"
        ]
    },
    (...)
]
对于非事务处理,状态代码为o