2012-11-15 81 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