Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Unable to get multiple response requests on aiohttp

I am trying to pull multiple responses requests using aiohttp but I am getting an attribute error.

My code looks like this, I had to obscure it because I am using a private api.

import aiohttp
import asyncio

async def get_data(session, x):
    try:
        async with session.get(url=f'https://api.abc.com/{x}') as response:
            data = await response.json()
            return data.json()
    except Exception as e:
        print("Unable to get url {} due to {}.".format(ticker, e.__class__))

async def main(datas):
    async with aiohttp.ClientSession() as session:
        ret = await asyncio.gather(*[get_data(data, session) for data in datas])
        return ret

datas = ['x1', 'x2', 'x3', 'x4'] 
resukts = asyncio.run(main(datas))

My error looks like this,

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Unable to get url <aiohttp.client.ClientSession object at 0x1013f6ee0> due to <class 'AttributeError'>.
Unable to get url <aiohttp.client.ClientSession object at 0x1013f6ee0> due to <class 'AttributeError'>.
Unable to get url <aiohttp.client.ClientSession object at 0x1013f6ee0> due to <class 'AttributeError'>.
Unable to get url <aiohttp.client.ClientSession object at 0x1013f6ee0> due to <class 'AttributeError'>.

What am I doing wrong?

I was expecting to get the response from the api in parallel or asynchronously.

>Solution :

Try like this

import aiohttp
import asyncio

async def get_data(session, x):
    try:
        async with session.get(url=f'https://api.abc.com/{x}') as response:
            data = await response.json()
            return data  # Return the parsed JSON data directly, no need for .json()
    except Exception as e:
        print("Unable to get url {} due to {}.".format(x, e.__class__))

async def main(datas):
    async with aiohttp.ClientSession() as session:
        ret = await asyncio.gather(*[get_data(session, data) for data in datas])  # Pass session and data in the correct order
        return ret

datas = ['x1', 'x2', 'x3', 'x4'] 
results = asyncio.run(main(datas))  # Correct the variable name to "results"

The OP is asking for a way to return the result in a dict format:
this is how you can do it :

import aiohttp
import asyncio

async def get_data(session, x):
    try:
        async with session.get(url=f'https://api.abc.com/{x}') as response:
            data = await response.json()
            return data
    except Exception as e:
        print("Unable to get url {} due to {}.".format(x, e.__class__))
        return None

async def main(datas):
    async with aiohttp.ClientSession() as session:
        ret = await asyncio.gather(*[get_data(session, data) for data in datas])
        return {datas[i]: ret[i] for i in range(len(datas))}  # Return the results as a dictionary

datas = ['x1', 'x2', 'x3', 'x4']
results = asyncio.run(main(datas))
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading