I've seen similar incidents such as this. However, none of them seem to encounter the same problem I am having: Making a POST request and getting a 500 Internal Server Error in response.
I'm attempting to convert either of the following AJAX or XHR that I generated from a postman command to the AngularJS method of using the $http service:
The xhr:
var data = "json=<lots of encoded text>";
            var xhr = new XMLHttpRequest();
            xhr.withCredentials = true;
            xhr.addEventListener("readystatechange", function () {
              if (this.readyState === 4) {
                console.log(this.responseText);
              }
            });
            xhr.open("POST", "https://myJenkins.com/job/Ansible_Deploy/build?token=<build_token>");
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xhr.setRequestHeader("Authorization", "Basic <auth data>");
            xhr.send(data);
The ajax:
var settings = {
                "async": true,
                "crossDomain": true,
                "url": "https://myJenkins.com/job/Ansible_Deploy/build?token=<build_token>",
                "method": "POST",
                "headers": {
                  "content-type": "application/x-www-form-urlencoded",
                  "authorization": "Basic <auth data>"
                },
                "data": {
                  "json": "<raw json text>"
                }
              };
              $.ajax(settings).done(function (response) {
                console.log(response);
              });
The broken AngularJS implementation:
var heads = new Headers();
            heads.append('Content-Type', 'application/x-www-form-urlencoded');
            heads.append('Authorization', 'Basic <auth data>');
            $http({
                url: "https://myJenkins.com/job/Ansible_Deploy/build?token=<build token>",
                method: "POST",
                data: <json object>,
                headers: heads
            }).then(function successCallback(response) {
                console.log(response.data);
            }, function errorCallback(response) {
                console.log(response.statusText);
            });
Both of the above Ajax and xhr implementations work fine. As mentioned above, the angular approach is giving me a 500 Internal Server Error.
Any ideas why this may be happening? I can provide specifics if they may help, such as information from the network tab on the chrome inspector. Just let me know what I should take a screenshot of and I'll post it here.
EDIT: As promised in the comments, my solution is below.
$http({
        url: "https://myJenkins.com/job/Ansible_Deploy/build?token=<build token>",
        method: "POST",
        data: 'json=' + JSON.stringify(data),
        headers: {
            'Accept': "*/*",
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Basic <auth data>'
        }
    }).then(function successCallback(response) {
        console.log(response.data);
    }, function errorCallback(response) {
        console.log(response.statusText);
    });
EDIT 2: If you stumble upon this question because you're also getting a 500 Internal Server Error and still don't understand how this was resolved, then it was resolved via a combination of ensuring that CORS was setup on the server containing the endpoint (indicated by Crome's inspector throwing Access-Control-* errors) as well as correctly formatting the x-www-form-urlencoded to be accepted by Jenkins, which requires the data being sent to be of the form json={"parameter":[{"name":<key>, "value":<value>}, ...]}. Furthermore, if the value of an entry is a nested then escaping is required. see this answer for more details.
 
    