66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
|
"""Support for RESTful API."""
|
||
|
import logging
|
||
|
|
||
|
import httpx
|
||
|
|
||
|
DEFAULT_TIMEOUT = 10
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class RestData:
|
||
|
"""Class for handling the data retrieval."""
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
method,
|
||
|
resource,
|
||
|
auth,
|
||
|
headers,
|
||
|
data,
|
||
|
verify_ssl,
|
||
|
timeout=DEFAULT_TIMEOUT,
|
||
|
):
|
||
|
"""Initialize the data object."""
|
||
|
self._method = method
|
||
|
self._resource = resource
|
||
|
self._auth = auth
|
||
|
self._headers = headers
|
||
|
self._request_data = data
|
||
|
self._timeout = timeout
|
||
|
self._verify_ssl = verify_ssl
|
||
|
self._async_client = None
|
||
|
self.data = None
|
||
|
self.headers = None
|
||
|
|
||
|
async def async_remove(self):
|
||
|
"""Destroy the http session on destroy."""
|
||
|
if self._async_client:
|
||
|
await self._async_client.aclose()
|
||
|
|
||
|
def set_url(self, url):
|
||
|
"""Set url."""
|
||
|
self._resource = url
|
||
|
|
||
|
async def async_update(self):
|
||
|
"""Get the latest data from REST service with provided method."""
|
||
|
if not self._async_client:
|
||
|
self._async_client = httpx.AsyncClient(verify=self._verify_ssl)
|
||
|
|
||
|
_LOGGER.debug("Updating from %s", self._resource)
|
||
|
try:
|
||
|
response = await self._async_client.request(
|
||
|
self._method,
|
||
|
self._resource,
|
||
|
headers=self._headers,
|
||
|
auth=self._auth,
|
||
|
data=self._request_data,
|
||
|
timeout=self._timeout,
|
||
|
)
|
||
|
self.data = response.text
|
||
|
self.headers = response.headers
|
||
|
except httpx.RequestError as ex:
|
||
|
_LOGGER.error("Error fetching data: %s failed with %s", self._resource, ex)
|
||
|
self.data = None
|
||
|
self.headers = None
|