如何在aiohttp请求中传递多个相同名称的参数?

4

我希望从API接收数据,该API将多个具有相同名称的值作为参数:

https://example.com/method?types=Retail&types=Office&types=Industrial......

我尝试像这样做:

params_api_sale = {
    'types': [
        'Retail', 'Office', 'Industrial', 
        'Mixed Use', 'Development Site', 
        'Land', 'Special Purpose', 'Other'
    ],
    'sortDirection': 'Descending',
    'sortOrder': 'ActivatedOn'
}

async def get_items():
    async with aiohttp.request(
        method='GET', url=vars_.url_api_sale, 
        headers=vars_.headers, params=vars_.params_api_sale) as response:
        ...

但是这给我一个错误:
Traceback (most recent call last):
  File "foo.py", line 85, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "C:\Python37\lib\asyncio\base_events.py", line 583, in run_until_complete
    return future.result()
  File "foo.py", line 80, in main
    await asyncio.create_task(get_items())
  File "foo.py", line 44, in get_items
    headers=vars_.headers, params=vars_.params_api_sale) as response:
  File "D:\Dev\venv\lib\site-packages\aiohttp\client.py", line 1051, in __aenter__
    self._resp = await self._coro
  File "D:\Dev\venv\lib\site-packages\aiohttp\client.py", line 473, in _request
    ssl=ssl, proxy_headers=proxy_headers, traces=traces)
  File "D:\Dev\venv\lib\site-packages\aiohttp\client_reqrep.py", line 263, in __init__
    url2 = url.with_query(params)
  File "D:\Dev\venv\lib\site-packages\yarl\__init__.py", line 922, in with_query
    new_query = self._get_str_query(*args, **kwargs)
  File "D:\Dev\venv\lib\site-packages\yarl\__init__.py", line 886, in _get_str_query
    quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query.items()
  File "D:\Dev\venv\lib\site-packages\yarl\__init__.py", line 886, in <genexpr>
    quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query.items()
  File "D:\Dev\venv\lib\site-packages\yarl\__init__.py", line 864, in _query_var
    "of type {}".format(v, type(v))
TypeError: Invalid variable type: value should be str or int, got ['Retail', 'Office', 'Industrial', 'Mixed Use', 'Development Site', 'Land', 'Special Purpose', 'Other'] of type <class 'list'>

我没有找到一个记录的方法来做到这一点。我所能想到的就是生成一个带有这些参数的URL字符串,当然,如果没有更正确的方法的话。
2个回答

4
import requests

params = {
    'types': [
        'Retail', 'Office', 'Industrial',
        'Mixed Use', 'Development Site',
        'Land', 'Special Purpose', 'Other'
    ],
    'sortDirection': 'Descending',
    'sortOrder': 'ActivatedOn'
}

r = requests.get("http://www.test.com/", params=params)

print(r.url)

输出:

https://www.test.com/?types=Retail&types=Office&types=Industrial&types=Mixed+Use&types=Development+Site&types=Land&types=Special+Purpose&types=Other&sortDirection=Descending&sortOrder=ActivatedOn

对于aiohttp,您可以使用在官方文件中也包含的MultiDict

对于传输具有相同键的多个值的数据,也可以使用MultiDict


4
根据aiohttp文档所述,您可以将一系列元组传递给params来实现您的目标:

同时,您也可以将由2个项组成的元组列表作为参数传递,这样您就可以为每个键指定多个值:

params = [
    ("key1", "value1"),
    ("key1", "value2"),
    ("key2", "value3"),
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接