首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python httplib和POST

Python httplib和POST
EN

Stack Overflow用户
提问于 2011-06-10 23:12:45
回答 3查看 47.5K关注 0票数 7

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

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

提取的库调用如下:

代码语言:javascript
复制
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()

这是已知的问题还是什么?我正在使用Python2.7。不知道如何检查httplib的版本。

请不要建议将httplib替换为其他东西,除非它是非常类似的东西(可能是httplib2)。正如我所说的,代码不是我的,它的数量比我刚才发布的要多得多。重构会导致一个大问题。我对任何可靠的解决办法都感兴趣。

编辑

调试输出:

代码语言:javascript
复制
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

请注意,回复后的信息实际上讨论的是服务器回复,而不是请求本身,在本例中,请求本身是空的。主要原因是请求体本身是空的,我可以通过获取日志观察到:

代码语言:javascript
复制
[11/Jun/2011 01:54:00] "POST /api/snippet/ HTTP/1.1" 201 0

这三行:

代码语言:javascript
复制
``
<QueryDict: {}>
<QueryDict: {}>

从:

代码语言:javascript
复制
print '`%s`' % request.raw_post_data
print request.GET
print request.POST

在Django服务器上。因此,它似乎试图发送身体,但最终没有发送它。

编辑(2)

好的,我做了一个转储,它确实告诉我,在从浏览器发送的消息中有一个名为“内容长度”的附加参数,这个参数在库的常规使用中被省略了。我真傻。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-10 23:38:14

试着添加:

代码语言:javascript
复制
conn.set_debuglevel(1)

到您的代码中,这样您就可以看到实际发生了什么。

票数 5
EN

Stack Overflow用户

发布于 2012-03-02 19:07:03

putrequest方法不会自动添加内容长度标头,您需要自己去做,或者使用request方法。

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

代码语言:javascript
复制
headers['Content-Length'] = "%d"%(len('[{"id":"route"}]'))
票数 6
EN

Stack Overflow用户

发布于 2011-06-10 23:41:09

你查过httplib文档了吗?httplib是一个标准的Python库,Python也非常适合在线文档:http://docs.python.org/library/httplib.html

该页中的示例:

代码语言:javascript
复制
>>> import httplib, urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> headers = {"Content-type": "application/x-www-form-urlencoded",
...            "Accept": "text/plain"}
>>> conn = httplib.HTTPConnection("musi-cal.mojam.com:80")
>>> conn.request("POST", "/cgi-bin/query", params, headers)
>>> response = conn.getresponse()
>>> print response.status, response.reason
200 OK
>>> data = response.read()
>>> conn.close()

你的例子似乎比这更有意义,如果你读了API文档--比如putrequest --你会发现你在你的样本中使用它是错误的。具体来说,默认情况下它会自动添加Accept标头。

尝试使您的代码更像函数示例,也尝试理解代码中使用的调用和在工作示例中使用的调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6312938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档