Leí mucho sobre el error 'Access-Control-Allow-Origin', pero no entiendo lo que tengo que arreglar :(
Estoy jugando con la API de Google Moderator, pero cuando intento agregar una nueva serie recibo:
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.
Intenté con y sin parámetro de devolución de llamada, intenté agregar 'Access-Control-Allow-Origin *' al encabezado. Y no sé cómo usar $ .getJSON aquí, si corresponde, porque tengo que agregar el encabezado de autorización y no sé cómo hacerlo sin beforeCall desde $ .ajax: /
¿Alguna luz para esta oscuridad uu?
Ese es el 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 -->
Respuestas:
Resolví el error de Access-Control-Allow-Origin modificando el parámetro dataType a dataType: 'jsonp' y agregando un crossDomain: true
fuente
crossDomain:true
se requiera. Tengo entendido que solo es necesario si realiza una solicitud en su propio dominio pero desea que jQuery lo trate como una solicitud de dominio cruzado.crossDomain
no es necesario. Esta es unajsonp
solicitud regular destinada a la comunicación entre dominios.Tuve exactamente el mismo problema y no era dominio cruzado sino el mismo dominio. Acabo de agregar esta línea al archivo php que manejaba la solicitud ajax.
Funcionó a las mil maravillas. Gracias al cartel
fuente
Si tiene este error al tratar de consumir un servicio que no puede agregar el encabezado
Access-Control-Allow-Origin *
en esa aplicación, pero puede colocar frente al servidor un proxy inverso, el error puede evitarse con una reescritura del encabezado.Suponiendo que la aplicación se está ejecutando en el puerto 8080 (dominio público en www.midominio.com ), y coloca el proxy inverso en el mismo host en el puerto 80, esta es la configuración para el proxy inverso de Nginx :
fuente
Access-Control-Allow-Origin: http://example.com
.Sí, en el momento en que jQuery ve que la URL pertenece a un dominio diferente, asume esa llamada como una llamada de dominio cruzado, por lo tanto,
crossdomain:true
no se requiere aquí.Además, es importante tener en cuenta que no puede realizar una llamada sincrónica
$.ajax
si su URL pertenece a un dominio diferente (dominio cruzado) o si está utilizando JSONP. Solo se permiten llamadas asíncronas.Nota: puede llamar al servicio sincrónicamente si especifica el
async:false
con su solicitud.fuente
En mi caso, el nombre de subdominio causa el problema. Aquí hay detalles
Solía
app_development.something.com
, aquí el_
subdominio subrayado ( ) está creando un error CORS. Después de cambiarapp_development
aapp-development
funciona bien.fuente
Hay un pequeño truco con php. Y funciona no solo con Google, sino con cualquier sitio web que no controle y no pueda agregar Access-Control-Allow-Origin *
Necesitamos crear un archivo PHP (ej. GetContentFromUrl.php ) en nuestro servidor web y hacer un pequeño truco.
PHP
JS
Cómo funciona:
Y podemos hacer eventos en Click, poner este evento en algún botón. Espero que esto ayude!
fuente