【问题标题】:Urllib2 is somehow changing my post data on sendUrllib2 以某种方式更改了我发送的帖子数据
【发布时间】:2014-02-26 03:16:34
【问题描述】:

我正在尝试向服务器发出 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 个空格。这与我在哪里发帖请求无关。有人遇到过这样的错误吗?

【问题讨论】:

    标签: python request http-post urllib2


    【解决方案1】:

    It sounds like 您的原始数据中有回车符 ('\r') 和换行符 ('\n')('&amp;#13;''&amp;#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 一起使用,那么这两个字符将被忽略。最好的解决方案是检查您的输入并删除这些字符。

    【讨论】:

    • 我的输入是程序创建的字符串,它们不包含这两个符号。此外,当我打印 request.get_data() 时,它会显示正确的字符串:query=select&table=testtable
    • 那么听起来您网站的代码没有正确读取数据。能贴出接收和处理 POST 请求的代码吗?
    • 我不控制服务器,同样的效果在多个完全独立的服务器上也出现过。
    • 好吧,我想我没有主意了。或许看到这个问题的其他人会有一些想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多