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
Http 理解REST:从根本上说,GET与任何;“浏览次数”;柜台_Http_Rest_Get - Fatal编程技术网

Http 理解REST:从根本上说,GET与任何;“浏览次数”;柜台

Http 理解REST:从根本上说,GET与任何;“浏览次数”;柜台,http,rest,get,Http,Rest,Get,我试着去理解其余的。在REST下,GET不能触发服务器上的事务(这是一个大家都同意的定义,它是REST的基础) 想象一下,你有一个像stackoverflow.com这样的网站(如果我得到了错误的基本细节,它不会改变我的问题),每次有人阅读一个问题,使用GET,也会有一些显示“这个问题已经被阅读256次” 现在有人读到了这个问题。柜台现在是257。GET是事务性的,因为视图的数量增加了,现在又增加了。DB中的“视图数”是递增的,这一点没有争议(例如,在上,因此始终显示任何问题被查看的时间数) 那

我试着去理解其余的。在REST下,GET不能触发服务器上的事务(这是一个大家都同意的定义,它是REST的基础)

想象一下,你有一个像stackoverflow.com这样的网站(如果我得到了错误的基本细节,它不会改变我的问题),每次有人阅读一个问题,使用GET,也会有一些显示“这个问题已经被阅读256次”

现在有人读到了这个问题。柜台现在是257。GET是事务性的,因为视图的数量增加了,现在又增加了。DB中的“视图数”是递增的,这一点没有争议(例如,在上,因此始终显示任何问题被查看的时间数)

那么,REST GET是否与网站中的任何“视图数”功能基本不兼容

那么,如果它想要“RESTFUL”,那么So主页是否应该停止显示使用GETs访问的普通HTML链接,或者停止显示“此问题已被查看x次”

因为增加数据库中的计数器是事务性的,因此是“无效率的”

编辑,这样人们在谷歌上搜索时可以得到一些提示:

发件人:

四,。通过HTTP GET访问的所有资源都应该没有副作用。也就是说,请求应该只返回资源的表示形式。调用资源不应导致修改资源

现在对我来说,如果表示包含“视图数量”,那么它是资源的一部分[因此,问题的“视图数量”是一个非常重要的信息],访问它肯定会修改资源

这与真正的restfulhttpget形成了鲜明的对比,比如说,您可以在amazons3资源上创建一个真正的restfulhttpget,其中您的GET保证不会修改您得到的资源


但是我还是很困惑。

仅仅因为页面是通过GET访问的,并不意味着没有增加计数器的方法。例如,您可以使用AJAX帖子

我还认为,这种“被动”交易可能会被安全地忽略。访问URL和删除某个对象,以及访问URL和增加访问计数器之间有很大区别。不过,我很想听听其他人对这个问题的看法


编辑:我认为赫瓦尔德和我基本上是一致的,触发计数器的GET在技术上可能是不ReST的,但不值得担心。

我避免在GET请求中更新统计数据,因为“有人这么说”是对ReST的教条。做实事求是的事。如果这涉及到在响应GET请求时更新计数器,那么就这样吧

更详细地说,真正重要的(以及建议存在的原因)是,当消费者打算阅读资源时,消费者正在访问的资源不会以任何方式更新或更改。然而,更新其他数据,特别是日志和统计数据,并不是一个问题。简而言之,读取资源不应该对正在读取的资源产生副作用

编辑:要回答自增计数器的问题,请问问自己应用的上下文是什么。显然,如果您在读取时定义一个名为CounterThatIncrementSelf的资源,那么它:

  • 如果唯一的规则是GET永远不会有副作用,那么读取递增计数器是自相矛盾的资源,因此会中断RESTfusion,或者
  • 考虑到不同的上下文,例如考虑到非常短的资源生命周期,并选择将增量视为在阅读资源后发生的事情(或者更一般地,由资源所有者自行决定)

无论您选择应用何种解决方案,问题实际上是关于预期行为是什么。依我看,一个在读取时自身递增的计数器应该在读取时自身递增。我仍然访问一个资源的表示,尽管它的生命周期很短,但我知道在我阅读它之后,它会立即被更改。这没有什么不安的。

您需要注意的一点是:GET请求可以由机器人程序触发,例如搜索引擎。如果您不考虑这些数据,它们将扭曲您的统计数据。

重要的是,从客户的角度来看,GET从定义上讲是安全的(没有副作用),因此客户可以安全地调用GET任意次数,而不必考虑任何可能产生的副作用

服务器所做的是服务器的责任。在视图计数器的情况下,如果服务器认为计数器的更新是一个副作用,则必须做出决定。通常不会,因为计数器首先是资源语义的一部分

但是,服务器可能决定不对某些请求(例如爬虫获取)增加计数器


Jan

您在这里混合了几个问题。对REST接口的单个请求可以触发后端事务。但是,该事务必须在单个请求的范围内启动和完成。
REST接口不应该让多个独立请求参与同一后端“两阶段提交”事务


第二个问题是GET请求是否可以执行更新。正如简在他的回答中指出的那样,在某些情况下,GET可以产生副作用。他说得比我读得好得多,所以他回答了为什么

GET只对请求所标识的资源安全且幂等,这是客户机需要而且应该关注的全部内容

考虑这一点最简单的方法是反对
GET /users/me/notifications
[{
    "id" : 2,
    "timestamp" : 0000000001,
    "title" : "you win a BMW car!"
    "status" : NOT_READ 
},
{
    "id" : 1,
    "timestamp" : 0000000000,
    "title" : "Welcome to phishingbanners.com!"
    "status" : READ 
}]
PATCH /users/me/notifications
[{
    "id" : 2,
    "status" : "READ" 
}]