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

支持RESTful服务-我应该使用Pragma、Cookies、自定义头或其他东西来标识客户端会话和事务吗?,rest,soa,Rest,Soa,问题 我们正在使用RESTful方法构建SOA。一旦系统投入生产,我们将有许多客户使用该接口,包括内部和第三方系统 我们希望能够使用和回显客户端应用程序提供的响应信息,例如:- 会话Id-可以是Java EE会话Id或任何特定于客户端的Id,这对于支持团队和调试客户端问题非常有用,可以在我们的所有系统中跟踪它们 事务Id—请求的唯一标识符,如果客户端异步调用服务,或者如果我们实现了202接受样式的长时间运行流程,我们可以将其回显到客户端,以帮助客户端进行请求/响应关联 潜在解决方案 因此,坚

问题

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

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

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

因此,坚持RESTful约束意味着我们需要使用HTTP来实现这一点,我们可以实现几个选项

  • Pragma header-为事务id、会话id等实现扩展Pragma。这似乎是一个纯粹的解决方案,因为它使用了标准HTTP头,尽管我担心它会成为我们无法正确思考的一切的垃圾场
  • X-My-Header-我们需要的每个字段的自定义标题。可能会被代理剥离,而不是核心HTTP,所以感觉是反rest的
  • 在查询字符串或XML/JSON表示中,将字段添加到所有资源中。因为它是一个操作参数,所以感觉应该作为元数据而不是资源提供
  • Cookie-使用Cookie并设置Cookie以保存自定义键值;在会话ID的情况下很有用,因为大多数实现已经使用cookie。每次都必须重新发送以支持客户端关联,这有点违背了使用cookie的意义
答案

这有什么先例吗?我们疯了吗?在我所有的研究中有没有明显的缺失?难道没有人真正关心一旦部署它们,它们将如何支持它们的服务吗?我应该闭嘴走开吗

我希望有人能帮忙


顺便说一句,如果这是一篇有点像文章的话,建议中确实说了“要具体”…

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

好吧,为事务、会话等使用元数据是个好主意。至少对于日志记录来说是这样

问题是要设置一些符合各种公司策略和SOA基础架构的东西

在HTTP的情况下,在最佳设计和最大互操作性之间存在权衡

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

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

饼干只是痛苦。它们可能会让人讨厌,有时甚至对浏览器交互很有用,但在SOA场景中,这将是一个坏主意。很多事情都可能出错,调试跨组织的系统是一件痛苦的事情


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

您可以使用GUID,让客户端生成GUID,并将其作为启动工作流/业务流程的任何请求的一部分进行传递。此GUID可用于跨参与工作流的多个组件进行关联。

谢谢Peter,从设计角度来看,X-*header或Pragma似乎是最好(最不坏)的选项,但两者都有其局限性。X-*被代理剥离可能不是什么问题,因为在实践中,代理似乎是这些(X-Forwarded-For)的关键用户之一,这两种解决方案都需要外部文档,因为HTTP/REST中没有为此预先定义任何内容。我还听说,某些框架使用Pragma头进行缓存,支持HTTP 1.0,但实际上不支持扩展。也许HTTP 2会考虑我的可怜的支持团队……然后我会去X头。事实上,我在那种情况下也是这样,和你的情况类似。