[英]HTTP JSONP request issue with $http in AngularJS
當我嘗試在angularJS中使用JSONP
方法時出現以下錯誤。
未捕獲到的SyntaxError:意外令牌: http : //example.com/getSomeJson? format=jsonp&json_callback=angular.callbacks._0
我在這里做錯了什么,這是我的AngularJs控制器(帶有http請求):
請參見下面的代碼片段,它再現了我的問題,我評論了一些.js
來說明到目前為止我已經嘗試過的內容。
var app = angular.module('app', []); app.controller('mainController', ['$http', 'mainService', function($http, mainService){ mainCtrl = this; mainCtrl.test = "If you can see this the mainController works" var promise = mainService.getJson(); promise.then(function (data) { mainCtrl.json = data; }); }]); app.service("mainService", function ($http, $q) { var deferred = $q.defer(); /* // Method to Grab JSON that has CORs enabled: // JSON resource with CORs enabled var url = 'https://jsonplaceholder.typicode.com/posts/1'; $http({ method: 'GET', cache: true, url: url, headers: { 'Content-Type': 'application/json;charset=UTF-8' } }). success(function(response) { //your code when success deferred.resolve(response); console.log('HTTP CORS SUCCESS!'); }). error(function(response) { //your code when fails console.log('HTTP CORS ERROR!'); }); */ /* */ // Method to Grab JSON that has CORs enabled: // JSON resources without CORs enabled var url = 'http://run.plnkr.co/plunks/v8xyYN64V4nqCshgjKms/data-1.json' // does not work? // var url = 'http://samcroft.co.uk/json-data/sample' // this one works $http({ method: 'jsonp', url: url + '?callback=JSON_CALLBACK', }). success(function(response) { //your code when success deferred.resolve(response); console.log('JSONP SUCCESS!'); }). error(function(response) { //your code when fails console.log('JSONP ERROR!'); }); this.getJson = function () { return deferred.promise; }; });
<!DOCTYPE html> <html lang="en" ng-app="app"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular-route.js"></script> <script src="app.js"></script> </head> <body ng-controller="mainController as mainCtrl"> <p>{{mainCtrl.test}}</p> <hr /> <p>You should also see the JSON obeject below:</p> {{mainCtrl.json}} </body> </html>
app.controller('testController', ['$scope', '$http', function($scope, $http){
var url = 'http://example.com/getSomeJson';
$http({
method: 'JSONP',
url: url,
params: {
format: 'jsonp',
json_callback: 'JSON_CALLBACK'
}
}).
success(function(data) {
//your code when success
$scope.data = data;
console.log('SUCCESS!');
}).
error(function(status) {
//your code when fails
console.log('ERROR!');
});
}]);
當我在chromes來源面板中查看json時,會看到錯誤突出顯示的位置。
知道我在做什么錯嗎? 還是API服務的配置方式有問題?
干得好 :-)
您嘗試使用jsonp
請求的代碼看起來不錯,但是您使用的url不支持jsonp
請求,這就是為什么會出錯的原因。
如果您使用$http.get
嘗試相同的URL,它將正常工作。
為了支持jsonp
調用,響應應使用JSON_CALLBACK ()
包裝,如下所示
JSON_CALLBACK ({ /* JSON */ })
因此,我將其更改為有效的jsonp
url並成功了!
https://angularjs.org/greet.php?callback=JSON_CALLBACK
您可以在瀏覽器中嘗試此url並查看響應,以及如何使用JSON_CALLBACK ()
包裝它。
但是,如果您嘗試使用以下網址,則可以看到json
而不進行任何包裝。
http://run.plnkr.co/plunks/v8xyYN64V4nqCshgjKms/data-1.json?callback=JSON_CALLBACK
這就是確定api是否支持jsonp
的區別。
另外,我使用與另一個SO
問題答案相同的語法更改了以下service
,
https://stackoverflow.com/a/41030976/7055233
工作片段 :
var app = angular.module('app', []); app.controller('mainController', ['$http', 'mainService', function($http, mainService){ mainCtrl = this; mainCtrl.test = "If you can see this the mainController works" var promise = mainService.getJson(); promise.then(function (data) { mainCtrl.json = data; }); }]); app.service("mainService", function ($http, $q) { var deferred = $q.defer(); var url = 'https://angularjs.org/greet.php'; //var url = 'http://run.plnkr.co/plunks/v8xyYN64V4nqCshgjKms/data-1.json'; /* // Method to Grab JSON that has CORs enabled: // JSON resource with CORs enabled var url = 'https://jsonplaceholder.typicode.com/posts/1'; $http({ method: 'GET', cache: true, url: url, headers: { 'Content-Type': 'application/json;charset=UTF-8' } }). success(function(response) { //your code when success deferred.resolve(response); console.log('HTTP CORS SUCCESS!'); }). error(function(response) { //your code when fails console.log('HTTP CORS ERROR!'); }); */ /* */ // Method to Grab JSON that has CORs enabled: // JSON resource without CORs enabled function getJson() { // $http.jsonp(url + "?callback=JSON_CALLBACK"). // this does not work either $http.jsonp(url + '?callback=JSON_CALLBACK'). then(function(response) { //your code when success deferred.resolve(response); console.log('JSONP SUCCESS!'); }, function(response) { //your code when fails console.log('JSONP ERROR!'); deferred.reject(response); }); return deferred.promise; } this.getJson = getJson; });
<!DOCTYPE html> <html lang="en" ng-app="app"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular.min.js"></script> <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular-route.js"></script> <!--<script src="app.js"></script>--> </head> <body ng-controller="mainController as mainCtrl"> <p>{{mainCtrl.test}}</p> <hr /> <p>You should also see the JSON obeject below:</p> {{mainCtrl.json}} </body> </html>
jsonpCallbackParam
指定 突破性變化
您不能再在JSONP請求中使用
JSON_CALLBACK
占位符。 相反,您必須提供查詢參數的名稱,該參數將通過config對象的jsonpCallbackParam
屬性傳遞回調,或通過$http.defaults.jsonpCallbackParam
屬性在應用程序范圍內"callback"
,默認情況下為"callback"
。
-添加到AngularJS v1.6.0-rc.2
OP的示例代碼不起作用,因為http://run.plnkr.co
API不支持JSONP。
JSONP僅在某些帶有ACCESS-CONTROL標頭的API的網站上可用。
有關更多信息,請參見JSONP揭秘
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.