Je lis beaucoup pour l'erreur 'Access-Control-Allow-Origin', mais je ne comprends pas ce que je dois corriger :(
Je joue avec l'API Google Moderator, mais lorsque j'essaie de ajouter une nouvelle série je reçois:
XMLHttpRequest cannot load
https://www.googleapis.com/moderator/v1/series?key=[key]
&data%5Bdescription%5D=Share+and+rank+tips+for+eating+healthily+on+the+cheaps!
&data%5Bname%5D=Eating+Healthy+%26+Cheap
&data%5BvideoSubmissionAllowed%5D=false.
Origin [my_domain] is not allowed by Access-Control-Allow-Origin.
J'ai essayé avec et sans paramètre de rappel, j'ai essayé d'ajouter 'Access-Control-Allow-Origin *' à l'en-tête. Et je ne sais pas comment utiliser $ .getJSON ici, le cas échéant, car je dois ajouter l'en-tête Authorization et je ne sais pas comment le faire sans beforeCall de $ .ajax: /
Toute lumière pour cette obscurité, u.u?
C'est le code:
<script src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
var scope = "https://www.googleapis.com/auth/moderator";
var token = '';
function create(){
if (token == '')
token = doCheck();
var myData = {
"data": {
"description": "Share and rank tips for eating healthily on the cheaps!",
"name": "Eating Healthy & Cheap",
"videoSubmissionAllowed": false
}
};
$.ajax({
url: 'https://www.googleapis.com/moderator/v1/series?key='+key,
type: 'POST',
callback: '?',
data: myData,
datatype: 'application/json',
success: function() { alert("Success"); },
error: function() { alert('Failed!'); },
beforeSend: setHeader
});
}
function setHeader(xhr) {
xhr.setRequestHeader('Authorization', token);
}
function doLogin(){
if (token == ''){
token = google.accounts.user.login(scope);
}else{
alert('already logged');
}
}
function doCheck(){
token = google.accounts.user.checkLogin(scope);
return token;
}
</script>
...
...
<div data-role="content">
<input type="button" value="Login" onclick="doLogin();">
<input type="button" value="Get data" onclick="getModerator();">
<input type="button" value="Create" onclick="create();">
</div><!-- /content -->
J'ai résolu l'erreur d'accès Access-Control-Allow-Origin en modifiant le paramètre dataType en dataType: 'jsonp' et en ajoutant un crossDomain: true
$.ajax({
url: 'https://www.googleapis.com/moderator/v1/series?key='+key,
data: myData,
type: 'GET',
crossDomain: true,
dataType: 'jsonp',
success: function() { alert("Success"); },
error: function() { alert('Failed!'); },
beforeSend: setHeader
});
J'ai eu exactement le même problème et ce n'était pas interdomaine mais le même domaine. Je viens d'ajouter cette ligne au fichier php qui traitait la requête ajax.
<?php header('Access-Control-Allow-Origin: *'); ?>
Ça a marché comme sur des roulettes. Merci à l'affiche
Oui, dès que jQuery voit que l'URL appartient à un domaine différent, il considère cet appel comme un appel interdomaine. Ainsi, crossdomain:true
n'est pas nécessaire ici.
De plus, il est important de noter que vous ne pouvez pas effectuer d'appel synchrone avec $.ajax
si votre URL appartient à un autre domaine (interdomaine) ou si vous utilisez JSONP. Seuls les appels asynchrones sont autorisés.
Remarque: vous pouvez appeler le service de manière synchrone si vous spécifiez le async:false
avec votre demande.
Si vous rencontrez cette erreur en essayant de consommer un service auquel vous ne pouvez pas ajouter l'en-tête Access-Control-Allow-Origin *
dans cette application, mais que vous pouvez mettre devant le serveur un proxy inverse, vous pouvez éviter l'erreur en réécrivant l'en-tête.
En supposant que l'application s'exécute sur le port 8080 (domaine public à l'adresse www.mydomain.com ) et que vous mettez le proxy inverse dans le même hôte au port 80, c'est la configuration pour Nginx proxy inverse:
server {
listen 80;
server_name www.mydomain.com;
access_log /var/log/nginx/www.mydomain.com.access.log;
error_log /var/log/nginx/www.mydomain.com.error.log;
location / {
proxy_pass http://127.0.0.1:8080;
add_header Access-Control-Allow-Origin *;
}
}
Dans mon cas, le nom de sous-domaine cause le problème. Voici les détails
J'ai utilisé app_development.something.com
, ici le trait de soulignement (_
) crée une erreur CORS. Après avoir changé app_development
en app-development
, cela fonctionne correctement.