[docs]@dataclasses.dataclassclassHttpResult:""" Result of an HTTP request. """url:str=dataclasses.field()response:httpx.Response|None=dataclasses.field(init=False)error:Exception|None=dataclasses.field(init=False)
[docs]asyncdeffetch_all_urls(urls:list[str],timeout:float=30.0,)->list[HttpResult]:""" Send multiple HTTP GET requests asynchronously and ensure all return status code 200. :param urls: List of URLs to request :param timeout: Request timeout in seconds, default is 10 seconds :returns: A list of dictionaries containing response data for each URL :raises: Exception if any request fails (non-200 status code) or an error occurs """results=[]asyncwithhttpx.AsyncClient(timeout=timeout)asclient:# Create coroutines for all requeststasks=[]forurlinurls:task=asyncio.create_task(make_request(client,url))tasks.append((url,task))# Run all requests concurrentlyforurl,taskintasks:result=awaittaskresults.append(result)returnresults
[docs]asyncdefmake_request(client:httpx.AsyncClient,url:str,)->HttpResult:""" Send single HTTP GET request :param client: httpx Async Client :param url: URL to request :returns: A :class:`HttpResult` object """result=HttpResult(url=url)try:response=awaitclient.get(url)result.response=responsetry:response.raise_for_status()result.error=Noneexcepthttpx.HTTPStatusErroraserror:result.error=errorexceptExceptionaserror:result.error=errorreturnresult