1

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

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

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 的新手,无法理解分配传入参数的 @ 表示法。如果这里有人可以帮助我,那就太好了。

4

2 回答 2

3

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

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

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

于 2014-03-25T02:50:24.390 回答
2

您没有提到您使用的是哪个服务器端。但是,您可能需要做的第一件事是设置 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"
}

我写了一篇关于我将 AngularJS 与 ColdFusion 集成的经验的博客文章。我一直在做的是将我的对象转换为 JSON 字符串,然后再通过网络传递它们。然后服务器端将反序列化 JSON 字符串。

这是一篇很棒的文章,与我的类似,是PHP的。

于 2014-03-24T21:58:59.727 回答