2012-11-15 115 views
2

我試圖在AngularJS中獲取rest api的JSON輸出。以下是我正在面臨的問題:與jsonp的AngularJS資源服務失敗

  • 其餘api url中包含端口號,AngularJS會爲其插入一個變量。我徒勞地嘗試了幾個解決方案。
  • 我遇到了JSONP方法的問題。 Rest api不在同一個域/服務器上,因此一個簡單的get不起作用。
  • 其餘api的參數是斜線分隔的,不像HTML查詢字符串。其中一個參數是電子郵件地址,我認爲'@'符號也會導致一些問題。我無法解決這個問題。

我的其他api看起來像這樣:http://myserver.com:8888/dosomething/[email protected]/arg2。示例代碼/文檔將非常有幫助。

回答

0

關於8888端口,看看,如果這個工程:

$scope.url = 'http://myserver.com:port/dosomething/:email/:arg2'; 
$scope.data = $resource($scope.url, {port:":8888", email:'[email protected]', 
       arg2: '...', other defaults here}, …) 
+0

是的,這是有效的。但我也面臨CORS問題。 –

+0

看看這些幫助與CORS:http://stackoverflow.com/questions/13007187/i-cant-make-a-delete-with-cors-and-angularjs,https://github.com/angular/angular。 js/issues/934 –

2

我這裏面臨的主要問題是有關CORS。通過禁用Chrome中的網絡安全,我獲得了$ http來從服務器檢索JSON數據 - 在啓動Chrome時使用--disable-web-security標誌。

5

我掙扎了很多這樣的問題,所以希望這將幫助別人的未來:)

JSONP需要一個回調函數,一個常見的錯誤是調用返回JSON的URL,你會得到一個未捕獲SyntaxError:意外的標記:錯誤。相反,JSONP應該返回這樣的事情(不要在這個例子中得到掛在函數名):

angular.callbacks._0({"id":4,"name":"Joe"}) 

documentation告訴你傳遞JSON_CALLBACK對URL的一個原因。這將被替換爲回調函數名稱來處理返回。每個JSONP請求都分配了一個回調函數,因此如果您執行多個請求,則可以通過angular.callbacks._1,angular.callbacks._2等處理它們。

考慮到這一點,你的要求應該是這樣的:

var url = 'http://myserver.com:8888/dosomething/[email protected]/arg2'; 
$http.jsonp(url + '?callback=JSON_CALLBACK') 
    .then(function (response) { 
     $scope.mydata = response.data; 
     ... 

然後AngularJS實際上將請求(更換JSON_CALLBACK):

http://myserver.com:8888/dosomething/[email protected]/arg2?callback=angular.callbacks._0 

一些框架有JSONP支持,但如果你的api不會自動執行,你可以從querystring中獲取回調名來封裝json。 實施例是在Node.js的:

var request = require('request'); 
var express = require('express'); 
var app = express(); 

app.get('/', function(req, res){ 
    // do something to get the json 
    var json = '{"id":4,"name":"Joe"}'; 

    res.writeHead(200, {"Content-Type": "application/javascript"}); 
    res.write(req.query.callback + '(' + json + ')'); 
    res.end(); 
}); 
app.listen(8888); 
-1
嘗試

逸出 ':' VAR URL = 'HTTP://myserver.com \:8888/dosomething/[email protected]/arg2'; 很確定我讀過關於這個地方

+0

':'字符在JSON中沒有特殊含義。這不會有什麼區別。 http://jsbin.com/xuvobi/1/edit?js,console – Quentin