web-dev-qa-db-fra.com

Erreur Access-Control-Allow-Origin lors de l'envoi d'une publication jQuery aux API Google

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 -->
136
rubdottocom

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
});
237
rubdottocom

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

44
Muhammad Tanweer

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.

6
Vivek Jain

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 *;
    }   
}
6
Mariano Ruiz

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.

0
Zero