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))
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
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))