def _request(self, path, key, data, method, key_is_cik, extra_headers={}):
        """Generically shared HTTP request method.

        Args:
            path: The API endpoint to interact with.
            key: A string for the key used by the device for the API.  Either a CIK or token.
            data: A string for the pre-encoded data to be sent with this request.
            method: A string denoting the HTTP verb to use for the request (e.g. 'GET', 'POST')
            key_is_cik: Whether or not the device key used is a CIK or token.
            extra_headers: A dictionary of extra headers to include with the request.

        Returns:
            A ProvisionResponse containing the result of the HTTP request.
        """
        if method == 'GET':
            if len(data) > 0:
                url = path + '?' + data
            else:
                url = path
            body = None
        else:
            url = path
            body = data

        headers = {}
        if key_is_cik:
            headers['X-Exosite-CIK'] = key
        else:
            headers['X-Exosite-Token'] = key
        if method == 'POST':
            headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
        headers['Accept'] = 'text/plain, text/csv, application/x-www-form-urlencoded'
        headers.update(extra_headers)

        body, response = self._onephttp.request(method,
                                                url,
                                                body,
                                                headers)

        pr = ProvisionResponse(body, response)
        if self._raise_api_exceptions and not pr.isok:
            raise ProvisionException(pr)
        return pr