Web services REST搜索接口与GET的幂等性

Web services REST搜索接口与GET的幂等性,web-services,rest,Web Services,Rest,为了坚持REST概念,如安全操作、幂等,如何实现涉及多个参数的复杂搜索操作 我看过谷歌的实现,这是有创意的。除此之外,还有什么选择 幂等要求让我很困惑,因为对于相同的条件,操作肯定不会返回相同的结果,比如说搜索名为“Smith”的客户不会每次返回相同的集合,因为总是添加更多的“Smith”客户。我的直觉是使用GET,但对于真正的搜索功能,结果似乎不是幂等的,并且需要标记为不可缓存,因为它的结果集是流动的。对于相同的数据集,它将是幂等的。您可以通过时间戳过滤器来实现这一点。GET在正确实现时是安全

为了坚持REST概念,如安全操作、幂等,如何实现涉及多个参数的复杂搜索操作

我看过谷歌的实现,这是有创意的。除此之外,还有什么选择


幂等要求让我很困惑,因为对于相同的条件,操作肯定不会返回相同的结果,比如说搜索名为“Smith”的客户不会每次返回相同的集合,因为总是添加更多的“Smith”客户。我的直觉是使用GET,但对于真正的搜索功能,结果似乎不是幂等的,并且需要标记为不可缓存,因为它的结果集是流动的。

对于相同的数据集,它将是幂等的。您可以通过时间戳过滤器来实现这一点。

GET在正确实现时是安全的,并且是幂等的。这意味着:

  • 它不会在服务器端造成客户端可见的副作用
  • 当指向同一个URI时,它会导致每次执行相同的服务器端函数,而不管它被发出多少次或何时执行
  • 上面没有提到的是,访问相同的URI总是返回相同的数据

    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架构,这是可以接受的?很好地解释了!