我在这个问题上挣扎了很多,所以希望这对将来的人有帮助:)
JSONP 需要一个函数回调,一个常见的错误是调用一个返回 JSON 的 URL,你会得到一个Uncaught SyntaxError: Unexpected token :错误。相反,JSONP 应该返回类似这样的内容(不要纠结于示例中的函数名称):
angular.callbacks._0({"id":4,"name":"Joe"})
文档告诉您在URL 上传递 JSON_CALLBACK 是有原因的。这将被替换为回调函数名称来处理返回。每个 JSONP 请求都分配了一个回调函数,因此如果您执行多个请求,它们可能由 angular.callbacks._1、angular.callbacks._2 等处理。
考虑到这一点,您的请求应该是这样的:
var url = 'http://myserver.com:8888/dosomething/me@mydomain.com/arg2';
$http.jsonp(url + '?callback=JSON_CALLBACK')
.then(function (response) {
$scope.mydata = response.data;
...
然后 AngularJS 将实际请求(替换 JSON_CALLBACK):
http://myserver.com:8888/dosomething/me@mydomain.com/arg2?callback=angular.callbacks._0
有些框架支持JSONP,但是如果你的api没有自动做,你可以从查询字符串中获取回调名称来封装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);