How do I POST urlencoded form data with $http without jQuery?

I think you need to do is to transform your data from object not to JSON string, but to url params.

From Ben Nadel’s blog.

By default, the $http service will transform the outgoing request by
serializing the data as JSON and then posting it with the content-
type, “application/json”. When we want to post the value as a FORM
post, we need to change the serialization algorithm and post the data
with the content-type, “application/x-www-form-urlencoded”.

Example from here.

$http({
    method: 'POST',
    url: url,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    transformRequest: function(obj) {
        var str = [];
        for(var p in obj)
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        return str.join("&");
    },
    data: {username: $scope.userName, password: $scope.password}
}).then(function () {});

UPDATE

To use new services added with AngularJS V1.4, see

Leave a Comment