Errore di Access-Control-Allow-Origin durante l'invio di un post jQuery alle API di Google


143

Ho letto molto per l'errore "Access-Control-Allow-Origin", ma non capisco cosa devo correggere :(

Sto giocando con l'API di Google Moderator, ma quando provo ad aggiungere nuove serie ricevo:

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.

Ho provato con e senza il parametro callback, ho provato ad aggiungere "Access-Control-Allow-Origin *" all'intestazione. E non so come usare $ .getJSON qui, se applicabile, perché devo aggiungere l'intestazione di autorizzazione e non so come farlo senza prima Chiamata da $ .ajax: /

C'è luce per questa oscurità?

Questo è il codice:

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

1
potresti per favore inserire il tuo codice un po 'più completamente? Non ho potuto eseguire il tuo codice.
Hosein Aqajani,

Risposte:


249

Ho risolto l'errore Access-Control-Allow-Origin modificando il parametro dataType in dataType: 'jsonp' e aggiungendo 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
});

20
Non credo crossDomain:truesia necessario. La mia comprensione è che è necessario solo se si effettua una richiesta sul proprio dominio ma si desidera che jQuery la tratti come una richiesta tra domini.
Alex W

7
crossDomainnon è necessario. questa è una jsonprichiesta regolare destinata alla comunicazione tra domini.
Hitautodestruct,

50
Ricevo lo stesso errore, ma voglio pubblicare la richiesta. jsonp non supporterà POST. Come posso risolvere questo?
iamjustcoder,

7
Hai anche cambiato il tuo metodo da POST a GET
Dave Baghdanov il

5
@rubdottocom cosa succede se url restituisce una risposta xml invece di json ...?
Developer Desk

43

Ho avuto esattamente lo stesso problema e non era interdominio ma lo stesso dominio. Ho appena aggiunto questa riga al file php che stava gestendo la richiesta Ajax.

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

Ha funzionato come un fascino. Grazie al poster


29
Questo è molto pericoloso. Se qualcuno riesce a iniettare javascript nella tua pagina, potrebbe facilmente "telefonare a casa" qualsiasi informazione che un utente possa fornire.
dclowd9901,

@ dclowd9901: "Non sicuro" è relativo in base allo scopo di utilizzo e alle misure osservate per impostare l' intestazione Access-Control-Allow-Origin su anonimo tra le altre ragioni.
nyedidikeke,

6

Se si verifica questo errore durante il tentativo di utilizzare un servizio che non è possibile aggiungere l'intestazione Access-Control-Allow-Origin *in tale applicazione, ma è possibile inserire un proxy inverso davanti al server, l'errore può essere evitato con una riscrittura dell'intestazione.

Supponendo che l'applicazione sia in esecuzione sulla porta 8080 (dominio pubblico su www.mydomain.com ) e che si inserisca il proxy inverso nello stesso host sulla porta 80, questa è la configurazione per il proxy inverso Nginx :

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

2
Come accennato in precedenza, l'uso di '*' è molto pericoloso.
Adaddinsane,

5
Sì, ma a seconda di cosa stai esponendo. Se stai pubblicando un'API pubblica senza autorizzazione, è così (il mio caso). Se non lo fanno, dovreste essere in uso somethig come questo: Access-Control-Allow-Origin: http://example.com.
Mariano Ruiz,

2
quando collaudo un api attraverso postino e ajax. ma la richiesta postino ha successo. ma in ajax restituisce false.
Araf,

Il postino di @Araf e altre applicazioni non attivano le protezioni CORS integrate nei browser.
SenseiHitokiri,

6

Sì, nel momento in cui jQuery vede l'URL appartenente a un dominio diverso, si presume che la chiamata sia una chiamata interdominio, quindi crossdomain:truenon è richiesta qui.

Inoltre, è importante notare che non è possibile effettuare una chiamata sincrona $.ajaxse l'URL appartiene a un dominio diverso (interdominio) o se si utilizza JSONP. Sono consentite solo chiamate asincrone.

Nota: è possibile chiamare il servizio in modo sincrono se si specifica async:falsecon la richiesta.


0

Nel mio caso il nome del sottodominio causa il problema. Ecco i dettagli

Ho usato app_development.something.com, qui il _sottodominio underscore ( ) sta creando un errore CORS. Dopo aver cambiato app_developmenta app-developmentfunziona bene.


0

C'è un piccolo trucco con php. E funziona non solo con Google, ma con qualsiasi sito Web che non controlli e non puoi aggiungere Access-Control-Allow-Origin *

Dobbiamo creare un file PHP (es. GetContentFromUrl.php ) sul nostro server web e fare un piccolo trucco.

PHP

<?php

$ext_url = $_POST['ext_url'];

echo file_get_contents($ext_url);

?>

JS

$.ajax({
    method: 'POST',
    url: 'getContentFromUrl.php', // link to your PHP file
    data: {
        // url where our server will send request which can't be done by AJAX
        'ext_url': '/programming/6114436/access-control-allow-origin-error-sending-a-jquery-post-to-google-apis'
    },
    success: function(data) {
        // we can find any data on external url, cause we've got all page
        var $h1 = $(data).find('h1').html();

        $('h1').val($h1);
    },
    error:function() {
        console.log('Error');
    }
});

Come funziona:

  1. Il tuo browser con l'aiuto di JS invierà una richiesta al tuo server
  2. Il tuo server invierà la richiesta a qualsiasi altro server e riceverà risposta da un altro server (qualsiasi sito Web)
  3. Il tuo server invierà questa risposta al tuo JS

E possiamo fare eventi su Click, mettere questo evento su qualche pulsante. Spero che questo possa aiutare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.