diff --git a/airtable/__init__.py b/airtable/__init__.py index 56f6d1b..c5809b9 100644 --- a/airtable/__init__.py +++ b/airtable/__init__.py @@ -6,6 +6,7 @@ import requests import six +import urllib API_URL = 'https://api.airtable.com/v%s/' API_VERSION = '0' @@ -94,18 +95,29 @@ def __init__(self, base_id, api_key, dict_class=OrderedDict): def __request(self, method, url, params=None, payload=None): if method in ['POST', 'PUT', 'PATCH']: self.headers.update({'Content-type': 'application/json'}) + + encoded_url = posixpath.join(self.base_url, urllib.parse.quote(url, safe="")) response = requests.request( - method, - posixpath.join(self.base_url, url), - params=params, - data=payload, - headers=self.headers) + method, encoded_url, params=params, data=payload, headers=self.headers + ) + if response.status_code == requests.codes.ok: return response.json(object_pairs_hook=self._dict_class) - error_json = response.json().get('error', {}) - raise AirtableError( - error_type=error_json.get('type', str(response.status_code)), - message=error_json.get('message', json.dumps(response.json()))) + + error_json = response.json() + if isinstance(error_json, dict) and "error" in error_json: + if isinstance(error_json["error"], dict): + # Expected error format + error_type = error_json["error"].get("type", str(response.status_code)) + message = error_json["error"].get("message", json.dumps(error_json)) + else: + # Handle cases where error is a simple string like "NOT_FOUND" + error_type = str(response.status_code) + message = json.dumps(error_json) + else: + error_type = str(response.status_code) + message = "Unknown error format" + raise AirtableError(error_type=error_type, message=message) def get( # pylint: disable=invalid-name self, table_name, record_id=None, limit=0, offset=None,