Как передать несколько параметров для запроса aiohttp с тем же именем? - PullRequest
2 голосов
/ 03 марта 2020

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 с этими параметрами, если нет более правильного пути.

1 Ответ

2 голосов
/ 03 марта 2020
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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...