d3.json, d3.xhr et inter-domaine des problèmes
J'ai fait plusieurs tests aujourd'hui liés à la façon dont nous pouvons nous charger des fichiers json avec d3 parce que j'ai été intrigué par cette question: d3.json fonctionne, mais $.getJson échoue. Cependant quelques-uns des tests que j'ai faits sont un peu difficile.
d3.xhr("http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*+where+%7B%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FRoger_Federer%3E+%3Fp+%3Fo+filter%28lang%28%3Fo%29+%3D+%27en%27%29%7D%0D%0A&debug=on&timeout=&format=application%2Fsparql-results%2Bjson&save=display&fname=", function(data)
console.log("success1");
alert(data);
});
d3.json("http://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*+where+%7B%3Chttp%3A%2F%2Fdbpedia.org%2Fresource%2FRoger_Federer%3E+%3Fp+%3Fo+filter%28lang%28%3Fo%29+%3D+%27en%27%29%7D%0D%0A&debug=on&timeout=&format=application%2Fsparql-results%2Bjson&save=display&fname=", function(data){ console.log("success2");
alert(data);
});
d3.xhr("http://api.worldbank.org/countries/BRA/indicators/BX.KLT.DINV.CD.WD?per_page=10&date=2007:2012&format=json", function(data){
console.log("success3");
alert(data);
})
d3.json("http://api.worldbank.org/countries/BRA/indicators/BX.KLT.DINV.CD.WD?per_page=10&date=2007:2012&format=json", function(data){
console.log("success4");
alert(data);
})
Je sais que le problème peut être lié à au moins 2 raisons: le type MIME et de la SCRO, mais je ne comprends pas plusieurs choses:
- si le rappel est toujours exécuté (même les plus difficiles, parfois avec le OK de 200 ce qui peut aussi être une erreur vu de jQuery .ajax() et .getJSON ()) pourquoi ne puis-je voir les données dans un seul cas (le premier) - le reste des cas sont toujours des erreurs?
- quels sont les types MIME supportés par d3.xhr méthode?
- si d3.json est juste une belle enveloppe pour d3.xhr pourquoi l'exemple 1, des œuvres et de l'exemple 2 ne fonctionne pas...? J'aimerais quelques éclaircissements. J'utilise principalement la d3 avec les fichiers de mon serveur, mais il y a des cas de ce genre quand je dois aussi utiliser des données externes, et ce serait vraiment gentil de faire cela aussi avec D3, pas seulement avec jQuery.
Je pense qu'il devrait y avoir une liste avec tous les types MIME acceptés par ces méthodes.
ma raison de demander c'est simple: nous allons utiliser D3 fortement liées visualisations de données dans les prochains mois
OriginalL'auteur paxRoman | 2012-05-16
Vous devez vous connecter pour publier un commentaire.
La raison pour laquelle la première demande aboutit alors que le second ne parvient pas a le faire avec une configuration de la dbpedia.org serveur. Le
d3.json()
fonction sert à deux choses:Il définit la
Accept
- tête pour le type mimeapplication/json
Il analyse la réponse à l'aide de
JSON.parse()
Le numéro 1 est le problème - la dbpedia.org serveur retourne une réponse de
406 (Unacceptable)
pour laAccept: application/json
en-tête. Je ne sais pas pourquoi cela est vrai, mais étant donné les paramètres de l'URL que vous envoyez, il semble que le serveur attendapplication/sparql-results+json
au lieu de cela - en effet, la spécification de ce mime-type avecd3.xhr()
réussit, tout en utilisantapplication/json
échoue.Avec les données de la Banque Mondiale, la demande échoue parce que le serveur n'est pas La SCRO-activé. Le seul navigateur de façon à faire un appel à une API à distance, sans la SCRO activé est d'utiliser JSONP (en supposant que l'API prend en charge). Comme il arrive, data.worldbank.com prend en charge JSONP, mais D3 n'est pas - vous devez traiter vous-même ou utiliser une 3e partie de la bibliothèque comme jQuery pour faire la demande.
En général, le D3 n'a pas priorisé vraiment robuste de l'AJAX le chemin que jQuery et d'autres bibliothèques ont, parce que ce n'est pas son attention - si vous souhaitez charger une grande variété de ressources externes, vous devriez probablement le faire avec un de la 3e partie de la bibliothèque qui a plus de soutien pour les soigneusement peaufiné les appels AJAX. En fonction de ce que vous voulez charger, l'autre option est de mettre en place un proxy sur votre propre serveur que l'on peut appeler la télécommande Api et de donner ensuite les données vers votre visualisations via un appel HTTP - totalité de D3 chargeurs devrait fonctionner correctement.
&prefix=callbackFunctionName
pour spécifier la fonction de rappel, alors que le d3.jsonp plugin attend&callback=callbackFunctionName
. Ainsi, vous pouvez modifier les lignes 10 et 24, de remplacer le motcallback
avecprefix
(voir ce pastebin). Puis créer une fonction de rappel pour être exécuté sur la réponse.OriginalL'auteur nrabinowitz
Problématique de l'exemple 1, il manque une accolade d'ouverture entre
Ça marche pour moi, une fois réécrit comme
function(data) { console
etc.OriginalL'auteur finn