在我的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的方式有关吗?
由于
答案 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)
将其包含在您的模块中:
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;