我想不用说,我对以下内容感到困惑。这是我在这里查询的虚假延续:HTTP 303 (SeeOther): GET Works, POST Fails我发布了另一个问题,因为其他问题主要涉及HTTP重定向,并没有解决我现在认为是潜在问题的问题。
我有一个非常简单的web.py类:
class user:
def GET(self, id):
"""List a single user"""
web.header('Cache-control', 'no-cache')
return 'wtf!!'
def POST(self, id):
"""Save an updated user"""
web.header('Cache-control', 'no-cache')
return 'wtf!!'
如果我从这个资源中获取,我会收到我那个愚蠢的'wtf !!'回复中的文字。
如果我对此资源进行POST,我会根据请求的来源获得混合结果。
考虑到Web浏览器可能添加了一些破坏了web.py的标题,我决定打开Wireshark进行调查。我发现客户总是及时收到回复。但是,我注意到Wireshark没有将对POST请求的响应识别为HTTP(这是对GET请求的响应所做的事情)。
修改 我一直在测试/排除故障,我有更多的发展。
GET和POST响应都返回到客户端,标题为“Transfer-encoding:chunked”。这意味着它不是发送整个页面,而是在它们准备就绪时发送碎片。一般格式为:
200 OK, etc
{Headers}
5 # Num. of Chars in This Chunk (in hex)
Hello
200 OK, etc
{Headers}
0 # Signifies no more chunks to come
我使用Wireshark来查找这些数据包。我注意到GET响应看起来应该如此,但POST响应似乎缺少最后一个块。因此,连接保持打开状态直到超时(因为它希望从服务器获得更多数据)。
以下是触及服务器端请求的内容。我不确定哪一个负责“分块”数据。
我现在的问题:
哪个组件实际上是“我的请求”?
为什么无法发送最后一个块(仅用于POST响应)?
答案 0 :(得分:0)
我试图复制你的问题。这一切都正常。
类别:
class User:
def GET(self, id):
"""List a single user"""
web.header('Cache-control', 'no-cache')
return 'GET' + str(id)
def POST(self, id):
"""Save an updated user"""
web.header('Cache-control', 'no-cache')
raise web.seeother('/user/2')
对于网址:
urls = (
r'/user/?(\d*)', "User",
)
当我正在进行POST(使用FF)时,这一切都正常工作。
您使用任何中间件吗?