23

I need to pass an array of object from my Angular application to a .Net web service with Nancy framework.

I tried this :

function TestCtrl($scope, $http){
    $scope.postTest = function(){

        var data = [obj1, obj2, obj3];

        $http({
            url: 'myURL',
            method: "POST",
            data: data,
            headers: {
                     'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
            }
        }).success(function(data){
            alert("done");
        });
    }
}

But server send 500 Internal server error.
I don't know why it doesn't work. I'm not an expert web service expert but I think it's a serialization problem.

Can someone help me?

axvo
  • 829
  • 2
  • 12
  • 25

4 Answers4

34

According to this post, you're right, this is about serialization. Angular doesn't automatic serialize the data for you, you need to parse the data before sending it:

...

$http({
  url: 'myURL',
  method: "POST",
  data: $.param(data),
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
  }
})...

If you don't use jQuery, you'll need to roll your own $.parse. There is a snippet here or you could adapt jQuery implementation.

Community
  • 1
  • 1
Caio Cunha
  • 23,326
  • 6
  • 78
  • 74
  • 3
    Thank for your answer, but $.param doesn't work, an error says it's not defined – axvo Apr 29 '13 at 12:00
  • 3
    This is a jQuery call. AngularJs doesn't provide a solution out of the box :(. [Here is something about it](https://github.com/angular/angular.js/issues/1743). If you don't use jQuery, [here](http://stackoverflow.com/questions/1714786/querystring-encoding-of-a-javascript-object) is a snippet to achieve the encoding. I'll update the answer. – Caio Cunha Apr 29 '13 at 12:07
  • it works fine for a simple object, but with an array of objects, it doesn't work. However, I think now it's a server-side problem... – axvo Apr 29 '13 at 14:08
21
angular.toJson(data)

should work in place of

$.param(data)
fauverism
  • 1,970
  • 3
  • 33
  • 59
8

fauverism is right, you can use angular.toJson(data). Not instead, but before $.param though.

function TestCtrl($scope, $http){
$scope.postTest = function(){

    var data = [obj1, obj2, obj3];
    var jsonData=angular.toJson(data);
    var objectToSerialize={'object':jsonData};

    $http({
        url: 'myURL',
        method: "POST",
        data: $.param(objectToSerialize),
        headers: {
                 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        }
    }).success(function(data){
        alert("done");
    });
}

}

Community
  • 1
  • 1
3

you can use $httpParamSerializer or $httpParamSerializerJQLike

$http(
    url: 'myURL',
    method: "POST",
    data: $httpParamSerializer(data),
)
Ben Hsieh
  • 340
  • 1
  • 8