Ich verwende die $http.jsonp()
-Anforderung von winkle, die erfolgreich json zurückgibt, das in eine Funktion eingeschlossen ist:
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=jsonp_callback";
$http.jsonp(url).
success(function(data, status, headers, config) {
//what do I do here?
}).
error(function(data, status, headers, config) {
$scope.error = true;
});
Wie kann ich auf die zurückgegebenen funktionsumhüllten JSONs zugreifen/diese analysieren?
UPDATE: seit Angular 1.6
Sie können die Zeichenfolge JSON_CALLBACK nicht mehr als Platzhalter verwenden, um anzugeben, wohin der Rückrufparameterwert verschoben werden soll
Sie müssen den Callback nun folgendermaßen definieren:
$http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})
Parameter über $http.defaults.jsonpCallbackParam
ändern/aufrufen/deklarieren, Standardwert ist callback
Hinweis: Sie müssen auch sicherstellen, dass Ihre URL zur Liste der vertrauenswürdigen Adressen/Whitelists hinzugefügt wird:
$sceDelegateProvider.resourceUrlWhitelist
oder ausdrücklich vertrauenswürdig über:
$sce.trustAsResourceUrl(url)
success/error
waren veraltet.
Die
$http
alten Versprechungsmethodensuccess
underror
sind veraltet und werden in Version 1.6.0 entfernt. Verwenden Sie stattdessen die Standard-then-Methode. Wenn$httpProvider.useLegacyPromiseExtensions
auffalse
gesetzt ist, werden diese Methoden$http/legacy error
auslösen.
BENUTZEN:
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts"
var trustedUrl = $sce.trustAsResourceUrl(url);
$http.jsonp(trustedUrl, {jsonpCallbackParam: 'callback'})
.then(function(data){
console.log(data.found);
});
Vorherige Antwort: Angular 1.5.x und vorher
Alles, was Sie tun müssen, ist, callback=jsonp_callback
in callback=JSON_CALLBACK
wie folgt zu ändern:
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK";
Und dann sollte Ihre .success
-Funktion so ausgelöst werden, wie Sie es haben, wenn die Rückgabe erfolgreich war.
Auf diese Weise müssen Sie den globalen Raum nicht beschmutzen. Dies ist in der AngularJS-Dokumentation dokumentiert hier .
Matt Balls Geige wurde aktualisiert, um diese Methode zu verwenden: http://jsfiddle.net/subhaze/a4Rc2/114/
Vollständiges Beispiel:
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK";
$http.jsonp(url)
.success(function(data){
console.log(data.found);
});
Das WICHTIGSTE WICHTIGSTE DING, das ich eine ganze Weile nicht verstanden habe, ist, dass die Anforderung MUSS "callback = JSON_CALLBACK" enthält, da AngularJS die Anforderungs-URL ändert, und ersetzt eine eindeutige Kennung für "JSON_CALLBACK". Die Serverantwort muss den Wert des Parameters 'callback' verwenden, anstatt "JSON_CALLBACK" hart zu codieren:
JSON_CALLBACK(json_response); // wrong!
Da ich mein eigenes PHP Serverskript schrieb, dachte ich, ich wüsste, welchen Funktionsnamen es wollte und brauche nicht "callback = JSON_CALLBACK" in der Anfrage zu übergeben. Großer Fehler!
AngularJS ersetzt "JSON_CALLBACK" in der Anforderung durch einen eindeutigen Funktionsnamen (wie "callback = angle.callbacks._0"), und die Serverantwort muss diesen Wert zurückgeben:
angular.callbacks._0(json_response);
Das war sehr hilfreich. Angular funktioniert nicht genau wie JQuery. Es hat eine eigene jsonp () -Methode, für die tatsächlich "& callback = JSON_CALLBACK" am Ende der Abfragezeichenfolge erforderlich ist. Hier ist ein Beispiel:
var librivoxSearch = angular.module('librivoxSearch', []);
librivoxSearch.controller('librivoxSearchController', function ($scope, $http) {
$http.jsonp('http://librivox.org/api/feed/audiobooks/author/Melville?format=jsonp&callback=JSON_CALLBACK').success(function (data) {
$scope.data = data;
});
});
Anschließend können Sie {{data}} in Ihrer Angular-Vorlage anzeigen oder bearbeiten.
Dies sollte für Sie gut funktionieren, solange die Funktion jsonp_callback
im globalen Gültigkeitsbereich sichtbar ist:
function jsonp_callback(data) {
// returning from async callbacks is (generally) meaningless
console.log(data.found);
}
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=jsonp_callback";
$http.jsonp(url);
Vollständige Demo: http://jsfiddle.net/mattball/a4Rc2/ (Haftungsausschluss: Ich habe noch nie einen AngularJS-Code geschrieben.)
Sie müssen noch callback
in den Parametern einstellen:
var params = {
'a': b,
'token_auth': TOKEN,
'callback': 'functionName'
};
$sce.trustAsResourceUrl(url);
$http.jsonp(url, {
params: params
});
Dabei ist 'Funktionsname' eine stringifizierte Referenz auf eine global definierte Funktion. Sie können es außerhalb Ihres Winkelskripts definieren und dann in Ihrem Modul neu definieren.
Für das Parsen tun Sie dies-
$http.jsonp(url).
success(function(data, status, headers, config) {
//what do I do here?
$scope.data=data;
}).
Oder Sie können .__ verwenden. $ Scope.data = JSON.Stringify (Daten);
In der Angular-Vorlage können Sie es als verwenden
{{data}}
für mich funktionierten die oben genannten Lösungen nur einmal, wenn ich den Anfrageparametern "format = jsonp" hinzufügte.
Ich verwende Winkel 1.6.4 und die Antwort von subhaze hat für mich nicht funktioniert. Ich habe es ein wenig geändert und dann hat es funktioniert - Sie müssen einen von $ sce.trustAsResourceUrl zurückgegebenen Wert verwenden. Vollständiger Code:
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts"
url = $sce.trustAsResourceUrl(url);
$http.jsonp(url, {jsonpCallbackParam: 'callback'})
.then(function(data){
console.log(data.found);
});