【问题标题】:What would cause HTTP to send back "400 OK"什么会导致 HTTP 发回“400 OK”
【发布时间】:2012-08-01 21:22:21
【问题描述】:

当我将一些参数放入 URL 时,有时我会收到一个错误,该错误应该是“400 OK”的有效请求。

相同的 URL 和参数在 99% 的情况下都有效,但我发现我们的日志中出现了错误。

这是由于某些因素而可能发生的晦涩难懂的事情,还是我的应用程序特有的事情导致了奇怪的标题混搭?如果前者没有答案,我猜是后者:)

更新

对于 cmets,“it”是一个相对简单的 RESTful API 编写而成。现在它几乎总是返回正确的标题,如 400 和错误正文或 200 和 ok 正文。当错误的标头到达 Web 客户端时,Web 客户端会使用它收到的消息 ping 报告 URL,以便我们可以区分我们的 Web 应用程序和移动应用程序之间的 API 错误。据我们所知,没有任何代码组合可以使这个“400 OK”成为地狱。但鉴于在我们的代码混乱之外似乎不可能发生这种情况,我将进行更深入的研究。

更新 2

好的,我对我们的框架进行了比以往任何时候都更深入的研究,并与一些开发人员进行了交谈。

它通过API的AJAX调用将信息返回给浏览器。

浏览器检测到“400 OK”并将其发送回我们的服务器,在那里我们得到了这个奇怪的报告。没有人亲眼看到这种情况发生,但日志说它正在发生。

在我们的代码库中实际上有零代码会返回 400 OK,因为我们的 HTTP 标头处理程序中只有 400 个是“400 bad request”

我现在想知道是否有一些浏览器/jquery/ajax 错误是我偶然发现的。

UPDATE 3(因为你不能有太多信息)

我检查了浏览器是如何发现问题的。 jQuery $.ajax 报告的失败会触发回调。然后我们有这样的代码:

xhr.always(function() {
  var request = [ this.type, this.url, this.data ].join(' '),
      response = [ xhr.status, xhr.statusText, xhr.responseText ].join(' ');

  $.ajax({ 
    url   : REPORTING_URL,
    type  : 'POST', 
    data : { request : request, response : response }
  });
});

而且我们知道这“大部分”时间都有效,因为我们还收到了来自这些 ajax 调用的“400 错误”响应

更新 4

我刚刚注意到实际上所有的错误都来自用户代理:

Mozilla webkit etc...... AdobeAIR/1.5.3这是一个非常旧的版本

我们的 AIR 应用程序只有一个网络应用程序的 iframe。我只能想象那里发生了什么。

【问题讨论】:

  • 无法发回“400 OK”。这不是 HTTP 状态代码。它可以发回“400”(错误请求)。什么将其视为“OK”?也许显示 real 响应标头会很有见地..
  • 当然可以发回“400 OK”。 “它”可以发送任何“它”喜欢的东西。他甚至没有说“它”是什么!也许他自己实现了“它”。
  • @pst 为什么会这样?如果你实现它,你可以发送任何你想要的标题。
  • 基于 cmets 似乎这个应用程序的开发人员之一正在让“它”发回错误的东西,因为正如你们所说,我想,常规的旧 HTTP 永远不能发回东西像这样
  • 我建议首先 Dave Stein 说出“它”是什么,然后我们可以进行下一步。

标签: jquery http air http-headers


【解决方案1】:

好吧,我在上面的 cmets 中错了,根据 RFC 2616,Status Line 的格式为:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

RFC 继续说:

Status-Code 元素是尝试理解和满足请求的 3 位整数结果代码。这些代码在第 10 节中完全定义。原因短语旨在给出状态代码的简短文本描述。 状态代码供自动机使用原因短语供人类用户使用。客户端不需要检查或显示原因短语。

所以服务器可以返回“1.1 400 OK”。但这几乎不是一个精心挑选的原因短语。最好坚持使用状态代码列出的原因以避免这种混淆。 (也许可以避免[过度] 挑剔的客户/代理的问题。)

【讨论】:

  • 感谢您的回答,我刚刚发布了第二次更新,可能会更加清楚
  • 暂时将其标记为答案,看看我是否可以在某处的代码中找到实际原因 - 我已经搜索了 400 btw 的所有实例,而不仅仅是在我们使用的 http 标头处理程序中.
  • 在接下来的一两天内,我们将能够启动所有使用旧版本 AIR 的用户(因为所有错误仍然来自那个确切的客户端)所以如果错误消失了我必须回答我自己的问题,然后说到底做了什么。但我仍然会继续支持你:D 只是想让你保持循环,因为你有很好的答案
【解决方案2】:

在@pst 的出色答案被我标记为官方答案之后,我发现了一个更令人沮丧的答案,这对我的案例来说是 100% 正确的。

此标头是通过使用 iframe 中的网站为 Adob​​e AIR 1.5.3 的用户提供的。

在强制升级我们所有的 AIR 用户后,它消失了,因此可以安全地假设这是他们的标题报告的错误。

【讨论】:

  • 感谢发布问题:很高兴问题得到“解决” :) 那么它是不是 AIR 1.5.3 的错误/问题?
  • 自一周前强制升级以来,我的服务器没有再收到 400 个 OK 报告。因此,如果将来有人遇到这种情况,他们只需要对他们的用户做同样的事情。由于 AIR 市场已停产,因此强制更新有点棘手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2016-08-22
  • 2018-10-08
  • 2011-07-22
  • 2014-10-02
  • 2018-07-12
  • 1970-01-01
相关资源
最近更新 更多