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



我想要从中接收数据的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:Python37libasynciobase_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:Devvenvlibsite-packagesaiohttpclient.py", line 1051, in __aenter__
self._resp = await self._coro
File "D:Devvenvlibsite-packagesaiohttpclient.py", line 473, in _request
ssl=ssl, proxy_headers=proxy_headers, traces=traces)
File "D:Devvenvlibsite-packagesaiohttpclient_reqrep.py", line 263, in __init__
url2 = url.with_query(params)
File "D:Devvenvlibsite-packagesyarl__init__.py", line 922, in with_query
new_query = self._get_str_query(*args, **kwargs)
File "D:Devvenvlibsite-packagesyarl__init__.py", line 886, in _get_str_query
quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query.items()
File "D:Devvenvlibsite-packagesyarl__init__.py", line 886, in <genexpr>
quoter(k) + "=" + quoter(self._query_var(v)) for k, v in query.items()
File "D:Devvenvlibsite-packagesyarl__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

对于发送具有相同密钥的多个值的数据,也可以使用MultiDict。

正如aiohttp文档中所述,您可以使用相同的密钥将元组列表传递给params以实现您的目标:

还可以将2项元组的列表作为参数传递,在这种情况下,您可以为每个键指定多个值:

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

最新更新