我想在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的新手,我无法理解分配传入参数的@符号。如果有人在这里帮助我,那就太好了。
答案 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。