J'essaie d'avoir accès aux données de l'API education.com. Cependant, je continue à recevoir une erreur qui dit:
XMLHttpRequest ne peut pas charger http://api.education.com/service/service.php?f=schoolSearch&key=mykey&sn=sf&v=4&city=Atlanta&state=ga&Resf=json …. Origin n'est pas autorisé par Access-Control-Allow-Origin.
Mon code est le suivant:
$(function(){
$.getJSON('http://api.education.com/service/service.php?f=schoolSearch&key=mykey&sn=sf&v=4&city=Atlanta&state=ga&Resf=json',
function(data) {
console.log(data);
});
});
Quelqu'un peut m'aider s'il vous plaît?
Un article sur Cross Domain AJAX a été publié il y a quelque temps:
DEMANDE DE DOMAINE CROSS AJAX AVEC RÉPONSE JSON POUR IE, FIREFOX, CHROME, SAFARI - JQUERY
Le moyen le plus simple de gérer cela si vous avez le contrôle du serveur répondeur consiste à ajouter un en-tête de réponse pour:
Access-Control-Allow-Origin: *
Cela permettra AJAX inter-domaine. Dans PHP, vous voudrez modifier la réponse comme suit:
<?php header('Access-Control-Allow-Origin: *'); ?>
vous pouvez simplement mettre le paramètre Header set Access-Control-Allow-Origin * sur Apache conf ou htaccess, il fonctionne comme un charme
Note importante:
Le caractère générique permettra à n'importe quel domaine d'envoyer des demandes à votre hôte. Je recommande de remplacer l'astérisque par un domaine spécifique sur lequel vous exécuterez des scripts.
Vous ne pouvez le faire avec un navigateur que si le serveur education.com est configuré pour autoriser les demandes CORS (Cross-Origin Resource Sharing
) (c'est le bit Access-Control-Allow-Origin
).
Votre serveur peut toutefois faire la demande en votre nom et vous pouvez ensuite récupérer les données à partir de là.
Dans ZF1 peut être fait comme ci-dessous:
public function indexAction() {
$turnkey = array(
"uris" => array("176.x.x:3478", "3478"),
"username" => "my_username",
"password" => "my_password"
);
$content = Zend_Json::encode($turnkey);
$this->getResponse()
->setHeader('Access-Control-Allow-Origin', "*")
->setHeader('Content-Type', 'application/json')
->setBody($content)
->sendResponse();
exit;
}
Pas tellement une solution au problème, mais un hack pour éviter le problème - démarrez votre navigateur sans sécurité Web:
in MacOS this would work as follows: cd to ../../Applications/Google\ Chrome.app/Contents/MacOS
then start the brwoser with the appropiate flag: Google\ Chrome --disable-web-security'
Remarque: n'utilisez jamais le navigateur pour surfer normalement, c'est simplement pour vous aider à prendre les devants en cas d'urgence!