【问题标题】:App Engine : 400 - Your client has issued a malformed or illegal requestApp Engine : 400 - 您的客户发出了格式错误或非法的请求
【发布时间】:2010-07-30 16:51:24
【问题描述】:

在过去 3 或 4 周向应用引擎发出请求时,我一直遇到此错误。某些请求(尤其是 HTTP DELETE 请求)会从 google 服务器返回此错误。

其他人报告了同样的错误 - 我可以找到 3 个结果

  1. 这是由过时的 cookie 引起的 - 清除您的 cookie 并且它运行良好 gmail help -
  2. 它是由格式错误的 url 引起的 - 我能找到的唯一案例与 urlfetch() 有关 - url 中的空格 - App engine Group #1, App Engine Group #2
  3. 无解决方案 - 偶发行为,仅限 IE。 App Engine Group #3, App Engine Group #4

我现在在每个浏览器中一直都出现这种行为。我可以完全清除 Chrome、Firefox、Safari 中的缓存/cookie 等,重新启动浏览器并且仍然可靠地在相同的请求上得到这个错误,所以我认为它与 cookie 无关。在任何情况下,我都可以使用同一个 cookie 发出 GET、POST 和 PUT 请求。

鉴于它在特定的 DELETE 请求上可靠地发生,格式错误的 URL 似乎最有可能,但是我的 URL 非常简单,并且在开发服务器上工作正常

