Advertisement
pecko007

Api calls

Nov 20th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.95 KB | None | 0 0
  1. from gettext import gettext as _
  2. from launcher import logger
  3. from urllib.request import urlopen, Request
  4. from urllib.parse import urlsplit, urlunsplit, urlencode
  5.  
  6.  
  7. def add_api_key(f):
  8.     """
  9.    Add api key to the request.
  10.  
  11.    :param f: Function to be decorated
  12.    :return:
  13.    """
  14.     def get_w_key(self, uri, params):
  15.         if self.api_key is not None:
  16.             msg = _('Adding API key "%s" to request') % self.api_key
  17.             logger.info(msg)
  18.             params.update({
  19.                 'api_key': self.api_key
  20.             })
  21.         return f(self, uri, params)
  22.  
  23.     return get_w_key
  24.  
  25.  
  26. class CCApi:
  27.     """
  28.    Basic API call class.
  29.  
  30.    Provides easy way to communicate with REST APIs.
  31.    """
  32.     def __init__(self, base_url, api_key):
  33.         """
  34.        Initialize object.
  35.  
  36.        :param base_url: str
  37.        :param api_key: str
  38.        """
  39.         msg = _('Initializing %s') % __class__
  40.         logger.info(msg)
  41.  
  42.         self.base_url = urlsplit(base_url)
  43.         self.api_key = api_key
  44.  
  45.     @add_api_key
  46.     def get(self, uri, params={}):
  47.         """
  48.        Call GET API method and return response.
  49.  
  50.        :param uri: str
  51.        :param params: dict
  52.        :return:
  53.        """
  54.         msg = _('GET %s') % uri
  55.         logger.info(msg)
  56.         msg = _('Params: %s') % params
  57.         logger.debug(msg)
  58.  
  59.         qs = urlencode(params)
  60.         url = urlunsplit((
  61.             self.base_url.scheme, self.base_url.netloc, uri, qs, ''
  62.         ))
  63.  
  64.         req = Request(
  65.             url,
  66.             method='GET',
  67.         )
  68.  
  69.         response = urlopen(req)
  70.         ret_response = response.read().decode('utf8')
  71.  
  72.         msg = _('Response: %s') % ret_response
  73.         logger.debug(msg)
  74.  
  75.         return ret_response
  76.  
  77.     @add_api_key
  78.     def post(self, uri, params={}):
  79.         """
  80.        Call POST API method and return response.
  81.  
  82.        :param uri: str
  83.        :param params: dict
  84.        :return:
  85.        """
  86.         msg = _('POST %s') % uri
  87.         logger.info(msg)
  88.         msg = _('Params: %s') % params
  89.         logger.debug(msg)
  90.  
  91.         qs = ''
  92.         url = urlunsplit((
  93.             self.base_url.scheme, self.base_url.netloc, uri, qs, ''
  94.         ))
  95.  
  96.         # we need to transform params dict into bytes string for Request data
  97.         # argument
  98.         #
  99.         # replacing ' to " is just for further processing of json data
  100.         # in some cases json data are considered correct only with
  101.         # " as quotation mark
  102.         data = params.__repr__().replace("'", '"').encode('ascii')
  103.  
  104.         req = Request(
  105.             url,
  106.             headers={
  107.                 'Content-Type': 'application/json'
  108.             },
  109.             method='POST',
  110.             data=data,
  111.         )
  112.  
  113.         response = urlopen(req)
  114.         ret_response = response.read().decode('utf8')
  115.  
  116.         msg = _('Response: %s') % ret_response
  117.         logger.debug(msg)
  118.  
  119.         return ret_response
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement