wake-up-neo.com

Access-Control-Allow-Origin-Fehler beim Senden eines jQuery-Posts an Google-APIs

Ich habe viel über den Fehler 'Access-Control-Allow-Origin' gelesen, verstehe aber nicht, was ich beheben muss :(

Ich spiele mit der Google Moderator-API, versuche jedoch neue Serie hinzufügen Ich erhalte:

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.

Ich habe versucht, mit und ohne Rückrufparameter 'Access-Control-Allow-Origin *' in den Header einzufügen. Und ich weiß nicht, wie man hier $ .getJSON verwendet, falls zutreffend, da ich den Authorization-Header hinzufügen muss und nicht weiß, wie ich es ohne beforeCall von $ .ajax machen soll: /

Gibt es Licht für diese Dunkelheit?

Das ist der 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

Ich habe den Access-Control-Allow-Origin-Fehler behoben, bei dem der dataType-Parameter in dataType: 'jsonp' geändert und ein crossDomain: true hinzugefügt wurde

$.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

Ich hatte genau das gleiche Problem und es war nicht domänenübergreifend, sondern die gleiche Domain. Ich habe diese Zeile gerade zu der PHP-Datei hinzugefügt, die die Ajax-Anfrage bearbeitet hat.

<?php header('Access-Control-Allow-Origin: *'); ?>

Es wirkte wie ein Zauber. Vielen Dank an das Plakat

44

Ja, in dem Moment, in dem jQuery erkennt, dass die URL zu einer anderen Domain gehört, wird davon ausgegangen, dass es sich um einen domänenübergreifenden Aufruf handelt. Daher ist crossdomain:true Hier nicht erforderlich.

Beachten Sie auch, dass Sie mit $.ajax Keinen synchronen Anruf tätigen können, wenn Ihre URL zu einer anderen Domain (Cross-Domain) gehört oder Sie JSONP verwenden. Es sind nur asynchrone Anrufe zulässig.

Hinweis: Sie können den Service synchron aufrufen, wenn Sie bei Ihrer Anfrage async:false Angeben.

6
Vivek Jain

Wenn Sie bei dem Versuch, einen Dienst zu nutzen, bei dem Sie den Header Access-Control-Allow-Origin * In dieser Anwendung nicht hinzufügen können, dem Server jedoch einen Reverse-Proxy vorlegen können, kann der Fehler durch ein erneutes Schreiben des Headers vermieden werden.

Angenommen, die Anwendung wird auf dem Port 8080 ausgeführt (public domain unter www.mydomain.com ), und Sie haben den Reverse-Proxy auf demselben Host am Port abgelegt 80, dies ist die Konfiguration für Nginx Reverse Proxy:

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

In meinem Fall verursacht der Subdomainname das Problem. Hier sind Details

Ich benutzte app_development.something.com, hier unterstrichen (_) Subdomain erzeugt CORS-Fehler. Nach dem Ändern von app_development bis app-development es funktioniert gut.

0
Zero