2012-12-24 53 views
2

我想执行一个简单的动作:HTTP 303(SeeOther):GET工程,POST失败

  1. POST到一个URL
  2. 返回HTTP 303(SeeOther)的新URL
  3. GET

从我可以告诉,这是一个相当标准的做法: http://en.wikipedia.org/wiki/Post/Redirect/Get

而且,它似乎SeeOther设计这样的工作方式: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4

我使用web.py作为我的服务器端控制,但我怀疑这不是问题。如果我GET,SeeOther完美无瑕地按预期工作。如果我POST到相同的URL,浏览器根本无法重定向或加载任何东西。

我以为这是一个浏览器的问题,我都尝试IE9和谷歌Chrome(V23 ISH)。两者都有同样的问题。

思考web.py可能会错误地服务页面,或产生不良URL,我用telnet来检查标头。我发现这一点:

HTTP GET(这部作品在浏览器):

GET /Users/1 HTTP/1.1 
HOST: domain.com 

HTTP/1.1 303 See Other 
Date: Mon, 24 Dec 2012 18:07:55 GMT 
Server: Apache/2 
Cache-control: no-cache 
Location: http://domain.com/Users 
Content-Length: 0 
Content-Type: text/html 

HTTP POST(这不会在浏览器中运行):

POST /Users/1 HTTP/1.1 
HOST: domain.com 

HTTP/1.1 303 See Other 
Date: Mon, 24 Dec 2012 18:12:35 GMT 
Server: Apache/2 
Cache-control: no-cache 
Location: http://domain.com/Users 
Content-Length: 0 
Content-Type: text/html 

可能被抛另一件事一个扳手在作品中: 我使用的是mod-rewrite,因此用户可见的domain.com/Users/1实际上是domain.com/control.py/Users/1

可能有更多的i我有信息/故障排除,但现在我正在画空白。

问题:

为什么这个工作,一个GET请求,而不是POST请求?我在某处丢失了一个响应标题吗?

编辑:

使用IE9开发者工具和浏览器的检查,它看起来像303不回来了一个POST后,浏览器。但是,当我执行GET请求时,我可以看到303进来。

然而,在Chrome的督察更加紧密地看后,我看到记录每个请求(不清除瓦特/每个页面调用)的能力。这让我看到了,由于某种原因,我的POST请求看起来像它的失败。再次 - GET工作得很好。

+0

你在Chrome Inspector中看到了什么? 303是否收到客户端?例如,如果您有重定向循环,则Chrome会在控制台中显示错误。 –

+0

@JanusTroelsen更新了问题以包含问题的答案。另外,这是我在这里的第一个问题,所以我不知道在评论中回答是否更合适。我想把更多的细节放在这个问题上让未来的读者更容易... – Dan

+0

没关系。 POST请求如何失败? –

回答

1

这是完全可能的,这不是你的问题,但因为你没有你的代码贴,我会采取射击(以防万一)。

由于您使用web.py,你有你的对象上定义的POST方法?

urls = (
    '/page', 'page' 
) 

class page: 

    def POST(self): 
     # Do something 

    def GET(self): 
     # Do something else 
+0

我忘了更新这个问题 - 我发现问题不在重定向。根本问题实际上是浏览器无法完全接收来自我的webpy应用程序的POST请求。我发现问题很明显,我创建了另一个线程:http://stackoverflow.com/questions/14132343/http-post-response-fails-using-web-py – Dan