为什么我的HTTP POST请求数据字符串(可能)被错误编码?

时间:2012-09-06 20:14:23

标签: python http twisted.web

我在使用twisted.web.client.Agent ...

时遇到了一些麻烦

我认为我的帖子请求中的字符串数据没有正确格式化。我正在尝试做一些类似于这个同步代码的事情:

from urllib import urlencode
import urllib2

page = 'http://example.com/'
id_string = 'this:is,my:id:string'

req = urllib2.Request(page, data=urlencode({'id': id_string}))  # urlencode call returns 'id=this%3Ais%2Cmy%3Aid%3Astring'
resp = urllib2.urlopen(req)

以下是我现在正在构建我的代理请求的方式:

from urllib import urlencode
from StringIO import StringIO

page = 'http://example.com/'
id_string = 'my:id_string'

head = {'User-Agent': ['user agent goes here']}
data = urlencode({'id': id_string})

request = agent.request('POST', page, Headers(head), FileBodyProducer(StringIO(data)))
request.addCallback(foo)

由于我得到的HTTP响应(null JSON字符串),我开始怀疑在POST请求中没有正确编码id,但我不确定我可以做些什么呢。使用urlencode与Agent.request调用有效吗?还有另一种方法我应该编码这些东西吗?

编辑:某些IRC人员提出问题可能源于我没有发送表明数据是在url字符串中编码的标头信息。我对这种东西知之甚少......有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:3)

根据要求,这是我的回答:

带有正文的HTTP请求应该设置Content-Type标头(告诉服务器如何解释正文中的字节);在这种情况下,似乎服务器期望URL编码的数据,就像Web浏览器在填写表单时发送的那样。

urllib2.Request显然默认为您的内容类型,但扭曲的库似乎需要手动设置它。在这种情况下,您需要的内容类型为application/x-www-form-urlencoded