53 lines
1.6 KiB
Python
53 lines
1.6 KiB
Python
import requests
|
|
from qgis.core import QgsMessageLog, Qgis
|
|
|
|
|
|
class ApiClient:
|
|
"""Fetches location records from the external REST API."""
|
|
|
|
def __init__(self, base_url: str):
|
|
self.base_url = base_url.rstrip("/")
|
|
|
|
def fetch_locations(self) -> list[dict]:
|
|
"""GET /api/locations and return a list of location dicts.
|
|
|
|
Each dict contains: id (int), name (str), latitude (float), longitude (float).
|
|
|
|
Raises:
|
|
requests.RequestException: on any network or HTTP error.
|
|
ValueError: if the response body is not valid JSON or missing expected keys.
|
|
"""
|
|
url = f"{self.base_url}/api/locations"
|
|
try:
|
|
response = requests.get(url, timeout=1)
|
|
response.raise_for_status()
|
|
except requests.HTTPError as exc:
|
|
QgsMessageLog.logMessage(
|
|
f"HTTP error fetching locations from {url}: {exc}",
|
|
"BAPEBridge",
|
|
Qgis.Warning,
|
|
)
|
|
raise
|
|
except requests.RequestException as exc:
|
|
QgsMessageLog.logMessage(
|
|
f"Network error fetching locations from {url}: {exc}",
|
|
"BAPEBridge",
|
|
Qgis.Warning,
|
|
)
|
|
raise
|
|
|
|
try:
|
|
data = response.json()
|
|
except ValueError as exc:
|
|
QgsMessageLog.logMessage(
|
|
f"Invalid JSON in locations response: {exc}",
|
|
"BAPEBridge",
|
|
Qgis.Warning,
|
|
)
|
|
raise
|
|
|
|
if not isinstance(data, list):
|
|
raise ValueError(f"Expected a JSON array, got {type(data).__name__}")
|
|
|
|
return data
|