5 votes

Problèmes avec jQuery, ajax et jsonp

J'utilise jsonp et ajax pour interroger un service web écrit en java sur un autre serveur. J'utilise la commande jquery suivante :

$.ajax({
    type: "GET",
    url: wsUrl,
    data: {},
    dataType: "jsonp",
    complete: sites_return,
    crossDomain: true,
    jsonpCallback: "sites_return"
});

function jsonp_callback(data) {
    console.log(data);
}

function sites_return(data) {
    console.log(data);
}

Mon problème est qu'une fois la requête terminée, une fonction appelée jsonp_callback est appelée. Où je peux clairement voir la chaîne formatée en json :

{"listEntries":["ELEM1", "ELEM2", "ELEM3", etc...]}

Mais après l'appel de la fonction sites_return lorsque l'événement complet se déclenche, j'obtiens le résultat suivant :

Object { readyState=4, status=200, statusText="parsererror"}

De plus, pour référence, la fonction jsonp_callback est appelée avant la fonction sites_return. De plus, si je retire la fonction jsonp_callback du code, j'obtiens une plainte dans firebug indiquant que la fonction n'est pas implémentée.

Ma question est triple : 1) Qu'est-ce que je fais mal du côté de Jquery ? 2) Pourquoi le json est analysé correctement dans jsonp_callback mais pas dans sites_return ? 3) Que puis-je faire pour résoudre ces problèmes ?

EDIT

De nouveaux développements. Selon les commentaires, voici quelques informations supplémentaires.

Voici ce qui ressort de la réponse http

jsonp_callback({"listEntries":["ELEM1", "ELEM2", "ELEM3"]})

Je suppose que c'est la raison pour laquelle jsonp_callback est appelé. Je suppose que ma question est la suivante : y a-t-il un moyen de contrôler cela (en supposant que je n'ai pas accès au service web back-end) ?

2voto

Jinbom Heo Points 1301

J'espère que cela vous aidera.

var url = "http://maps.google.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=false";
var address = "1600+Amphitheatre+Parkway";
var apiKey = "+Mountain+View,+CA";

$.getJSON("http://maps.google.com/maps/geo?q="+ address+"&key="+apiKey+"&sensor=false&output=json&callback=?",
  function(data, textStatus){
     console.log(data);
  });

1voto

sv_in Points 5297

Je crois que le premier argument de la sites_return serait l'objet jqXHR. Au lieu de complete essayez d'utiliser success .

Mais cela peut encore ne pas fonctionner car il semble qu'il y ait une erreur d'analyse syntaxique (mentionnée dans la valeur de retour de la fonction sites_return appelée par oncomplete). Par conséquent, vous devez d'abord vérifier votre chaîne json.

Pour valider JSON, vous pouvez utiliser http://jsonlint.com/

1voto

Pointy Points 172438

I pensez à que le problème est que votre serveur ne se comporte pas comme jQuery l'attend. Le "protocole" JSONP n'est pas très stable, mais en général, le site est censé rechercher le paramètre "callback" et l'utiliser comme nom de fonction lorsqu'il construit la réponse JSONP. Il semble que votre serveur utilise toujours le nom de fonction "jsonp_callback".

Il est possible d'indiquer directement à jQuery que votre callback est "jsonp_callback" :

$.ajax({
    type: "GET",
    url: wsUrl,
    data: {},
    dataType: "jsonp",
    complete: sites_return,
    crossDomain: true,
    jsonpCallback: "jsonp_callback"
});

Pas sûr à 100% cependant.

0voto

Dave Ward Points 36006

Si vous n'avez pas la possibilité de modifier le wrapper de la fonction JSONP renvoyée par le serveur distant, la fonction jQuery $.ajax() peut être exagéré ici. En fin de compte, tout ce que vous faites est d'injecter une référence script à wsUrl qui fait un appel à jsonp_callback avec un objet JavaScript littéral comme paramètre d'entrée.

Vous pourriez tout aussi bien faire quelque chose comme ça et éviter la confusion autour du nommage/syntaxe de la callback :

$.getScript(wsUrl);

function jsonp_callback(response) {
  // Access the array here via response.listEntries
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X