支持RESTful服务 - 我应该使用Pragma,Cookies,自定义标头或其他东西来识别客户端会话和事务吗?

Jam*_*mes 6 rest soa

问题

我们正在使用RESTful方法构建SOA.一旦系统投入生产,我们将有许多客户使用该接口,包括内部和第三方系统.

我们希望能够在客户端应用程序提供的响应信息中使用和回显,例如: -

  • 会话ID - 可以是Java EE会话ID或任何特定于客户端的,这对于支持团队和调试客户端问题以在我们的所有系统中跟踪它们非常有用.
  • 事务ID - 请求的唯一标识符,如果它们异步调用服务或者我们实现202 Accepted样式长时间运行的进程,我们可以回显给客户端以帮助客户端进行请求/响应关联.

潜在解决方案

因此,坚持使用RESTful约束表明我们需要利用HTTP来实现这一点,并且我们可以实现几个选项.

  • Pragma标题 - 为transaction-id,session-id等实现扩展-pragma.这似乎是解决方案的纯粹主义,因为它使用标准的HTTP标题,虽然我担心它会成为我们无法解决的一切问题的倾销场好好想想.
  • X-My-Header - 我们需要的每个字段的自定义标头.可能被代理剥离,而不是核心HTTP,所以感觉反休息
  • 在查询字符串或XML/JSON表示中 - 将字段添加到我们的所有资源.因为它是一个操作参数,所以感觉它应该作为元数据而不是资源提供.
  • Cookie - 使用Cookie和Set-Cookie来保存自定义键值; 在会话ID的情况下很有用,因为大多数实现已经使用了cookie.每次都必须重新发送以支持客户端关联哪种方式使用cookie失败.

答案

这有先例吗?我们生气了吗?在我的所有研究中是否有一些明显的东西?没有人真正关心他们部署后如何支持他们的服务?我应该闭嘴并离开吗?

我希望有人可以提供帮助.

PS抱歉,如果这是一篇文章,建议确实说"具体"....

Pet*_*der 2

哦,这是一个痛苦。我也去过那里。

好吧,使用交易、会话等元数据的想法是个好主意。至少对于日志记录来说。

问题是如何设置符合各种公司策略和 SOA 基础设施的东西。

对于 HTTP,需要在最佳设计和最大互操作性之间进行权衡。

安全的路径是将元数据编码在消息本身中。不太好,这样的解决方案最终看起来有点像 SOAP,其中有一个包含所有消息标头的信封。

我最终使用 X 标头来获取交易 id 等信息。然而,正如您所提到的,代理/B2B 网关等可能会剥离标头,您可以使用所有指定的开发框架、COTS 应用程序等来检索它们并不明显。因此,如果您这样做,您应该避免强制元数据运行一个解决方案 - 只是“很高兴拥有”。

饼干除了痛苦什么也不是。它们对于浏览器交互可能很烦人,有时甚至很有用,但在 SOA 场景中,这将是一个坏主意。很多事情都可能出错,跨组织调试非常痛苦。

我还会避免将查询字符串与 POST 或 PUT 数据一起使用。根据 HTTP 规范这是可能的。但在随机框架中实现时则不然。