2

我在使用 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 响应(空 JSON 字符串),我开始怀疑 POST 请求中的 id 没有正确编码,但我不确定我能做些什么。将 urlencode 与 Agent.request 调用一起使用是否有效?我应该用另一种方式对这些东西进行编码吗?

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

4

1 回答 1

3

根据要求,这是我以答案形式发表的评论:

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

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

于 2012-09-07T01:43:36.357 回答