App Engine:400 - 您的客户发出了格式错误或非法的请求

时间:2010-07-30 16:51:25

标签: google-app-engine

我在过去3或4周内遇到此错误,向app引擎发出请求。某些请求 - 特别是HTTP DELETE请求,从谷歌服务器返回此错误。

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

  1. 这是由陈旧的Cookie引起的 - 清除您的Cookie并且运行良好gmail help -
  2. 这是由格式错误的网址引起的 - 只有我能找到的与urlfetch()相关的案例 - 网址中的空格 - App engine Group #1App Engine Group #2
  3. 没有决议 - 零星的behaiour,IE只。 App Engine Group #3App Engine Group #4
  4. 我现在在每个浏览器中都会一直得到这种行为。我可以完全清除Chrome,Firefox,Safari中的缓存/ cookie等,重新启动浏览器并仍然可靠地在相同的请求中得到此错误,因此我认为其cookie不相关。在任何情况下,我都可以发出GET,POST& PUT请求同一个cookie没问题。

    鉴于它在特定的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”。此外,这些问题最近一直在上周进行,尽管问题开始出现间歇性问题。现在,我所做的一切都没有任何效果。

    目前我认为这是谷歌服务器上的某种配置错误/变化,慢慢地穿过他们的网络 - 这解释了为什么它开始间歇性地,稳定地增加,现在一直在发生。

    是否有其他人能够向Google App引擎发出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>
    

3 个答案:

答案 0 :(得分:17)

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

  

确实,当appspot前端看到时   包含一个的DELETE请求   身体,如你的应用程序,他们返回一个   但是,如果你移除身体,那么它将服务200。

根据随后的讨论,看起来他们认为400比501更合适。无论如何,如果省略正文并将实体密钥移动到URI中,那么你应该没问题。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

<块引用>

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

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