Http 理解REST:从根本上说,GET与任何;“浏览次数”;柜台
我试着去理解其余的。在REST下,GET不能触发服务器上的事务(这是一个大家都同意的定义,它是REST的基础) 想象一下,你有一个像stackoverflow.com这样的网站(如果我得到了错误的基本细节,它不会改变我的问题),每次有人阅读一个问题,使用GET,也会有一些显示“这个问题已经被阅读256次” 现在有人读到了这个问题。柜台现在是257。GET是事务性的,因为视图的数量增加了,现在又增加了。DB中的“视图数”是递增的,这一点没有争议(例如,在上,因此始终显示任何问题被查看的时间数) 那么,REST GET是否与网站中的任何“视图数”功能基本不兼容 那么,如果它想要“RESTFUL”,那么So主页是否应该停止显示使用GETs访问的普通HTML链接,或者停止显示“此问题已被查看x次” 因为增加数据库中的计数器是事务性的,因此是“无效率的” 编辑,这样人们在谷歌上搜索时可以得到一些提示: 发件人: 四,。通过HTTP GET访问的所有资源都应该没有副作用。也就是说,请求应该只返回资源的表示形式。调用资源不应导致修改资源 现在对我来说,如果表示包含“视图数量”,那么它是资源的一部分[因此,问题的“视图数量”是一个非常重要的信息],访问它肯定会修改资源 这与真正的restfulhttpget形成了鲜明的对比,比如说,您可以在amazons3资源上创建一个真正的restfulhttpget,其中您的GET保证不会修改您得到的资源Http 理解REST:从根本上说,GET与任何;“浏览次数”;柜台,http,rest,get,Http,Rest,Get,我试着去理解其余的。在REST下,GET不能触发服务器上的事务(这是一个大家都同意的定义,它是REST的基础) 想象一下,你有一个像stackoverflow.com这样的网站(如果我得到了错误的基本细节,它不会改变我的问题),每次有人阅读一个问题,使用GET,也会有一些显示“这个问题已经被阅读256次” 现在有人读到了这个问题。柜台现在是257。GET是事务性的,因为视图的数量增加了,现在又增加了。DB中的“视图数”是递增的,这一点没有争议(例如,在上,因此始终显示任何问题被查看的时间数) 那
但是我还是很困惑。仅仅因为页面是通过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"
}]