如何为具有相同名称的aiohttp请求传递多个参数?

How to pass multiple parameters for aiohttp request wit the same name?

我要从中接收数据的 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字符串,当然如果没有更正确的方法的话。

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,官方文档中也有。

For sending data with multiple values for the same key MultiDict may be used as well.

aiohttp documentation 所述,您可以使用相同的键将元组列表传递给 params 以实现您的目标:

Also it is possible to pass list of 2 items tuples as parameters, in that case you can specifiy multiple values for each key:

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