def METHOD_NAME(self, uri, callname="", clearCache=False, args=None, binary=False):
    """
    Either fetch data from the cache file or query the data-service
    :param uri: The endpoint uri
    :param callname: alias for caller function
    :param clearCache: parameter to control the cache behavior
    :param args: additional parameters to HTTP request call
    :param binary: specifies request for binary object from HTTP requests (e.g. zipped content)
    :return:    A dictionary
    """
    # NOTE: Unlike the common case we are not using the callname for building
    #       apiUrl. we  are using it only for giving proper name of the cache
    #       file.
    # NOTE: The 'callname' should not contain '/', otherwise the cache is
    #       tried to be created with a a non existing subdirectory structure
    cachedApi = "%s.json" % callname
    # apiUrl = '%s?json&preset=%s' % (uri, callname)
    apiUrl = uri
    self['logger'].debug('Fetching data from %s, with args %s', apiUrl, args)
    if args:
        apiUrl = "%s&%s" % (apiUrl, urlencode(args, doseq=True))
    if clearCache:
        self.clearCache(cachedApi, args)
    results = '{}' # explicitly define results which will be loaded by json.loads below
    if binary:
        with self.refreshCache(cachedApi, apiUrl, decoder=False, binary=True) as istream:
            results = gzip.decompress(istream.read())
        return results
    else:
        with self.refreshCache(cachedApi, apiUrl) as istream:
            results = istream.read()
    results = json.loads(results)
    return results