我挣扎了很多这样的问题,所以希望这将帮助别人的未来:)
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);
是的,这是有效的。但我也面临CORS问题。 –
看看这些帮助与CORS:http://stackoverflow.com/questions/13007187/i-cant-make-a-delete-with-cors-and-angularjs,https://github.com/angular/angular。 js/issues/934 –