Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 使用restful HTTP创建单个和多个资源_Web Services_Http_Rest_Web - Fatal编程技术网

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

Web services 使用restful HTTP创建单个和多个资源,web-services,http,rest,web,Web Services,Http,Rest,Web,在我的API服务器中,我定义了以下路由: POST /categories 要创建一个类别,请执行以下操作: POST /categories {"name": "Books"} 我认为如果你想创建多个类别,那么你可以: POST /categories [{"name": "Books"}, {"name": "Games"}] 我只想确认这是RESTfulHTTPAPI的一个良好实践 还是应该有一个 POST /bulk 为了允许他们一次完成任何操作(创建、读取、更新和删除)?在tr

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

POST /categories
要创建一个类别,请执行以下操作:

POST /categories {"name": "Books"}
我认为如果你想创建多个类别,那么你可以:

POST /categories [{"name": "Books"}, {"name": "Games"}]
我只想确认这是RESTfulHTTPAPI的一个良好实践

还是应该有一个

POST /bulk

为了允许他们一次完成任何操作(创建、读取、更新和删除)?

在true REST中,您可能应该在多个单独的调用中发布此操作。原因是每一个都会产生一个新的表示。否则你怎么能把它拿回来呢

每个post都应返回生成的资源位置:

POST -> New Resource Location
POST -> New Resource Location
...
但是,如果需要批量,请创建批量。在可能的情况下要坚持教条,但如果不是这样,实用主义就能完成任务。如果你过于沉迷于教条主义,那么你永远也做不成任何事情


让您发布到的批量操作激活(它将是非幂等的,因此POST是正确的动词)没有什么特别的错误,但有一些注意事项:

  • 您正在生成多个资源,因此需要使用多个URL进行响应。这意味着您不能使用重定向模式:您必须以某种形式发回URL列表

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

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


最简单的方法是只支持每个请求一个create;这是一个更容易理解的模式,并且更容易被理解。

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

(事实上,现在我想起来,201可能比303好)


在您的情况下,我也会选择/批量资源方式。但根据我的理解,我建议的模式是:使用202公认的状态代码

批量请求的思想是不应强制服务器立即应答,因为这意味着客户端需要等待,直到其批量请求完成

模式如下:

POST /bulk [{"name": "Books"}, {"name": "Games"}]
202 Accepted | Location: /bulk/processing/status/resourceId

GET /bulk/processing/status/resourceId
entry = "REST in peace" | completed | 0 errors | /categories/category/resourceId
entry = "Walking dead" | processing | 0 errors ->
因此,客户机将批量信息发布到服务器。服务器只是用一个202来接受它们,它不能保证响应时的处理状态。 但是,服务器还提供指向状态资源的链接。在这里,客户机可以查看每个创建的资源和处理状态。完成后,客户端可以通过给定的链接访问资源。 客户端可以识别错误情况,错误数据可以通过已完成资源上的PUT重新发送


最后,我通常遵循的一个好建议是:当您在设计中遇到无法映射到HTTP功能的资源时,可能是因为缺少资源。

事实上,直到今天,这仍然是一个热门话题,但简化一些事情,我几乎经常说,对于每种实践,都有适合的场景。 如: 1.如果你从一个帖子中收到喜欢的东西,你不需要大量的评论,因为如果每个评论只有一个喜欢的话。 2.如果你收到的是最喜欢的评论,那么考虑到有人查看了他阅读的评论,并选中所有他的最喜欢的评论,然后发送一次,这就很适合了


同样,这是基于我使用Restful API的经验,但目前为了多任务和其他事情,我和我的同事发现我们自己在大多数MIS(管理信息系统)中一直在做大量工作。这是因为现代的web应用程序和移动应用程序可以做很多工作,并将最终结果发送到后端,这样,只要接收到的数据不违反业务逻辑,后端就没有什么工作可做。

是什么阻止你多次调用它?什么都没有。。但如果你想创造1000个资源,我怀疑你是不是想做1000次往返而不是1次。更少的时间,更少的金钱,更少的代码。为什么我不能直接在POST响应中返回创建的资源?因为这是RPC,而不是REST。返回的表示可能不会被缓存;即使您碰巧找到一个缓存POST响应的缓存,它也不会被缓存在标识资源的URI上(显然,它标识了资源创建)。看起来Julian正越过我的肩膀查看;)@我不完全同意。请阅读以下内容:。另外,RESTfulWeb服务说:“实体主体:应该描述并链接到新创建的资源。如果您使用Location头告诉客户端资源的实际位置,那么该资源的表示是可以接受的。”+1表示“实用主义完成了任务”。我也在创建一个API,需要创建数千个资源,我认为批量创建胜过每个资源一篇文章。另外+1表示“如果你过于拘泥于教条主义,那么你永远不会完成任何事情。”-非常同意。
GET /categories/uploads/321/

    200 OK
    Content-Type: application/json

    [{"name": "Books", "link": "/categories/Books/"},
     {"name": "Games", "error": "The 'Games' category already exists."}]
POST /bulk [{"name": "Books"}, {"name": "Games"}]
202 Accepted | Location: /bulk/processing/status/resourceId

GET /bulk/processing/status/resourceId
entry = "REST in peace" | completed | 0 errors | /categories/category/resourceId
entry = "Walking dead" | processing | 0 errors ->