Je passe un appel JSONP entre domaines à l'aide du code suivant:
jQuery.ajax({
async: true,
url: 'http://mnews.hostoi.com/test.json',
dataType: 'jsonp',
method: "GET",
error: function (jqXHR, textStatus, errorThrown) {
console.log(textStatus + ': ' + errorThrown);
},
success: function (data, textStatus, jqXHR) {
if (data.Error || data.Response) {
exists = 0;
}
}
});
Lors du débogage dans Firebug, j'obtiens l'erreur suivante:
SyntaxError: missing ; before statement
Cependant, lorsque je transmets mon objet json (disponible via le lien dans le code JQ) via un outil tel que jsonlint.com, il indique qu'il s'agit d'un JSON valide. Et je ne trouve pas non plus d'anomalies. Comment pourrait-il retourner une erreur de syntaxe? Est-ce un détail JSONP que je ne reçois pas ou quoi?
{"news":[ {
"sentences": [
"Neuroscientists have discovered abnormal neural activity...",
"The researchers found that these mice showed many symptoms...",
"\"Therefore,\" the study authors say, \"our findings provide a novel.."
],
"summaryId": "ZJEmY5",
"title": "Abnormal neural activity linked to schizophrenia"
}]}
Merci d'avance.
JSONP n'est pas JSON. Une réponse JSONP serait constituée d'un script JavaScript contenant uniquement un appel de fonction (à une fonction prédéfinie) avec un argument (qui est un littéral d'objet JavaScript conforme à la syntaxe JSON).
La réponse que vous obtenez est JSON, pas JSONP. Vos efforts pour le gérer en tant que JSONP échouent.
Remplacez dataType: 'jsonp'
par dataType: 'json'
(ou supprimez entièrement la ligne, le serveur émet le type de contenu correct, vous n'avez donc pas besoin de le remplacer).
Étant donné que votre script s'exécute sur une origine différente du code JSON, vous devrez également effectuer les étapes (la plupart, mais pas toutes, nécessitant que vous contrôliez l'hôte servant le code JSON) pour résoudre le problème identique. Politique d'origine .
L'erreur est due au fait qu'il renvoie JSON et non JSONP.
JSONP est censé ressembler à
someCallBackString({ The Object });
Voici l'exemple de travail
$.ajax({
type: 'GET',
url: 'http://xxx.amazonaws.com/file.json',
dataType: 'jsonp',
jsonpCallback: 'callback',
success: function(json){
console.log(json);
}
});
Et vous devriez mettre callback
au début de votre file.json
comme:
callback({"item":{".......
Comme epascarello a souligné , la réponse JSONP doit être envoyée comme suit:
callBackFunction({ JSON Object })
Et la fonction appelant peut alors être configurée comme suit:
var url = "http://someremoteurl.com/json";
$.getJSON(url + "?callback=?", null, function(data) {
callBackFunction(data);
});
Vous pouvez ensuite parcourir les données de réponse en tant que:
function callBackFunction(data)
{
console.log(data);
}
Si vous utilisez le paramètre " callback =? ", votre réponse côté serveur devrait ressembler à ceci:
$_callback = $_GET['callback'];
echo $_callback . '(' . json_encode(YOUR_VARIABLE) . ');';
Si le paramètre " callback =? " n'est pas défini, votre réponse devrait ressembler à ceci:
echo '[' . json_encode($_return_array) . ']';
Si la question concerne Ruby, alors dans votre contrôleur, assurez-vous de rendre le format correctement. Exemple:
def view_product
data = Product.find params[:id]
render :json => data, :callback => params[:callback]
end
Dans votre méthode de rendu, vous devriez avoir le paramètre: callback sinon il sera rendu en json au lieu de jsonp.