Python httplib和POST [英] Python httplib and POST

查看:131
本文介绍了Python httplib和POST的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在处理一段由其他人编写的代码。它使用 httplib 向服务器发出请求。它以正确的格式提供所有数据 - 例如消息正文,标题值等。

I am currently working with a piece of code that has been written by somebody else. It uses httplib to make requests to server. It has all the data supplied in a correct format - for example message body, header values, etc.

问题是每次尝试发送POST请求时,数据在那里 - 我可以在客户端看到它,但是没有任何东西到达服务器。我已经阅读了库规范并且用法似乎是正确的。

The problem is that each time it attempts to send a POST requests, the data is there - I can see it on the client side, however nothing arrives to the server. I've read through the library specification and the usage seems to be correct.

提取的库调用如下:

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的版本。

Is this some known issue, or what? I'm using Python 2.7. Not sure how to check the version of httplib.

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

Please don't suggest to exchange httplib for something else unless it's something really similar (httplib2 perhaps). As I said, the code isn't mine and it comes in much greater amounts than what I've just posted above. Refactoring it would cause a major problem. I'm interested in any reliable workarounds.

编辑

调试输出:

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

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

Note that the information after reply actually talks about the server reply, not the request itself, which in this case is empty. The primary cause is that the request body itself is empty which I can observe by getting a log:

[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服务器上的

。所以它似乎试图发送身体但最终没有发送它。

on the Django server. So it seems it attempts to send the body but doesn't send it in the end.

编辑(2)

好的,我拿了转储它确实告诉我,在浏览器发送的消息中有一个名为'Content-Length'的附加参数,在常规使用中省略了图书馆。傻我。

Ok, I took a dump and it indeed told me that in the message sent from the browser there is an additional parameter called 'Content-Length' which has been omitted in the regular usage of the library. Silly me.

推荐答案

尝试添加:

conn.set_debuglevel(1)

到您的代码,这样您就可以看到实际的内容发生了。

to your code so you can see what is actually happening.

这篇关于Python httplib和POST的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