2014-02-13 89 views
2

在我的REST風格的api中,其中一個資源公開了一個接受json作爲名爲'query'的參數的GET方法。該參數直接傳遞給MongoDB查詢,允許用戶使用mongo語法直接查詢數據庫。json參數的角度http請求

我遇到的問題是,請求總是看起來是這樣的:

?&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) { ....... 

我做其他的GET請求同樣的事情,我不明白這個問題。

我在這裏做錯了什麼?這是否與解析參數的方式有關?

感謝

回答

0

經過一番挖掘,我想出了這一個。看看我正在做的請求:

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

我看到url不以尾部斜線結尾。與其他正常工作的請求相比,我可以看到的唯一區別。所以我添加了最後的斜線並且奇蹟般地起作用。我無法解釋爲什麼,無論是在角度還是其他地方......但這是我如何解決問題。

希望這可以幫助未來的人。

+0

在這裏困擾我的是,如果你會使用ngResource,那將會照顧你的尾部斜槓!所以我的投票是非常非常邪惡的。 – petur

+0

哦,我非常抱歉,我認爲,並感謝您的投票。 – petur

2

$httpdocs

PARAMS - {Object.<string|Object>} - 字符串或對象的地圖,這將在URL後轉身鍵1 =值&鍵2 =值? 如果該值不是字符串,它將被JSON化。

後者的重點是由我添加。

因此,您傳遞給params配置選項的對象的query屬性是對象。這就意味着將JSONified,這意味着相同的

JSON.stringify(query); 

所以這

{'source': 'incident'} 

打開此:

'{"source": "incident"}' 

由於RFC 1738狀態:

。 ..只有字母數字,特殊字符「$ -_。+!*'(),」,和 用於其保留目的的保留字符可以用於在URL中未編碼的 。

碰巧{}"是不是名單​​上,必須URL編碼在URL中使用。在你的情況下,%7B對應於{%7D對應於}%22對應於"

所以發生了什麼是正常的,大多數服務器軟件會自動爲您解碼url查詢參數,因此它們將正常顯示。很可能你需要以某種方式將其解析回JSON!

希望這會有所幫助!

+0

嗨傑克。你是說我不應該爲GET請求添加參數嗎?我看不到這是如何違反HTTP GET請求的意思..也許我誤解了。我不認爲我應該在這裏使用POST,因爲我沒有創建任何東西,我只是根據提供的查詢從數據庫中獲取數據。 – Sherlock

+0

不,我誤解了你的問題,我會編輯回答你的問題 – jakee

+0

你走了,瞧! – jakee

0

當使用RESTful API中海外商品會有使用ngResourcengResource docs

包括它的模塊中:

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的最佳方式。

+1

不幸的是出於我無法控制的原因,我無法使用ngResource,並且我爲此項目使用了$ http。 – Sherlock

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;