我正在尝试向服务器发出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=" 
query">select</parameter>
<parameter id="table">testtab</parameter>
所以看起来数据以某种方式移动了2个空格。这与我发布帖子请求的位置无关。任何人都有这样的错误吗?
答案 0 :(得分:0)
It sounds like您的原始数据中包含回车符('\r'
)和换行符('\n'
)(' '
和' '
)。因此,您的密钥名称可能看起来像'query'
,但您可能隐藏了一些额外的字符。
您的网站应使用urlparse.parse_qs
来阅读请求数据。默认情况下,该函数将忽略这两个字符:
>>> import urlparse
>>> data = ' 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
的默认参数,则会忽略这两个字符。最好的解决方案是检查您的输入并删除这些字符。