10
votes

Angularjs Jsonp ne fonctionne pas

Je serais peut-être manquant quelque chose ici, mais je ne peux pas faire ce travail de demande JSONP, voici le code:

    [{"id": "1", "name": "John Doe"},
     {"id": "2", "name": "Lorem ipsum"},
     {"id": "3", "name": "Lorem ipsum"}]


4 commentaires

Pouvez-vous poster un plumker?


quelle réponse voyez-vous dans violdler ou firebug


La réponse n'a pas l'air correcte, il devrait s'agir d'un appel de fonction à la fonction de rappel spécifiée par la demande.


@joakimbl est correct. Ce n'est pas JSON, c'est juste JSON. Votre réponse doit être un fichier JavaScript avec l'objet littéral renvoyé à l'intérieur d'une fonction nommée après le rappel que vous avez passé.


3 Réponses :


16
votes

JSONP nécessite que vous enveloppez vos données dans un appel de fonction JavaScript. Donc, techniquement, vous retournez un fichier JavaScript et non un fichier JSON.

Les données renvoyées du serveur doivent être similaires à celles-ci: xxx

modifier : Si quelqu'un d'autre a trébuché sur des problèmes avec JSONP de Angular, veuillez également lire Cette réponse à cette question , il contient des informations utiles sur la manière de la fonctionnalité angulaire gère la fonction de rappel réelle.


1 commentaires

Résolu! Merci. TheHippo Si vous pouviez modifier votre réponse pour inclure ce que @gloopy a commenté: "angular's $ http.jsonp convertit le paramètre requête QueryString à partir de rappel = json_callback à rappel = angular.callbacks._0", donc la réponse n'est pas exactement json_callback () mais angulaire .Callbacks._0 ([{"id": "1", "nom": "john doe"}, {"id": "2", "nom": "lorem ipsum"}]); S'il y a plus d'une demande, le second JSONP convert la requête requête callback = json_callback à angular.callbacks._1 et ainsi de suite, donc dans mon cas (Server PHP) J'utilise $ _GET ['rappel'] pour obtenir le bon rappel Nom.



30
votes

@thehippo est correct les données ne doivent pas simplement être une réponse JSON simple. Voici un exemple de travail d'une demande JSONP contre un point final YouTube en angularjs.

Un couple de choses à noter dans cet exemple:

  • angulaire http.jsonp convertit le paramètre requête QueryString à partir de Callback = JSON_Callback < / Code> à Callback = angular.callbacks.0 .
  • Lorsque vous appelez le point final youtube je avais besoin de préciser au service que ce soit une demande JSONP en utilisant alt = JSON-in script au lieu de alt = JSON le querystring. Cela a été trouvé dans leur documentation.
  • comparer les résultats de Cette URL à Celui-ci Pour voir la différence entre JSON et JSONP réponse de JSON et JSONP dans votre navigateur. < / li>
  • Jetez un coup d'œil au panneau de réseau Chrome dans les outils de développement pour aider à comparer et à dépanner avec votre demande / réponse.

    Je sais que cet exemple est très spécifique mais nous espérons qu'il aide!


4 commentaires

Merci thehippo! Commentaires très utiles.


@Gloopy - Informations utiles et exemple Jsfiddle très utile pour avoir débogué mon code, merci beaucoup.


Enfin une solution qui fonctionne! Courait dans ce problème en utilisant Smarthings juste pour déposer le mot-clé ici.


Malheureusement, le service YouTube utilisé pour cet exemple ne fonctionne plus. Stackoverflow.com/a/30685729/1014710 montre que cela peut être fait avec une clé API Google Developers.



-3
votes

Si les données de réponse sont "pures" JSON, nous pouvons simplement le gérer avec http.get $ http.get angulaire. xxx

se référer à l'exemple sur w3schools


2 commentaires

Seulement si vous avez un ensemble de Cors


Cela n'a rien à voir avec JSONP du tout