¿Por qué mi código JavaScript obtiene un error "No 'Access-Control-Allow-Origin' en el recurso solicitado" cuando Postman no lo hace?
Estoy tratando de hacer la autorización usando JavaScript conectando a la RESTful API construida en Flask. Sin embargo, cuando hago la solicitud, obtengo el siguiente error:
XMLHttpRequest no puede cargar http://myApiUrl/login. No 'Access-Control-Allow-Origin' la cabecera está presente en el recurso solicitado. Por lo tanto, no se permite el acceso a Origin 'null'.
Sé que la API o el recurso remoto deben establecer la cabecera, pero ¿por qué funcionó cuando hice la solicitud a través de la extensión de Chrome Postman?
Este es el código de la petición:
$.ajax({
type: "POST",
dataType: 'text',
url: api,
username: 'user',
password: 'pass',
crossDomain : true,
xhrFields: {
withCredentials: true
}
})
.done(function( data ) {
console.log("done");
})
.fail( function(xhr, textStatus, errorThrown) {
alert(xhr.responseText);
alert(textStatus);
});
2309
3
Si lo he entendido bien estás haciendo una XMLHttpRequest a un dominio diferente al de tu página. Así que el navegador lo está bloqueando ya que normalmente permite una petición en el mismo origen por razones de seguridad. Tienes que hacer algo diferente cuando quieras hacer una petición entre dominios. Un tutorial sobre cómo lograrlo es Using CORS.
Cuando se usa postman no están restringidos por esta política. Citado de Cross-Origin XMLHttpRequest:
Si puedes lidiar con JSON a cambio, entonces intenta usar JSONP (nota la P al final) para hablar entre dominios:
Más información sobre cómo trabajar con JSONP aquí:
Hay un problema de cruce de dominios usando Ajax. Debes estar seguro de que estás accediendo a tus archivos en la misma ruta
http://
sinwww.
(o acceder desdehttp://www.
y publicar en la misma ruta incluyendowww.
) que el navegador considera como otro dominio cuando se accede a través de una rutawww.
, así que ya ves dónde está el problema. Usted está publicando en un dominio diferente y el navegador bloquea el flujo debido a la cuestión del origen.Si la API no está colocada en el mismo host desde el que está solicitando, el flujo se bloquea, y tendrá que encontrar otra forma de comunicarse con la API.