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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.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
Rest HTTP响应412-您可以包含内容吗?_Rest_Http_Atom Feed_Http Status Code 412 - Fatal编程技术网

Rest HTTP响应412-您可以包含内容吗?

Rest HTTP响应412-您可以包含内容吗?,rest,http,atom-feed,http-status-code-412,Rest,Http,Atom Feed,Http Status Code 412,我正在构建一个RESTful数据存储并利用条件GET和PUT。在条件PUT期间,客户机可以包括资源上以前GET中的Etag,如果当前表示不匹配,服务器将返回HTTP状态代码412(前提条件失败)。注意,这是一个基于Atom的服务器/协议 我的问题是,当我返回412状态时,我是否还可以包含资源的新表示,或者用户必须发出新的GET?HTTP规范似乎没有说是或否,Atom规范也没有说(尽管他们的示例在响应中显示了一个空的实体体)。不返回新的表示并让客户明确地得到它似乎是相当浪费的。想法?不,严格说来,

我正在构建一个RESTful数据存储并利用条件GET和PUT。在条件PUT期间,客户机可以包括资源上以前GET中的Etag,如果当前表示不匹配,服务器将返回HTTP状态代码412(前提条件失败)。注意,这是一个基于Atom的服务器/协议


我的问题是,当我返回412状态时,我是否还可以包含资源的新表示,或者用户必须发出新的GET?HTTP规范似乎没有说是或否,Atom规范也没有说(尽管他们的示例在响应中显示了一个空的实体体)。不返回新的表示并让客户明确地得到它似乎是相当浪费的。想法?

不,严格说来,你不应该。错误代码通常用于指定发生了错误。虽然没有什么可以阻止你返回内容(事实上,有些错误,比如404,返回一个漂亮的页面,上面说你没有找到你要找的内容),但响应的重点不是返回其他内容,而是返回一些告诉你哪里错了的内容。从技术上讲,您也不应该返回该数据,因为您通过了If None Match:etag(我假设您通过了它?)

另一方面,您真的需要优化掉一个额外的http调用吗


我越想这个问题,我就越确信这是个坏主意——你是否打算返回任何其他错误的内容?PUT语义就是PUT。GET语义应该用于GET。

如果由于更新冲突后的额外请求而产生的额外请求的数量足够大,足以让您产生性能问题,那么我建议您可能在资源的粒度方面存在问题

你真的期望每天有数百万次多个用户同时编辑同一资源吗?也许您需要存储对资源的增量更改,而不是直接更新资源。如果对这些资源真的有那么多的争夺,那么用户就不会一直在处理过时的数据了

如果您的问题是您的资源包含上次修改的日期和上次修改的用户,并且您必须在每次PUT之后执行GET,那么我会更确信需要扭曲规则


然而,我认为额外请求对性能的影响是值得的,因为它对客户端开发人员来说是清晰的

尽管条件get和put被总结为“条件请求”,但它们在概念上是非常不同的。条件get是一种性能优化,条件put是一种并发控制机制。很难一起讨论它们

对于您关于条件GET的问题:如果您发送GET并包含一个If None匹配头,则如果资源已更改,服务器将发送200 Ok;如果未更改,服务器将发送304 Not Modified(如果条件失败)。412仅用于有条件看跌期权


更新:我似乎有点误读了这个问题。关于失败的条件PUT时本地副本的“刷新”问题,您的观点是:很可能缓存已经有了最新版本,您的刷新将从某个缓存获得。让服务器返回带有412的当前实体实际上可能会给您带来更差的性能。

优化一个HTTP调用很容易意味着一天可以保存数百万个请求-因此,是的,我赞成这样做。POST语义是POST,但是在一篇成功的文章中返回内容是完全有效的,所以我不同意你的观点。你不是在写一篇文章,你是在写一篇文章。POST语义与两者不同,在POST上返回内容是有效的,因为语义状态:POST和PUT请求之间的根本区别反映在请求目标的不同含义中。POST请求中的URI标识将处理封闭实体的资源。该资源可能是一个数据接受进程、到其他协议的网关,或者是一个接受注释的单独实体。这意味着POST可以灵活地返回与URI无关的内容。老实说,这是我迄今为止看到的最好的答案。