Python请求发送不发送字符串

时间:2014-09-29 16:26:53

标签: python http post python-requests

所以我试图用Python将一个简单的东西发布到我的页面上。

r = requests.Session().post(
    'http://mypage.com/add?token=%s&title=%s&opt=&opt=true&token=%s' % (token, title, token),
    headers = headers,
    proxies = proxy,
    timeout = max_timeout,
    )

问题是:如果是title,例如Hello World!,则效果很好,但如果titleHello World! Visit www.google.com则无法正常工作。

我到目前为止发现的是title字符串如果包含标点符号则不会发送,在这种情况下www.google.com有两个.所以它不会发布... < / p>

这在Python中是正常的吗?我还尝试使用urllib.quote urllib.urlencode等等,但结果相同......

此外,如果你问我为什么不在data = mydata内使用post()对象是因为,如果你注意到了,我使用了参数tokenopt两次,所以如果我像这样制作一个data对象:

data = {
    "token": token,
    "title": "title",
    "opt": "",
    "opt": 'value',
    "token": token
}

显然它不会起作用,因为它有重复的key值。

1 个答案:

答案 0 :(得分:3)

您正在发布一个空主体,并且仅使用查询参数。 requests可以在请求参数和POST正文中发送重复的密钥。您所要做的就是使用一系列键值元组而不是字典:

params = [
    ("token", token),
    ("title", "title"),
    ("opt", ""),
    ("opt", 'value'),
    ("token": token),
]

当用作查询参数或application / x-www-form-urlencoded POST正文时,这些将被编码。

要将这些作为POST正文发送,请使用data关键字参数:

requests.post('http://mypage.com/add', data=params,
              headers = headers, proxies = proxy, timeout = max_timeout)

或使用params将这些作为查询参数发送(在网址中):

requests.post('http://mypage.com/add', params=params,
              headers = headers, proxies = proxy, timeout = max_timeout)