【问题标题】:What is the X-REQUEST-ID http header?什么是 X-REQUEST-ID http 标头?
【发布时间】:2014-08-21 18:14:45
【问题描述】:

我已经在这个主题上搜索了很多,阅读了关于这个标题的各种文章,它在 Heroku 中的使用,以及基于 Django 的项目。

然而,我的脑子里还是一片混乱。

  • 此标头的用途是什么?
  • 是否侵犯用户隐私?
  • 它可以帮助跟踪用户吗?

【问题讨论】:

  • @Wrikken 我已经这样做了......我仍然对这个标题感到困惑。
  • 然后,为了 (1) 将 webrequest 与转发到您的应用程序的请求相关联 (2) 不,因为用户没有发送它,路由器设置它 (3) 参见 (2) ),但它可能有助于在调试时跟踪单个请求。

标签: http http-headers


【解决方案1】:

当您操作由客户端访问的网络服务时,可能很难将请求(客户端可以看到)与服务器日志(服务器可以看到)关联起来。

X-Request-ID 的想法是客户端可以创建一些随机 ID 并将其传递给服务器。然后,服务器在它创建的每个日志语句中都包含该 ID。如果客户端收到错误,它可以将 ID 包含在错误报告中,从而允许服务器操作员查找相应的日志语句(无需依赖时间戳、IP 等)。

由于此 ID 由客户端(随机)生成,它不包含任何敏感信息,因此不应侵犯用户的隐私。由于每个请求都会创建一个唯一 ID,因此它也无助于跟踪用户。

【讨论】:

  • @Wrikken 在他/她的评论中提到 ID 是由路由器设置的,这里是它的客户端。什么是客户?
  • 客户端是向服务器发送请求的软件,可以是浏览器,也可以是JMeter等压力测试工具。如果原始客户端未提供请求 ID,服务器也可以生成请求 ID,并将其传递给其他服务器,例如Web 服务器生成 id 并将其转发给应用程序服务器。
  • Heroku 博客声明 X-Request-ID 有助于将多个日志条目与单个 HTTP(s) 请求相关联:blog.heroku.com/…
  • 它也称为 CorrelationId 而不是标准的 HTTP 标头:en.wikipedia.org/wiki/List_of_HTTP_header_fields X-Request-ID, X-Correlation-ID。关联客户端和服务器之间的 HTTP 请求。
  • 如果每个请求都带有用户会话,是否还需要附加X-Request-ID?
【解决方案2】:

目的:幂等性

由于每个请求的 ID 都会发生变化,但在请求重试时保持不变,接收方可以确保不会多次处理请求。

这是来自某个 API 提供商的引述:

所有 POST、PUT 和 PATCH HTTP 请求都应包含唯一的 X-Request-Id 标头,用于确保消息的幂等性 重试时的处理

如果您将其设为随机字符串,每个请求唯一,则不会侵犯您的隐私,也不会启用跟踪。

如果您想了解更多关于幂等性的信息,请阅读this insightful article

注意作为 Stefan Kögl cmets,此标头未标准化 - 因此(已弃用)“X-”前缀。

【讨论】:

  • 请注意,虽然“某些 API 提供者”可能会以这种方式使用 X-Request-Id 标头,但这不是标准行为。它通常不能用于此目的。
【解决方案3】:

使用故事/类比进行解释

您的互联网正在播放(像往常一样),所以您打电话给 Tellstra 并且您一直在等待电话......最后您放弃并沮丧地摔倒了电话。 (这是一次失败的通话。Tellstra 的通话记录中有记录。)

“就是这样,我要打电话给监察员!”

但是 Obmudsman 有数千条通话记录需要处理(Tellstra 的所有失败查询)。如果你告诉他们你给 Telstra 打了电话,但你的电话不成功,那还不够:申诉专员如何从 Tellstra 的所有通话记录中知道哪一个是你的 - 这样一来可以进一步调查吗??

这就是 X-Request-ID 的来源——当您调用 Tellstra 时,您会传递一个随机数(X-Request-ID),这会记录在 Tellstra 记录中。这样,监察员(有权访问所有记录)将能够找到您的来电以找出问题所在。

故事到 HTTP 的应用

这同样适用于 http 请求 - 它是一个 id,用于帮助您(作为后端开发人员)在客户端向您发出错误或大报告时找出问题所在。

这就是它的基本摘要。如有任何问题等,请发表评论,我希望能解决它。

【讨论】:

  • 在我看来,这里的“类比”增加了混乱,而不是清晰。在电话的情况下,无法传递由收件人自动记录的随机数,因此您的故事是荒谬的。
【解决方案4】:

此请求标头可用于同步。假设您已经构建了一个提供离线功能的 ToDo 列表。您的用户创建了 3 个项目,并且每个项目都在离线应用程序上被赋予了一个唯一的 UUID。当网络连接可用时,记录被 POST 到服务器,并返回从数据库自动生成的相应 ID。然后,您可以替换应用中的 ID(例如 HTML“li”元素的“id”属性)。

【讨论】:

  • 这里描述的场景并不意味着使用 HTTP 标头来传输 UUID。
猜你喜欢
  • 2013-12-25
  • 2012-02-23
  • 1970-01-01
  • 2021-07-26
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
相关资源
最近更新 更多