Google app engine 应用程序引擎:400-您的客户端发出了格式错误或非法的请求

Google app engine 应用程序引擎:400-您的客户端发出了格式错误或非法的请求,google-app-engine,Google App Engine,在过去的3到4周里,我一直在向AppEngine请求时遇到这个错误。某些请求(尤其是HTTP DELETE请求)从google服务器返回此错误 其他人也报告了同样的错误——我可以找到3个结果 它是由不新鲜的饼干引起的-清除你的饼干,它就会正常运行- 它是由格式错误的url引起的-我只能找到与url-中的urlfetch()空格相关的情况 无决议-偶发行为(仅限于) 我现在在每个浏览器中都能看到这种行为。我可以完全清除Chrome、Firefox、Safari中的缓存/cookie等,重新启动浏览

在过去的3到4周里,我一直在向AppEngine请求时遇到这个错误。某些请求(尤其是HTTP DELETE请求)从google服务器返回此错误

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

  • 它是由不新鲜的饼干引起的-清除你的饼干,它就会正常运行-
  • 它是由格式错误的url引起的-我只能找到与url-中的urlfetch()空格相关的情况
  • 无决议-偶发行为(仅限于) 我现在在每个浏览器中都能看到这种行为。我可以完全清除Chrome、Firefox、Safari中的缓存/cookie等,重新启动浏览器,仍然可以可靠地在相同的请求上获得此错误,因此我认为它与cookie无关。在任何情况下,我都可以使用相同的cookie发出GET、POST和PUT请求

    由于它在特定的删除请求上可靠地发生,因此最有可能出现格式错误的URL,但是我的URL非常简单,并且在dev服务器上运行良好

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

    响应头显示请求从未发送到app engine服务器(我的app engine日志证明了这一点)——成功发送到app engine服务器的请求在响应头中看起来更像这样-

    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删除请求?如果是,您的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>
    
    
    400错误请求
    谷歌
    错误
    错误的请求
    您的客户端发出了格式错误或非法的请求。
    
    
    使用HTTP删除,URI应该完全标识要删除的资源。无法在请求正文中发送其他数据:

    事实上,当appspot前端看到 包含 主体,例如你的应用程序,它们返回一个 501但是,如果你把尸体移走,那么它就有200磅重了


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

    我见过当站点身份验证不能正确或充分地解析多个浏览器用户时会发生这种情况。在ChromeOS中,解决方案是完全注销,并在仅验证主身份时访问站点。示例:Gmail和Ingress。

    Hi Drew-感谢您强调这一点-看起来肯定是问题的原因。我觉得这是一个难以置信的幼稚约束——特别是因为规范没有强制要求它。无论我的使用情况如何,删除都是一个相当复杂的操作——例如,我们是在执行硬删除还是软删除——归档呢?当然,在这种情况下,应该由服务应用程序(而不是上下文无关的web服务器)来确定200或400。我们将继续跟进谷歌的问题,这一问题似乎是基于类似的担忧重新开启的。为什么不按照惯例去做呢?GET/PUT/DELETE应该获取、创建/覆盖或删除URI标识的确切资源。所有3个的额外参数都应该放在查询字符串上。只有PUT应该有一个body,它应该是资源内容。如果删除URI并返回200,则后续的GET或DELETE应该是404。对于其他所有内容,都有POST,它的意思是“向这个URI发送一些东西,并期望发生一些事情”。如果您想一次删除两个资源,那么在POST中这样做比在delete中填充逻辑更合适。有几点-1)如果数据应该在查询字符串上编码,那么jQuery的delete impl就被破坏了。2) POST应该被用来创建一个从属于URI中指定的资源的实体——我什么也没做——POST将是一个巨大的攻击。3) 按照惯例,PUT不使用查询参数,就像DELETE没有正文一样4)我找不到任何官方声明,说明请求正文对于DELETE来说是意外的-您链接的作者似乎对规范进行了修饰。尽管如此,看起来查询字符串参数是我最好的选择。只是不喜欢:)Thx这篇文章也很有用,而且似乎在多个答案中得出结论,根据规范,它应该得到支持。你的第一个建议(清除所有数据、cookies等)奏效了,谢谢
    <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>