class_docstr: Base class for all app integrations to be implemented for various services
docstr: Method for returning the json loaded response for this POST request
  
  Returns:
      tuple (bool, dict|None): The first return value will be False if there
          was an error performing the request.
          The second return value will be None if JSONDecodeError raised,
          otherwise it will be the dictionary loaded from the json response.
docstr_tok: ["Method","for","returning","the","json","loaded","response","for","this","POST","request","Returns",":","tuple","(","bool",",","dict|None",")",":","The","first","return","value","will","be","False","if","there","was","an","error","performing","the","request",".","The","second","return","value","will","be","None","if","JSONDecodeError","raised",",","otherwise","it","will","be","the","dictionary","loaded","from","the","json","response","."]
code: def _make_post_request(self, full_url, headers, data, is_json=True):
      """Method for returning the json loaded response for this POST request
  
      Returns:
          tuple (bool, dict|None): The first return value will be False if there
              was an error performing the request.
              The second return value will be None if JSONDecodeError raised,
              otherwise it will be the dictionary loaded from the json response.
      """
      LOGGER.debug(
          "[%s] Making POST request on poll #%d", self, self._poll_count
      )
  
      # Perform the request and return the response as a dict
      if is_json:
          response = requests.post(
              full_url,
              headers=headers,
              json=data,
              timeout=self._DEFAULT_REQUEST_TIMEOUT,
          )
      else:
          # if content type is form-encoded, the param is 'data' rather than 'json'
          response = requests.post(
              full_url,
              headers=headers,
              data=data,
              timeout=self._DEFAULT_REQUEST_TIMEOUT,
          )
  
      try:
          return self._check_http_response(response), response.json()
      except JSONDecodeError:
          # https://github.com/airbnb/streamalert/issues/998
          # When response returns Gateway Timeout with status_code 504, the response
          # object will return empty string and raises JSONDecoderError a when .json() refers to.
          # See https://github.com/psf/requests/blob/v2.22.0/requests/models.py#L853
          # Instead of raising exception, we can just return False, None
          return False, None
  
imports: from abc import ABCMeta, abstractmethod, abstractproperty
  from json import JSONDecodeError
  import time
  import boto3
  from botocore.exceptions import ClientError
  import requests
  from streamalert.apps.config import AppConfig
  from streamalert.apps.batcher import Batcher
  from streamalert.shared.logger import get_logger
label_desc: Use image node_id 17 for calling the AppIntegration obj's underlying member method code with example usage: obj._make_post_request(full_url, headers, data, is_json) and returns: self,  response, False,  None