Eu li muito sobre o erro 'Access-Control-Allow-Origin', mas não entendo o que tenho que corrigir :(
Estou brincando com a API do Google Moderator, mas quando tento adicionar uma nova série , recebo:
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.
Tentei com e sem o parâmetro de retorno de chamada, tentei adicionar 'Access-Control-Allow-Origin *' ao cabeçalho. E não sei como usar $ .getJSON aqui, se for o caso, porque tenho que adicionar o cabeçalho de autorização e não sei como fazê-lo sem beforeCall de $ .ajax: /
Alguma luz para esta escuridão uu?
Esse é o código:
<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 -->
Respostas:
Resolvi o erro Access-Control-Allow-Origin modificando o parâmetro dataType para dataType: 'jsonp' e adicionando um crossDomain: true
fonte
crossDomain:true
é necessário. Pelo que entendi, isso só é necessário se você estiver fazendo uma solicitação em seu próprio domínio, mas quiser que o jQuery trate isso como uma solicitação entre domínios.crossDomain
Não é necessário. essa é umajsonp
solicitação regular que se destina à comunicação entre domínios.Eu tinha exatamente o mesmo problema e não era um domínio cruzado, mas o mesmo domínio. Acabei de adicionar esta linha ao arquivo php que estava manipulando a solicitação ajax.
Funcionou como um encanto. Graças ao pôster
fonte
Se você tiver esse erro ao tentar consumir um serviço que não pode adicionar o cabeçalho
Access-Control-Allow-Origin *
nesse aplicativo, mas poderá colocar na frente do servidor um proxy reverso, o erro poderá ser evitado com uma reescrita de cabeçalho.Supondo que o aplicativo esteja sendo executado na porta 8080 (domínio público em www.mydomain.com ) e você coloque o proxy reverso no mesmo host na porta 80, esta é a configuração do proxy reverso do Nginx :
fonte
Access-Control-Allow-Origin: http://example.com
.Sim, no momento em que o jQuery vê o URL pertencer a um domínio diferente, ele assume que a chamada é uma chamada entre domínios e, portanto,
crossdomain:true
não é necessária aqui.Além disso, é importante observar que você não pode fazer uma chamada síncrona
$.ajax
se o URL pertencer a um domínio diferente (domínio cruzado) ou se estiver usando JSONP. Apenas chamadas assíncronas são permitidas.Nota: você pode ligar para o serviço de forma síncrona se especificar
async:false
com sua solicitação.fonte
No meu caso, o nome do subdomínio causa o problema. Aqui estão os detalhes
Eu usei
app_development.something.com
, aqui o_
subdomínio underscore ( ) está criando um erro CORS. Depois de mudarapp_development
paraapp-development
ele funciona bem.fonte
Há um pequeno truque com php. E funciona não apenas com o Google, mas com qualquer site que você não controla e não pode adicionar Access-Control-Allow-Origin *
Precisamos criar um arquivo PHP (por exemplo, getContentFromUrl.php ) em nosso servidor da web e fazer um pequeno truque.
PHP
JS
Como funciona:
E podemos fazer eventos em Click, colocar esse evento em algum botão. Espero que isso ajude!
fonte