如何在Python requests中以相同的键发送多个值?

44 投票
5 回答
47096 浏览
提问于 2025-04-18 04:51
requests.post(url, data={'interests':'football','interests':'basketball'})

我试过这个,但它没有成功。我该怎么在 interests 字段里发布 footballbasketball 呢?

5 个回答

0

在Python的requests库中,如果你想用同一个键发送多个值,就需要用到列表。比如,下面的代码会把“足球”和“篮球”这两个值发送到“兴趣”这个字段:

import requests

url = "https://example.com/post"
data = {"interests": ["football", "basketball"]}

response = requests.post(url, data=data)

这样就会生成一个这样的POST请求:

POST /post HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded

interests=football&interests=basketball
1

curl 命令的字符串格式是 -d 'product_ids[]=719&product_ids[]=107'。我通过添加方括号成功地形成了数据数组:

payload = [('product_ids[]', id) for id in ids_list]
response = requests.post(url, data=payload, headers=headers)
3

直接引用自文档

数据参数可以为每个键提供多个值。这可以通过将数据设置为一个包含元组的列表,或者一个值为列表的字典来实现。当表单中有多个元素使用相同的键时,这种方式特别有用:

>>> payload_tuples = [('key1', 'value1'), ('key1', 'value2')]
>>> r1 = requests.post('https://httpbin.org/post', data=payload_tuples)
>>> payload_dict = {'key1': ['value1', 'value2']}
>>> r2 = requests.post('https://httpbin.org/post', data=payload_dict)
>>> print(r1.text)
{
  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}
>>> r1.text == r2.text
True
14

可以把 urllib3._collections.HTTPHeaderDict 当作一个字典来用,这个字典的每个键下面可以有多个值:

from urllib3._collections import HTTPHeaderDict
data = HTTPHeaderDict()
data.add('interests', 'football')
data.add('interests', 'basketball')
requests.post(url, data=data)
90

字典的键 必须 是唯一的,也就是说你不能重复使用同一个键。如果你需要重复的键,可以用一系列的键值对来代替,然后把这些传给 data

requests.post(url, data=[('interests', 'football'), ('interests', 'basketball')])

另外,你也可以把 data 字典里的值设置为 列表;列表中的每个值可以作为一个单独的参数来使用:

requests.post(url, data={'interests': ['football', 'basketball']})

下面是一个向 http://httpbin.org 发送 POST 请求的示例:

>>> import requests
>>> url = 'http://httpbin.org/post'
>>> r = requests.post(url, data=[('interests', 'football'), ('interests', 'basketball')])
>>> r.request.body
'interests=football&interests=basketball'
>>> r.json()['form']
{u'interests': [u'football', u'basketball']}
>>> r = requests.post(url, data={'interests': ['football', 'basketball']})
>>> r.request.body
'interests=football&interests=basketball'
>>> r.json()['form']
{u'interests': [u'football', u'basketball']}

撰写回答