【问题标题】:Can we make Restful webservice stateful我们可以让 Restful webservice 有状态吗
【发布时间】:2013-11-17 14:18:24
【问题描述】:

我一直在阅读有关 Restful Web 服务是无状态的。 我还可以看到,大多数基于 Soap 的 Web 服务也是无状态的,如果需要,可以将其设为有状态,而使它们有状态将取决于实现。 因此,如果基于soap 的网络服务是有状态的,那么每个请求都会传递一个会话ID,以继续会话。

我的问题是为什么不能用 Restful webservices 完成,我想我应该能够实现一个 webservice,它可以继续同一个 session,其中 session id 由 Restful webservice 传递,使有状态。

所以我的问题是,RestFul Web 服务是否只是一个带有不使它们有状态的指南的概念?还是会检查 Restful Web 服务库 [如 Jersey ] 以阻止人们这样做?

【问题讨论】:

  • 您当然可以使 REST 服务有状态。但这违背了 REST 哲学。您将无法扩展(特别是由于服务器关联性)。
  • 据我所知,在任何 REST 库中都没有此类检查,但正如 @DavidBrabant 还说您的服务将不再是 RESTful 的。为什么要让它们有状态?
  • @Leonard:我只是想抓住这个概念。到处都强调 Restful 是无状态的。如果我提出了一个有状态的 Rest webservice 的 Get 请求,那么它不会是 Restful 吗?肯定不是肥皂,那会是什么?
  • @Lokesh 您将拥有一个使用 REST 库的有状态应用程序的 Web 服务。

标签: web-services rest soap


【解决方案1】:

REST 的无状态性旨在确保应用程序能够很好地扩展。您可以添加状态,但需要在可扩展性方面进行权衡。

向 REST 添加状态的最常见原因之一是用于身份验证。一旦建立了安全连接,就可以将安全 cookie 发送到客户端。然后,客户端将此 cookie 添加到会话的所有请求中。服务器维护状态,然后根据 cookie 在每个请求中加载该状态。

考虑一个简单的网页。如果你不维护状态,你可以建立一个反向代理,通过 URL 将页面缓存在内存中,然后将该资源分布在许多服务器上以进行加载。如果您现在将当前登录用户的名称添加到该网页,您将无法再缓存任何内容(至少在最基本的 HTTP 级别)。现在只能使用身份验证 cookie 和 URL 的组合来缓存响应。

【讨论】:

  • 无国籍状态可能被“设计”为允许规模化,但规模不是问题而且永远不会成为问题的情况呢?
  • 有一些理由更喜欢与系统复杂性相关的无状态,但主要是可扩展性。如果您不打算扩展,那么添加状态可能不会引起任何头痛。网站已经这样做了几十年。它不再是 REST-ful 了。
  • Rich,我只是质疑“REST-ful”是否是实际要求。我从未将“REST”的许多方面视为需求。例如,我从未见过HATEOAS 的要求。
  • 也许不是。但是由于这些问题是关于使 RESTful 服务有状态的,所以答案似乎是:不是真的,它不再是 REST。您当然可以在顶部添加一个状态层,就像使用 auth cookie 时一样。
  • @JohnSaunders 他们不是口授的,而是建议的。在浏览器中,您可以输入 URI,但我敢打赌,您经常使用链接浏览新网站。 REST 正在复制(推广)这个想法,并建议将服务和客户端更改为像浏览网页一样。用户不需要知道可以在位置栏中输入的每个可能的 URI,而是请求一个起始站点,并根据呈现的结果做出进一步的决定
【解决方案2】:

据我所知,我们(.net 开发人员)可以在 wcf 中使用 WS-binding 来实现有状态的 Web 服务。

【讨论】:

    【解决方案3】:

    Web 服务,无论是 Rest 还是 SOAP,默认情况下都是无状态设计的。但是可能存在需要有状态的用例。 OASIS 提供的 Web 服务资源框架 (WSRF) 可用于使 SOAP Web 服务成为有状态的。将 ResourceProperties 属性添加到端点并将 ResourceProperty 操作添加到 WSDL 并在 Web 服务之间传递它。

    Rest 参与状态传输并使它们成为有状态的,我们可以使用客户端或数据库持久会话状态,并将它们作为标头或方法参数中的属性在 Web 服务调用中传输。

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      相关资源
      最近更新 更多