Web services REST搜索接口与GET的幂等性
为了坚持REST概念,如安全操作、幂等,如何实现涉及多个参数的复杂搜索操作 我看过谷歌的实现,这是有创意的。除此之外,还有什么选择Web services REST搜索接口与GET的幂等性,web-services,rest,Web Services,Rest,为了坚持REST概念,如安全操作、幂等,如何实现涉及多个参数的复杂搜索操作 我看过谷歌的实现,这是有创意的。除此之外,还有什么选择 幂等要求让我很困惑,因为对于相同的条件,操作肯定不会返回相同的结果,比如说搜索名为“Smith”的客户不会每次返回相同的集合,因为总是添加更多的“Smith”客户。我的直觉是使用GET,但对于真正的搜索功能,结果似乎不是幂等的,并且需要标记为不可缓存,因为它的结果集是流动的。对于相同的数据集,它将是幂等的。您可以通过时间戳过滤器来实现这一点。GET在正确实现时是安全
幂等要求让我很困惑,因为对于相同的条件,操作肯定不会返回相同的结果,比如说搜索名为“Smith”的客户不会每次返回相同的集合,因为总是添加更多的“Smith”客户。我的直觉是使用GET,但对于真正的搜索功能,结果似乎不是幂等的,并且需要标记为不可缓存,因为它的结果集是流动的。对于相同的数据集,它将是幂等的。您可以通过时间戳过滤器来实现这一点。GET在正确实现时是安全的,并且是幂等的。这意味着:
如果在URI中使用时间戳来确保每次请求的服务器数据都是相同的,那只意味着已经是幂等的(实现GET的函数)将作用于相同的数据,从而保证每次都是相同的结果。换句话说,幂等性背后的基本原理是GET操作不影响操作的结果。也就是说,GET可以安全地重复,没有不良副作用 但是,幂等请求与资源的表示无关 两个人为的例子:
GET /current-time
GET /current-weather/90210
显而易见,这些资源会随着时间的推移而变化,有些资源的变化速度比其他资源快。但是GET操作本身在影响实际资源方面并不密切相关
与之相比:
GET /next-counter
显然,我希望这不是一个幂等请求。请求本身正在更改资源
而且,没有任何东西说幂等运算没有副作用。显然,许多系统日志访问和请求,包括GET。因此,当您执行GET/resource时,日志将因该GET而更改。这种副作用并不能使GET不幂等。基本前提是对资源本身的影响
但是,比如说:
GET /logs
如果日志注册每个请求,并且GET返回当前状态的日志,那么这是否意味着在本例中GET不是幂等的?是的!这真的重要吗?不。不适用于这种单边的情况。这就是游戏的本质
那么:
GET /random-number
如果您使用的是伪随机数生成器,那么大多数都是以它们自己为食的。从一个种子开始,将结果反馈给自己,以获得下一个数字。因此,使用GET-here可能不是幂等的。但是是吗?你怎么知道随机数是如何产生的。它可能是白噪声源。你为什么在乎?如果资源只是一个随机数,那么您真的不知道操作是否在改变它
但仅仅因为指南可能有例外,并不一定会使这些指南背后的概念失效
资源在变化,这是生活中的一个简单事实。资源的表示不必是通用的、跨请求的一致性或跨用户的一致性。从字面上说,GET提供的是资源的表示,这取决于应用程序,使用谁知道的标准来确定每个请求的表示。幂等请求非常好,因为它们与rest模型的其余部分(如缓存和内容协商)配合得很好
大多数资源不会快速更改,并且依赖于特定的事务,使用非幂等动词,为客户端提供了一个更可预测和一致的接口。当一个方法被认为是幂等的时,当它被证明不是这样时,客户会非常惊讶。但最终,这取决于应用程序及其文档化的界面。这将需要大量日志,以便我可以“在当时”重建表示,对吗?db将通过PUT更新,将来通过该GET获取的任何行都必须以以前的形式表示。在实现幂等性的同时,这对我们来说是无用的;我们需要询问。我们还能做什么?我不是唯一一个希望通过REST实现搜索的人。这是我能看到的唯一缺点。即使在实体上获取,也不会始终返回相同的表示形式,因为实体是可修改的。人们是如何在动态实体之上实现REST的?为什么没有时间过期的缓存呢?我喜欢这个想法。那么,要点是什么?我将他们的查询结果存储在预先确定的时间内,以便重新提供该表示?这就是我的想法。所以幂等式在5分钟内有效。太好了。会不会有其他的福音传道者被激怒,或者根据REST架构,这是可以接受的?很好地解释了!