api.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import json
  2. import logging
  3. from json import JSONDecodeError
  4. import requests
  5. from hyperliquid.utils.constants import MAINNET_API_URL
  6. from hyperliquid.utils.error import ClientError, ServerError
  7. from hyperliquid.utils.types import Any
  8. class API:
  9. def __init__(self, base_url=None, timeout=None):
  10. self.base_url = base_url or MAINNET_API_URL
  11. self.session = requests.Session()
  12. self.session.headers.update({"Content-Type": "application/json"})
  13. self._logger = logging.getLogger(__name__)
  14. self.timeout = timeout
  15. def post(self, url_path: str, payload: Any = None) -> Any:
  16. payload = payload or {}
  17. url = self.base_url + url_path
  18. response = self.session.post(url, json=payload, timeout=self.timeout)
  19. self._handle_exception(response)
  20. try:
  21. return response.json()
  22. except ValueError:
  23. return {"error": f"Could not parse JSON: {response.text}"}
  24. def _handle_exception(self, response):
  25. status_code = response.status_code
  26. if status_code < 400:
  27. return
  28. if 400 <= status_code < 500:
  29. try:
  30. err = json.loads(response.text)
  31. except JSONDecodeError:
  32. raise ClientError(status_code, None, response.text, None, response.headers)
  33. if err is None:
  34. raise ClientError(status_code, None, response.text, None, response.headers)
  35. error_data = err.get("data")
  36. raise ClientError(status_code, err["code"], err["msg"], response.headers, error_data)
  37. raise ServerError(status_code, response.text)