2025-04-16 10:00:22 +08:00
|
|
|
import os
|
|
|
|
import requests
|
|
|
|
from typing import Dict, Any, Optional, TypedDict, Literal
|
|
|
|
|
|
|
|
|
|
|
|
class EndpointSchema(TypedDict):
|
|
|
|
route: str
|
|
|
|
method: Literal['GET', 'POST']
|
|
|
|
name: str
|
|
|
|
description: str
|
|
|
|
payload: Dict[str, Any]
|
|
|
|
|
|
|
|
|
2025-04-17 01:23:28 +08:00
|
|
|
class RapidDataProviderBase:
|
2025-04-16 10:00:22 +08:00
|
|
|
def __init__(self, base_url: str, endpoints: Dict[str, EndpointSchema]):
|
|
|
|
self.base_url = base_url
|
|
|
|
self.endpoints = endpoints
|
|
|
|
|
|
|
|
def get_endpoints(self):
|
|
|
|
return self.endpoints
|
|
|
|
|
|
|
|
def call_endpoint(
|
|
|
|
self,
|
|
|
|
route: str,
|
|
|
|
payload: Optional[Dict[str, Any]] = None
|
|
|
|
):
|
|
|
|
"""
|
|
|
|
Call an API endpoint with the given parameters and data.
|
|
|
|
|
|
|
|
Args:
|
|
|
|
endpoint (EndpointSchema): The endpoint configuration dictionary
|
|
|
|
params (dict, optional): Query parameters for GET requests
|
|
|
|
payload (dict, optional): JSON payload for POST requests
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
dict: The JSON response from the API
|
|
|
|
"""
|
|
|
|
if route.startswith("/"):
|
|
|
|
route = route[1:]
|
|
|
|
|
|
|
|
endpoint = self.endpoints.get(route)
|
|
|
|
if not endpoint:
|
|
|
|
raise ValueError(f"Endpoint {route} not found")
|
|
|
|
|
|
|
|
url = f"{self.base_url}{endpoint['route']}"
|
|
|
|
|
|
|
|
headers = {
|
|
|
|
"x-rapidapi-key": os.getenv("RAPID_API_KEY"),
|
|
|
|
"x-rapidapi-host": url.split("//")[1].split("/")[0],
|
|
|
|
"Content-Type": "application/json"
|
|
|
|
}
|
|
|
|
|
|
|
|
method = endpoint.get('method', 'GET').upper()
|
|
|
|
|
|
|
|
if method == 'GET':
|
|
|
|
response = requests.get(url, params=payload, headers=headers)
|
|
|
|
elif method == 'POST':
|
|
|
|
response = requests.post(url, json=payload, headers=headers)
|
|
|
|
else:
|
|
|
|
raise ValueError(f"Unsupported HTTP method: {method}")
|
|
|
|
return response.json()
|