Firebug 将请求标头显示为(我已经修改了键,因为它们包含识别数据,但这样做是通过从键的中心删除字符来实现的 - 不是为了保证我没有无意中删除任何前导或尾随空格)

    Request URL:http://my-app.appspot.com/agprhcjgLEgVLbm93dCItX0RrbV9Ea25vd3RfbmV0X19wccxDA/Task.xml
    Request Method:DELETE
    Status Code:400 Bad Request

    Request Headers
    Accept:*/*
    Cache-Control:max-age=0
    Content-Type:application/x-www-form-urlencoded
    Origin:http://my-app.appspot.com
    Referer:http://my-app.appspot.com/
    User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4
    X-Requested-With:XMLHttpRequest

    Form Data
    entity_key:agprdC1hcjYLEgVLbm93dCIrX09Ea25vd3RfbmV0X19wMQw

    Response Headers
    Content-Length:1350
    Content-Type:text/html; charset=UTF-8
    Date:Fri, 30 Jul 2010 15:51:58 GMT
    Server:GFE/2.0

响应标头显示该请求从未到达应用引擎服务器(我的应用引擎日志证实了这一点) - 成功到达应用引擎服务器的请求对于响应标头看起来更像这样 -

Cache-Control:no-cache
Content-Length:4332
Content-Type:application/xml
Date:Fri, 30 Jul 2010 11:08:21 GMT
Expires:Fri, 01 Jan 1990 00:00:00 GMT
Server:Google Frontend
X-AppEngine-Estimated-CPM-US-Dollars:$0.004033
X-AppEngine-Resource-Usage:ms=573 cpu_ms=146 api_cpu_ms=30

我正在使用 jquery 的 $.ajax() 方法构造请求并将类型设置为“DELETE”。此外,这些方法直到上周才有效,尽管问题开始间歇性地出现。目前,我所做的任何事情都没有任何效果。

目前我认为这是谷歌服务器上的某种配置错误/更改,慢慢蔓延到他们的网络 - 这解释了为什么它开始时断时续,稳步增加,现在一直在发生。

还有其他人能够向谷歌应用引擎发出 HTTP DELETE 请求吗?如果是,您的 URL 是否包含应用引擎实体键?你能看出我有什么不靠谱的地方吗?

任何其他指针将不胜感激。干杯,

科林

来自 google 服务器的完整响应是 -

<html><head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>400 Bad Request</title>
<style><!--
body {font-family: arial,sans-serif}
div.nav {margin-top: 1ex}
div.nav A {font-size: 10pt; font-family: arial,sans-serif}
span.nav {font-size: 10pt; font-family: arial,sans-serif; font-weight: bold}
div.nav A,span.big {font-size: 12pt; color: #0000cc}
div.nav A {font-size: 10pt; color: black}
A.l:link {color: #6f6f6f}
A.u:link {color: green}
//--></style>
<script><!--
var rc=400;
//-->
</script>
</head>
<body text=#000000 bgcolor=#ffffff>
<table border=0 cellpadding=2 cellspacing=0 width=100%><tr><td rowspan=3 width=1% nowrap>
<b><font face=times color=#0039b6 size=10>G</font><font face=times color=#c41200 size=10>o</font><font face=times color=#f3c518 size=10>o</font><font face=times color=#0039b6 size=10>g</font><font face=times color=#30a72f size=10>l</font><font face=times color=#c41200 size=10>e</font>&nbsp;&nbsp;</b>
<td>&nbsp;</td></tr>
<tr><td bgcolor="#3366cc"><font face=arial,sans-serif color="#ffffff"><b>Error</b></td></tr>
<tr><td>&nbsp;</td></tr></table>
<blockquote>
<H1>Bad Request</H1>
Your client has issued a malformed or illegal request.

<p>
</blockquote>
<table width=100% cellpadding=0 cellspacing=0><tr><td bgcolor="#3366cc"><img alt="" width=1 height=4></td></tr></table>
</body></html>

【问题讨论】:

  • 您的第一个建议(清除所有数据、cookie 等)奏效了,谢谢

标签: google-app-engine


【解决方案1】:

使用 HTTP DELETE,URI 应该完全标识要删除的资源。在请求正文中发送附加数据是意外的,and on App Engine, unsupported

确实,当应用程序前端看到 一个 DELETE 请求,其中包括 正文,例如您的应用程序,它们返回一个 501. 但是,如果你移除身体,那么它会服务于 200。

根据随后的讨论,他们似乎认为 400 比 501 更合适。无论如何,如果您省略正文并将实体键移动到 URI 中,应该没问题。

【讨论】:

  • 嗨 Drew - 感谢您强调这一点 - 看起来确实是问题的原因。我觉得这是一个非常幼稚的约束——尤其是因为规范没有强制要求。无论我的用例如何,DELETE 都是一个相当复杂的操作——例如我们是在执行硬删除还是软删除 - 归档呢?当然,在这种情况下,应该由服务应用程序(而不是不知道上下文的 Web 服务器)来确定 200 或 400。将在谷歌问题上跟进,该问题似乎已基于类似问题重新打开。谢谢。
  • 为什么不遵守约定呢? GET/PUT/DELETE 应该获取、创建/覆盖或删除由 URI 标识的确切资源。所有 3 的额外参数都应该在查询字符串上。只有 PUT 应该有一个主体,它应该是资源内容。如果你删除一个 URI 并返回 200,那么后续的 GET 或 DELETE 应该是 404。对于其他所有内容,都有 POST,它的意思是“向这个 URI 发送一些东西并期待某些事情发生”。如果您想一次删除两个资源,那么在 POST 中执行此操作比尝试将逻辑填充到 DELETE 中更合适。
  • 几点 - 1) 如果数据应该在查询字符串上编码,那么 jQuery 的 DELETE 实现被破坏。 2) POST 应该用于创建一个从属于 URI 中指示的资源的实体 - 我什至没有做任何事情 - POST 将是一个大黑客。 3) PUT 按照惯例不使用查询参数,就像 DELETE 没有正文一样 4) 我找不到任何官方声明表明请求正文对于 DELETE 来说是意外的 - 您链接中的作者似乎已经修饰规范。尽管如此,看起来查询字符串参数是我最好的选择。只是不喜欢它:) 谢谢
  • 这篇文章也很有用,并且似乎在多个答案中得出结论,应该根据规范支持它。 stackoverflow.com/questions/299628/…
【解决方案2】:

我已经看到当网站身份验证没有正确或充分地解析多个浏览器用户时会发生这种情况。在 ChromeOS 中,修复方法是完全退出,并在仅对主要身份进行身份验证时访问该站点。示例:Gmail 和 Ingress。

【讨论】:

    【解决方案3】:

    Drew Sears' Answer 是最有可能的问题。

    但是,在我们的例子中,有一个 GET 请求,它的请求正文为空 {},这导致 400 - Bad Request 错误并显示以下消息:

    您的客户发出了格式错误或非法的请求。这就是我们的全部 知道。

    GET 请求根本不应该有请求正文。

    【讨论】:

      猜你喜欢
      • 2021-12-25
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多