我目前正在使用别人编写的一段代码。它用httplib
向服务器发出请求。它以正确的格式提供所有数据 - 例如消息正文、标头值等。
问题是,每次尝试发送 POST 请求时,数据都在那里 - 我可以在客户端看到它,但没有任何内容到达服务器。我已经阅读了库规范,用法似乎是正确的。
提取的库调用如下:
import httplib
conn = httplib.HTTPConnection('monkeylabs.pl', 80)
conn.connect()
request = conn.putrequest('POST', '/api/snippet/')
headers = {}
headers['Content-Type'] = 'application/json'
headers['User-Agent'] = 'Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03'
headers['Accept'] = '*/*'
for k in headers:
conn.putheader(k, headers[k])
conn.endheaders()
conn.send('[{"id":"route"}]')
resp = conn.getresponse()
print resp.status
print resp.reason
print resp.read()
conn.close()
这是一些已知问题还是什么?我正在使用Python 2.7。不知道如何检查 httplib 的版本。
请不要建议将 httplib 替换为其他东西,除非它非常相似(也许是 httplib2)。正如我所说,该代码不是我的,而且它的数量比我刚刚在上面发布的要多得多。重构它会导致一个大问题。我对任何可靠的解决方法感兴趣。
EDIT
调试输出:
send: 'POST /api/snippet/ HTTP/1.1\r\nHost: monkeylabs.pl\r\nAccept-Encoding: identity\r\nContent-Type: application/json\r\nAccept: */*\r\nUser-Agent: Envjs/1.618 (SpyderMonkey; U; Linux x86_64 2.6.38-10-generic; pl_PL.utf8; rv:2.7.1) Resig/20070309 PilotFish/1.3.pre03\r\n\r\n[{"id":"route"}]'
reply: 'HTTP/1.0 201 CREATED\r\n'
header: Date: Fri, 10 Jun 2011 23:54:00 GMT
header: Server: WSGIServer/0.1 Python/2.7.1+
header: Vary: Cookie
header: Content-Type: application/json
header: Content-Length: 0
201
CREATED
请注意,回复后的信息实际上谈论的是服务器回复,而不是请求本身,在本例中请求本身为空。主要原因是请求主体本身是空的,我可以通过获取日志来观察:
[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0
那三行:
``
<QueryDict: {}>
<QueryDict: {}>
out of:
print '`%s`' % request.raw_post_data
print request.GET
print request.POST
在 Django 服务器上。所以看起来它尝试发送正文但最终没有发送。
EDIT(2)
好吧,我进行了转储,它确实告诉我,在从浏览器发送的消息中,有一个名为“Content-Length”的附加参数,该参数在库的常规使用中已被省略。愚蠢的我。