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




json example (5)

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

Ich spiele mit Google Moderator API, aber wenn ich versuche, eine neue Serie hinzuzufügen, erhalte ich:

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 probierte mit und ohne Callback-Parameter, ich habe versucht, 'Access-Control-Allow-Origin *' zum Header hinzuzufügen. Und ich weiß nicht, wie man $ .getJSON hier benutzt, wenn es angewendet wird, weil ich den Berechtigungsheader hinzufügen muss und ich nicht weiß, wie man es ohne beforeCall von $ .ajax macht: /

Irgendein Licht für diese Dunkelheit, Uu?

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

Answers

In meinem Fall verursacht der Sub-Domain-Name das Problem. Hier sind Details

Ich benutzte app_development.something.com , hier Unterstreichung ( _ ) Sub-Domain erstellt CORS Fehler. Nach dem Ändern von app_development in app-development funktioniert es gut.


Ja, in dem Moment, in dem jQuery sieht, dass die URL zu einer anderen Domäne gehört, geht sie davon aus, dass der Aufruf als crossdomain:true Aufruf, also crossdomain:true hier nicht erforderlich ist.

Beachten Sie auch, dass Sie keinen synchronen Aufruf mit $.ajax wenn Ihre URL zu einer anderen Domäne (domänenübergreifend) gehört oder Sie JSONP verwenden. Nur Async-Aufrufe sind erlaubt.

Hinweis: Sie können den Dienst synchron aufrufen, wenn Sie mit Ihrer Anfrage async:false angeben.


Wenn dieser Fehler bei dem Versuch auftritt, einen Dienst zu verwenden, dem Sie den Header Access-Control-Allow-Origin * in dieser Anwendung nicht hinzufügen können, Sie aber einen Reverse-Proxy vor den Server stellen können, kann der Fehler mit einem Header vermieden werden umschreiben.

Angenommen, die Anwendung wird auf dem Port 8080 (öffentliche Domäne unter www.mydomain.com ) ausgeführt, und Sie setzen den Reverseproxy in demselben Host auf Port 80 ein. Dies ist die Konfiguration für den Nginx Reverseproxy:

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 *;
    }   
}

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

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

Es hat wie ein Zauber funktioniert. Danke an das Poster


Gelöst mit unter Eintrag in httpd.conf

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]




jquery ajax rest jsonp google-api