docs: def execute(cls, uri, http_verb, extra_headers=None, batch=False, _body=None, **kw):
          """
          if batch == False, execute a command with the given parameters and
          return the response JSON.
          If batch == True, return the dictionary that would be used in a batch
          command.
          """
          if batch:
              urlsplitter = urlparse(API_ROOT).netloc
              ret = {"method": http_verb, "path": uri.split(urlsplitter, 1)[1]}
              if kw:
                  ret["body"] = kw
              return ret
  
          if not ('app_id' in ACCESS_KEYS and 'rest_key' in ACCESS_KEYS):
              raise core.ParseError('Missing connection credentials')
  
          app_id = ACCESS_KEYS.get('app_id')
          rest_key = ACCESS_KEYS.get('rest_key')
          master_key = ACCESS_KEYS.get('master_key')
  
          url = uri if uri.startswith(API_ROOT) else cls.ENDPOINT_ROOT + uri
          if _body is None:
              data = kw and json.dumps(kw, default=date_handler) or "{}"
          else:
              data = _body
          if http_verb == 'GET' and data:
              url += '?%s' % urlencode(kw)
              data = None
          else:
              if cls.__name__ == 'File':
                  data = data
              else:
                  data = data.encode('utf-8')
  
          headers = {
              'Content-type': 'application/json',
              'X-Parse-Application-Id': app_id,
              'X-Parse-REST-API-Key': rest_key
          }
          headers.update(extra_headers or {})
  
          if cls.__name__ == 'File':
              request = Request(url.encode('utf-8'), data, headers)
          else:
              request = Request(url, data, headers)
  
          if ACCESS_KEYS.get('session_token'):
              request.add_header('X-Parse-Session-Token', ACCESS_KEYS.get('session_token'))
          elif master_key:
              request.add_header('X-Parse-Master-Key', master_key)
  
          request.get_method = lambda: http_verb
  
          try:
              response = urlopen(request, timeout=CONNECTION_TIMEOUT)
          except HTTPError as e:
              exc = {
                  400: core.ResourceRequestBadRequest,
                  401: core.ResourceRequestLoginRequired,
                  403: core.ResourceRequestForbidden,
                  404: core.ResourceRequestNotFound
                  }.get(e.code, core.ParseError)
              raise exc(e.read())
  
          return json.loads(response.read().decode('utf-8'))