使用json param的Angular http请求

时间:2014-02-13 11:36:01

标签: javascript json angularjs http

在我的RESTful api中,其中一个资源公开了一个GET方法,它接受json作为名为'query'的参数。此参数直接传递给MongoDB查询,允许用户使用mongo语法直接查询数据库。

我遇到的问题是请求总是如下:

?&query=%7B%22source%22:%22incident%22%7D 

它应该看起来像这样:

?&query={'source': 'incident'} 

这就是我发送GET请求的方式:

var query = {};
if ($scope.sourceFilter) { query.source = $scope.sourceFilter; }
    var query = JSON.stringify(query);
    $http.get('/api/feedbackEntries', {params: {limit: $scope.limit, query: query}}).success(function(data) { .......

我在其他获取请求上做同样的事情,我没有得到这个问题。

我在这里做错了吗?这与角度解析params的方式有关吗?

由于

4 个答案:

答案 0 :(得分:2)

$http docs

一样
  

参数 - {Object.<string|Object>} - 字符串或对象的映射将在网址之后转换为?key1 = value1&amp; key2 = value2。 如果该值不是字符串,则为JSONified。

我加入了后期重点。

因此,传递给query配置选项的对象的params属性是一个Object。这意味着将是JSONified,这意味着与

相同
JSON.stringify(query);

所以这个

{'source': 'incident'}

转向:

'{"source": "incident"}'

正如RFC 1738所述:

  

...只有字母数字,特殊字符“$ -_。+!*'(),”和      可以使用用于其保留目的的保留字符      在URL中未编码。

碰巧{}"不在该列表中,必须进行网址编码才能在网址中使用。在您的情况下,%7B对应{%7D对应}%22对应"

所以正在发生的事情是正常的,大多数服务器软件会自动为您解析url查询参数,因此它们会正常显示。很可能你需要以某种方式将它解析回JSON!

希望这有帮助!

答案 1 :(得分:0)

使用ngResourcengResource docs

使用RESTFul apis concider时

将其包含在您的模块中:

yourApp = angular.module('yourApp', ['ngResource'])

添加您的服务:

yourApp.factory('YourService', ['$resource', function($resource){
return $resource('link/to/your/object', {});
}]);

添加您的控制器

yourApp.controller('YourController', [$scope, 
'YourService', function($scope, YourService) {

$scope.yourData = YourService.get(); 
$scope.yourData = YourService.query(); //(When obtaining arrays from JSON.)

我发现这是使用RESTFull API的最佳方式。

答案 2 :(得分:0)

经过一番挖掘后,我想出了这个。看看我正在提出的要求:

$http.get('/api/feedbackEntries',

我看到网址没有以斜线结尾。与其他工作正常的请求相比,这是我能看到的唯一区别。所以我添加了尾部斜线,神奇地它起作用。我无法解释为什么,无论是角度还是其他地方......但这就是我解决问题的方法。

希望这有助于将来。

答案 3 :(得分:0)

下面是我用来从我的服务器获取搜索结果的代码,它适用于我发送没有JSON参数的POST请求。

var service = {
  getResult: function ({"username": "roman", "gender": "male"}) {

    var promise = $http({
      url: ServerManager.getServerUrl(),
      method: "POST",
      data: params,
      headers: {
        'Content-Type': 'application/json'
      }
    })
      .success(function (data, status, headers, config) {
      console.log('getResult success.');
      return data;

    }).error(function (data, status) {
      console.log('getResult error.');
    });

    return promise;
  }
}
return service;