Python httplib和POST

jul*_*icz 7 python http httpclient httplib envjs

我目前正在处理一段由其他人编写的代码.它用于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()
Run Code Online (Sandbox Code Playgroud)

这是一个已知问题,还是什么?我正在使用Python 2.7.不知道如何检查httplib的版本.

请不要建议将httplib替换为其他内容,除非它的内容非常相似(也许是httplib2).正如我所说的那样,代码不是我的代码,它的数量远远超过我刚刚发布的代码.重构它会导致一个重大问题.我对任何可靠的解决方法感兴趣.

编辑

调试输出:

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
Run Code Online (Sandbox Code Playgroud)

请注意,回复后的信息实际上是关于服务器回复,而不是请求本身,在这种情况下是空的.主要原因是请求体本身是空的,我可以通过获取日志来观察:

[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0
Run Code Online (Sandbox Code Playgroud)

这三行:

``
<QueryDict: {}>
<QueryDict: {}>
Run Code Online (Sandbox Code Playgroud)

在......之外:

print '`%s`' % request.raw_post_data
print request.GET
print request.POST
Run Code Online (Sandbox Code Playgroud)

在Django服务器上.所以它似乎试图发送身体但最终不发送它.

EDIT(2)

好吧,我采取了转储,它确实告诉我,在浏览器发送的消息中有一个名为"Content-Length"的附加参数,在常规使用库时已经省略了该参数.傻我.

小智 6

putrequest方法不会自动添加Content Length标头,您需要自己动手或使用该request方法.

将其添加到for循环上方的代码中:

headers['Content-Length'] = "%d"%(len('[{"id":"route"}]'))
Run Code Online (Sandbox Code Playgroud)


Cor*_*erg 5

尝试添加:

conn.set_debuglevel(1)
Run Code Online (Sandbox Code Playgroud)

到你的代码,这样你就可以看到实际发生的事情.