使用restful HTTP创建单个和多个资源

win*_*ngy 17 rest web-services http web

在我的API服务器中,我定义了此路由:

POST /categories
Run Code Online (Sandbox Code Playgroud)

要创建一个类别,您可以:

POST /categories {"name": "Books"}
Run Code Online (Sandbox Code Playgroud)

我想如果你想创建多个类别,那么你可以这样做:

POST /categories [{"name": "Books"}, {"name": "Games"}]
Run Code Online (Sandbox Code Playgroud)

我只是想确认这是Restful HTTP API的一个好习惯.

或者应该有一个

POST /bulk
Run Code Online (Sandbox Code Playgroud)

允许他们一次做任何操作(创建,阅读,更新和删除)?

Jus*_*ony 21

在真正的REST中,您可能应该在多个单独的调用中POST它.原因是每一个都会产生新的表示.你怎么能期望得到这个呢?

每个帖子都应返回结果资源位置:

POST -> New Resource Location
POST -> New Resource Location
...
Run Code Online (Sandbox Code Playgroud)

但是,如果您需要批量,则创建批量.尽可能保持教条,但如果没有,实用主义就能完成工作.如果你太依赖教条主义,那么你永远不会做任何事情.

这是一个类似的问题

这是一个建议使用HTTP Pipelining来提高效率的方法

  • +1"实用主义完成工作".我也在创建一个API,并且必须创建数千个资源,我认为批量创建会为每个资源打一个POST. (10认同)
  • 也为“如果你太沉迷于教条主义,那么你永远不会完成任何事情”+1。- 完全同意。 (2认同)

Don*_*ows 12

有一个批量操作,你POST,激活(它是非幂等的,所以POST是正确的动词)没有什么特别的错误,但有一些警告:

  • 您正在制作多个资源,因此您需要使用多个网址进行回复.这意味着您无法使用重定向模式:您必须以某种形式发回URL列表.

  • 您有一个问题,即批量操作通常不是很容易被发现.可发现性是RESTfulness最重要的事情之一,因为它意味着有人可以在没有服务器作者的大量帮助的情况下找到如何编写客户端.

  • 在进行批量操作时处理部分故障仍然存在问题.这也是任何其他范例的问题(当我使用SOAP的扩展时,我看到人们把它们绑在一起)所以这并不奇怪,但除非你能保证所有的创作都能奏效,否则你就是必须弄清楚当你制作一个资源而不能制作第二个资源时会发生什么.(另外,如果批量请求需要完成第三个请求,您会继续尝试吗?)

最简单的方法是每个请求支持一个创建; 这是一个更容易实现的模式,并且可以更好地理解.

  • 当您需要批量时,基本上会对您的系统进行 ddos​​ 攻击,是吗? (2认同)

fum*_*chu 5

用POST一次创建多个资源没有错(只是不要用PUT尝试)。它不是“ un-REST-ful”,特别是如果您为批量操作本身创建表示形式。建议您在创建单个资源的同时创建索引资源,并为其返回“ 303 See Other”。然后,该索引表示将包含指向所有已创建资源的链接(如果其中任何一个失败,则可能包含错误信息)。

POST /categories/uploads/
[{"name": "Books"}, {"name": "Games"}]

    303 See Other
    Location: /categories/uploads/321/
Run Code Online (Sandbox Code Playgroud)

(实际上,考虑到这一点,201可能比303更好)

GET /categories/uploads/321/

    200 OK
    Content-Type: application/json

    [{"name": "Books", "link": "/categories/Books/"},
     {"name": "Games", "error": "The 'Games' category already exists."}]
Run Code Online (Sandbox Code Playgroud)

  • @fumanchu:我不完全同意。阅读:http://stackoverflow.com/a/1829913。此外,Restful Web 服务说:“实体主体:应该描述并链接到新创建的资源。如果您使用 Location 标头告诉客户端资源实际存在的位置,则该资源的表示是可以接受的。” (2认同)