如何将JSON对象传递给angularjs中的资源

时间:2014-03-24 21:49:41

标签: javascript json angularjs angularjs-service angularjs-resource

我想在POST请求中使用一个接受JSON对象(该对象绑定两个数组)的Web服务,并返回一个JSON对象数组。

我现在想从AngularJS向web服务发送请求。这是我的代码:

wellApp.factory('Search', ['$resource',function($resource){

    return $resource('/filetables/searchdata/:tagSearchInput',
            {
            },
            {
                searchData:{
                    method:'POST',
                    isArray: true,
                    params:{ tag: '@tagSearchInput.tag',
                            details: '@tagSearchInput.details'
                    }
                }
            })

}])


function myWellsCtrl($scope,$resource, Wells, Tags, Search) {

    $scope.wellSearchResult = Search.searchData({tag: ["TypeOfWell"],
                                                 details: ["Vertical"]});
};

如果我这样做,我在服务器端得到一个NullPointerException,这意味着我传递的参数将被传递为null。

如何传入此对象,以便服务器将它们解释为包含两个数组的对象。我是AngularJS的新手,我无法理解分配传入参数的@符号。如果有人在这里帮助我,那就太好了。

2 个答案:

答案 0 :(得分:3)

您不应该在searchData中包含params,因为JSON将在POST请求的正文中发送。尝试从searchData中删除它们。然后在您的控制器中,尝试像这样调用您的服务:

Search.searchData({}, {tag: ["TypeOfWell"], details: ["Vertical"]})

请注意{}作为第一个参数,即您的请求的参数。第二个{}用于有效载荷。这将在请求有效负载而不是params中发送您的JSON。如果这对您不起作用,请告诉我。我做了类似于你正在做的事情,这种方式对我有用。

答案 1 :(得分:1)

您没有提到您正在使用的服务器端。但是,您可能需要做的第一件事是设置HTTP标头内容类型。我通常在$ http对象上全局设置它,如下所示:

$http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

使用默认的content-type标头,表单参数不会作为表单参数附加到请求,也不能作为服务器端代码的表单参数访问。

第二,这:

{ 
  tag: '@tagSearchInput.tag',
  details: '@tagSearchInput.details'
}

不是有效的JSON对象。属性名称必须用双引号括起来。在这里他们没有包含在内。属性值也必须用单引号括起来;在这里,它们用单引号括起来。

我认为应该是一个有效的JavaScript对象;但它不是JSON。你可以在这里调整它:

{ 
  "tag": "@tagSearchInput.tag",
  "details": "@tagSearchInput.details"
}

我写了一篇关于我的经历integrating AngularJS with ColdFusion的博文。我一直在做的是将我的对象转换为JSON字符串,然后再将它们传递给线路。然后服务器端将反序列化JSON字符串。

这是一篇很棒的帖子,类似于我的帖子,PHP focused