コード例 #1
0
    def get_items_from_resp(response):
        """Check response from server and get items {key: value} from it."""
        def get_extra_items(response):
            """Get extra items {key: value} that used in entities."""
            extra = {}
            if response.get("selfLink"):
                extra.update({"href": response.get("selfLink")})
            if response.get("viewLink"):
                extra.update({
                    "url":
                    environment.APP_URL + response.get("viewLink")[1:]
                })
            return extra

        resp = json.loads(response.text)
        if response.status_code == 200:  # check response from server
            if (isinstance(resp, list) and len(resp[0]) == 2
                    and isinstance(resp[0][1], dict)):
                resp = resp[0][1]  # [[201, {"k": "v"}]] to {"k": "v"}
            resp = resp.itervalues().next(
            )  # {"obj": {"k": "v"}} to {"k": "v"}
            return dict(resp.items() + get_extra_items(resp).items())
        else:
            resp_code, resp_message = resp[0]
            raise exceptions.ContentDecodingError(
                messages.ExceptionsMessages.err_server_response.format(
                    resp_code, resp_message))
コード例 #2
0
    def request(self, url, method, params=None, data=None, extra_fields=None, authenticate=True, raise_for_status=True, timeout=None):
        """This method makes HTTP requests (GET, DELETE, POST, PUT). All data exchanges between this client and the
        server instance are encoded in JSON notation.

        returns content decoded into python objects.
        """
        if not timeout:
            timeout = self._timeout
        supported_methods = ['GET', 'PUT', 'POST', 'DELETE']
        if method not in supported_methods:
                raise ValueError("Unsupported HTTP method [{0}]".format(method))
        if hasattr(self, '_api_url'):
            log.debug("_api_url: " + self._api_url)
            log.debug("url: " + url.strip('/'))
            url = urlparse.urljoin(self._api_url + '/', url.strip('/'))
        log.info("url: {0} - method: {1}".format(url, method))
        fields = {
            "Accept": "application/json",
            "Content-Type": "application/json",
            "Cache-Control": "no-cache",
            }
        if authenticate:
            fields.update({"Authorization": "{0}:{1}".format(self._username, self._password)})
        if extra_fields:
            fields.update(extra_fields)
        rsp = None
        rsp_data = None
        try:
            request = getattr(requests, method.lower())
            if data:
                rsp = request(url, params=params, data=json.dumps(data), headers=fields, timeout=timeout, verify=False)
            else:
                rsp = request(url, params=params, headers=fields, timeout=timeout, verify=False)
            if raise_for_status:
                rsp.raise_for_status()
            content_type = rsp.headers['content-type']
            log.debug("content_type: {}".format(content_type))
            if content_type != 'application/json':
                raise requests.exceptions.HTTPError("Content-Type \"{0}\" not accepted".format(content_type))
            rsp_data = rsp.json()
        except requests.exceptions.Timeout:
            log.error("HTTP request timeout")
            raise
        except requests.exceptions.HTTPError:
            log.error("HTTP request failed\n"
                      "Error response status code: {0}\n"
                      "Error response message: {1}".format(rsp.status_code, rsp.text))
            raise
        except ValueError as e:
            log.exception(e)
            raise exceptions.ContentDecodingError("Didn't receive json data\nData:{}".format(rsp.text))
        return rsp_data
コード例 #3
0
ファイル: rest_service.py プロジェクト: bdsimpteam/ggrc-core
    def get_items_from_resp(response):
        """Check response from server and get items {key: value} from it."""

        # pylint: disable=superfluous-parens
        def get_extra_items(response):
            """Get extra items {key: value} that used in entities."""
            extra = {}
            if response.get("selfLink"):
                extra.update({"href": response.get("selfLink")})
            if response.get("viewLink"):
                extra.update({
                    "url":
                    environment.APP_URL + response.get("viewLink")[1:]
                })
            return extra

        resp_text = json.loads(response.text)
        resp_status_code = response.status_code
        req_method = response.request.method
        is_query_resp = False
        # check response from server
        if resp_status_code == client.RestClient.STATUS_CODES["OK"]:
            # 'POST' request methods
            if req_method == "POST" and isinstance(resp_text, list):
                # REST API: [[201, {resp}]] to {resp}
                if len(resp_text[0]) == 2 and resp_text[0][0] == 201:
                    resp_text = resp_text[0][1]
                # QUERY API: [[{resp}]] to {resp}
                elif len(resp_text[0]) == 1 and resp_text[0] != 201:
                    is_query_resp = True
                    resp_text = resp_text[0]
            # 'PUT' request methods
            if req_method == "PUT":
                pass
        # {resp} == {key: {value}}
        if isinstance(resp_text, dict) and len(resp_text) == 1:
            # {key: {value}} to {value}
            resp_text = resp_text.itervalues().next()
            return (dict(resp_text.items() + ({}.items(
            ) if is_query_resp else get_extra_items(resp_text).items())))
        else:
            resp_code, resp_message = resp_text[0]
            raise exceptions.ContentDecodingError(
                messages.ExceptionsMessages.err_server_response.format(
                    resp_code, resp_message))