64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
import json
|
|
|
|
try:
|
|
# Python 3
|
|
from urllib.parse import urlencode, urlparse
|
|
except (ImportError):
|
|
# Python 2
|
|
from urllib import urlencode
|
|
from urlparse import urlparse
|
|
|
|
from .client_exception import ClientException
|
|
from ..download_manager import downloader
|
|
|
|
|
|
class JSONApiClient():
|
|
def __init__(self, settings):
|
|
self.settings = settings
|
|
|
|
def fetch(self, url, prefer_cached=False):
|
|
"""
|
|
Retrieves the contents of a URL
|
|
|
|
:param url:
|
|
The URL to download the content from
|
|
|
|
:param prefer_cached:
|
|
If a cached copy of the content is preferred
|
|
|
|
:return: The bytes/string
|
|
"""
|
|
|
|
# If there are extra params for the domain name, add them
|
|
extra_params = self.settings.get('query_string_params')
|
|
domain_name = urlparse(url).netloc
|
|
if extra_params and domain_name in extra_params:
|
|
params = urlencode(extra_params[domain_name])
|
|
joiner = '?%s' if url.find('?') == -1 else '&%s'
|
|
url += joiner % params
|
|
|
|
with downloader(url, self.settings) as manager:
|
|
content = manager.fetch(url, 'Error downloading repository.',
|
|
prefer_cached)
|
|
return content
|
|
|
|
def fetch_json(self, url, prefer_cached=False):
|
|
"""
|
|
Retrieves and parses the JSON from a URL
|
|
|
|
:param url:
|
|
The URL to download the JSON from
|
|
|
|
:param prefer_cached:
|
|
If a cached copy of the JSON is preferred
|
|
|
|
:return: A dict or list from the JSON
|
|
"""
|
|
|
|
repository_json = self.fetch(url, prefer_cached)
|
|
|
|
try:
|
|
return json.loads(repository_json.decode('utf-8'))
|
|
except (ValueError):
|
|
error_string = u'Error parsing JSON from URL %s.' % url
|
|
raise ClientException(error_string)
|