Urllib2以某种方式改变了发送时的发布数据

时间:2014-02-26 03:16:35

标签: python request http-post urllib2

我正在尝试向服务器发出POST请求。但是,在发布这篇文章时,数据会在整个过程中被搞砸。

我的代码:

headers = {"Context-Type" : "application/x-www-form-urlencoded"
           "Authorization" : "Basic user pass"
values = {"query" : "select", "table" : "testtable"}
data = urllib.urlencode(values)
request = urllib2.request(url, data, headers = headers)
res = urllib2.urlopen(request)
print res.result()

然而,我注意到“数据”以某种方式改变了。它应该(当我打印时)看起来像

query=select&table=testtable

但是,当我实际发布帖子请求时,此站点会注册:

<parameter id="&#13;&#10query">select</parameter>
<parameter id="table">testtab</parameter>

所以看起来数据以某种方式移动了2个空格。这与我发布帖子请求的位置无关。任何人都有这样的错误吗?

1 个答案:

答案 0 :(得分:0)

It sounds like您的原始数据中包含回车符('\r')和换行符('\n')('&#13;''&#10;')。因此,您的密钥名称可能看起来像'query',但您可能隐藏了一些额外的字符。

您的网站应使用urlparse.parse_qs来阅读请求数据。默认情况下,该函数将忽略这两个字符:

>>> import urlparse
>>> data = '&#13;&#10;query=select&table=testtable'
>>> urlparse.parse_qs(data)
'query': ['select'], 'table': ['testtable']}
>>> # make the parsing strict:
... urlparse.parse_qs(data, strict_parsing=True)
ValueError: bad query field: ''

因此,如果您使用urlparse.parse_qs的默认参数,则会忽略这两个字符。最好的解决方案是检查您的输入并删除这些字符。