J'utilise la requête $http.jsonp()
d'angular qui renvoie avec succès json enveloppé dans une fonction:
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;
});
Comment accéder/analyser le JSON function-wrapped-retourné?
UPDATE: depuis Angular 1.6
Vous ne pouvez plus utiliser la chaîne JSON_CALLBACK en tant qu'espace réservé pour spécifier l'emplacement de la valeur du paramètre de rappel.
Vous devez maintenant définir le rappel comme suit:
$http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})
Changer/accéder/déclarer un paramètre via $http.defaults.jsonpCallbackParam
, par défaut à callback
Remarque: Vous devez également vous assurer que votre URL est ajoutée à la liste de confiance/liste blanche:
$sceDelegateProvider.resourceUrlWhitelist
ou explicitement approuvé via:
$sce.trustAsResourceUrl(url)
success/error
were obsolète.
Les méthodes de promesse
$http
héritéessuccess
eterror
sont obsolètes et seront supprimées à partir de la version 1.6.0. Utilisez la méthode standard then à la place. Si$httpProvider.useLegacyPromiseExtensions
est défini surfalse
, ces méthodes jetteront$http/legacy error
.
UTILISATION:
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);
});
Réponse précédente: Angular 1.5.x et avant
Tout ce que vous devez faire est de changer callback=jsonp_callback
en callback=JSON_CALLBACK
comme suit:
var url = "http://public-api.wordpress.com/rest/v1/sites/wtmpeachtest.wordpress.com/posts?callback=JSON_CALLBACK";
Et ensuite, votre fonction .success
devrait se déclencher comme si le retour avait abouti.
En procédant ainsi, vous éviterez de salir l’espace mondial. Ceci est documenté dans la documentation AngularJS ici .
Le violon de Matt Ball a été mis à jour pour utiliser cette méthode: http://jsfiddle.net/subhaze/a4Rc2/114/
Exemple complet:
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);
});
Le La chose la plus importante Je ne comprenais pas depuis longtemps est que la requêteDOITcontient "callback = JSON_CALLBACK", car AngularJS modifie la requête url, en substituant un identifiant unique "JSON_CALLBACK". La réponse du serveur doit utiliser la valeur du paramètre 'callback' au lieu du code "JSON_CALLBACK":
JSON_CALLBACK(json_response); // wrong!
Étant donné que j'écrivais mon propre script de serveur PHP, je pensais connaître le nom de la fonction qu'il souhaitait et qu'il n'était pas nécessaire de passer "callback = JSON_CALLBACK" dans la demande. Grosse erreur!
AngularJS remplace "JSON_CALLBACK" dans la demande par un nom de fonction unique (du type "callback = angular.callbacks._0"), et la réponse du serveur doit renvoyer cette valeur:
angular.callbacks._0(json_response);
C'était très utile. Angular ne fonctionne pas exactement comme JQuery. Il possède sa propre méthode jsonp (), qui nécessite en effet "& callback = JSON_CALLBACK" à la fin de la chaîne de requête. Voici un exemple:
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;
});
});
Ensuite, affichez ou manipulez {{data}} dans votre modèle angulaire.
Cela devrait fonctionner parfaitement pour vous, tant que la fonction jsonp_callback
est visible dans la portée globale:
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);
Démo complète: http://jsfiddle.net/mattball/a4Rc2/ (disclaimer: je n'ai jamais écrit de code AngularJS auparavant)
Vous devez toujours définir callback
dans les paramètres:
var params = {
'a': b,
'token_auth': TOKEN,
'callback': 'functionName'
};
$sce.trustAsResourceUrl(url);
$http.jsonp(url, {
params: params
});
Où 'functionName' est une référence sous forme de chaîne à une fonction définie globalement. Vous pouvez le définir en dehors de votre script angulaire, puis le redéfinir dans votre module.
Pour analyser cela -
$http.jsonp(url).
success(function(data, status, headers, config) {
//what do I do here?
$scope.data=data;
}).
Ou vous pouvez utiliser `$ scope.data = JSON.Stringify (data);
Dans le modèle angulaire, vous pouvez l'utiliser comme
{{data}}
pour moi, les solutions ci-dessus ne fonctionnaient qu'une fois lorsque j'ai ajouté "format = jsonp" aux paramètres de la demande.
J'utilise un angulaire 1.6.4 et la réponse fournie par subhaze n'a pas fonctionné pour moi. Je l'ai un peu modifié, puis cela a fonctionné - vous devez utiliser la valeur renvoyée par $ sce.trustAsResourceUrl. Code complet:
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);
});