Nota de modificación : esta pregunta es acerca de por qué Postman no está sujeto a restricciones CORS de la misma manera que lo está XMLHttpRequest. Esta pregunta no se trata de cómo solucionar un error "No 'Access-Control-Allow-Origin' ...".
Por favor, deja de publicar :
- Configuraciones CORS para cada idioma / marco bajo el sol. En su lugar, encuentre la pregunta relevante de su lenguaje / marco .
- Servicios de terceros que permiten una solicitud para evadir CORS
- Opciones de línea de comando para desactivar CORS para varios navegadores
Estoy tratando de hacer una autorización usando JavaScript conectándome al Frasco incorporado RESTful API . Sin embargo, cuando hago la solicitud, aparece el siguiente error:
XMLHttpRequest no puede cargar http: // myApiUrl / login . No hay encabezado 'Access-Control-Allow-Origin' presente en el recurso solicitado. Por lo tanto, el origen 'nulo' no tiene acceso permitido.
Sé que la API o el recurso remoto deben establecer el encabezado, pero ¿por qué funcionó cuando hice la solicitud a través de la extensión de Chrome Postman ?
Este es el código de solicitud:
$.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);
});
fuente
Respuestas:
Si lo entendí bien, está haciendo una solicitud XMLHttpRequest a un dominio diferente al de su página. Por lo tanto, el navegador lo bloquea, ya que generalmente permite una solicitud en el mismo origen por razones de seguridad. Debe hacer algo diferente cuando desea hacer una solicitud de dominio cruzado. Un tutorial sobre cómo lograr eso es Usar CORS .
Cuando utiliza cartero, no están restringidos por esta política. Citado de Cross-Origin XMLHttpRequest :
fuente
Es muy simple de resolver si está usando PHP . Simplemente agregue el siguiente script al comienzo de su página PHP que maneja la solicitud:
Si está utilizando Node-red , debe permitir CORS en el
node-red/settings.js
archivo descomentando las siguientes líneas:Si está utilizando Flask igual que la pregunta; primero tienes que instalar
flask-cors
Luego incluya los frascos en su aplicación.
Una aplicación simple se verá así:
Para más detalles, puede consultar la documentación del Frasco .
fuente
Porque
$ .ajax ({type: "POST" - llama a OPTIONS
$ .post ( - Llama a POST
Ambos son diferentes El cartero llama "POST" correctamente, pero cuando lo llamemos, será "OPCIONES".
Para servicios web C #: API web
Agregue el siguiente código en su archivo web.config bajo la etiqueta <system.webServer>. Esto funcionará:
Asegúrate de no cometer ningún error en la llamada Ajax
jQuery
Nota: Si usted está buscando para la descarga de contenidos desde un sitio web de terceros a continuación, esto no le ayudará . Puede probar el siguiente código, pero no JavaScript.
fuente
*
usarhttps://www.myotherdomain.com
La aplicación de una restricción CORS es una característica de seguridad definida por un servidor e implementada por un navegador .
Sin embargo, la herramienta Postman no se preocupa por la política CORS del servidor.
Es por eso que el error CORS aparece en el navegador, pero no en Postman.
fuente
En la investigación a continuación como API, uso http://example.com en lugar de http: // myApiUrl / login de su pregunta, porque esta primera funciona.
Supongo que su página está en http: //my-site.local: 8088 .
La razón por la que ves resultados diferentes es que Postman:
Host=example.com
(su API)Origin
Esto es similar a la forma en que los navegadores envían solicitudes cuando el sitio y la API tienen el mismo dominio (los navegadores también configuran el elemento del encabezado
Referer=http://my-site.local:8088
, sin embargo, no lo veo en Postman). Cuando elOrigin
encabezado no está configurado, generalmente los servidores permiten tales solicitudes de forma predeterminada.Esta es la forma estándar en que Postman envía solicitudes. Pero un navegador envía solicitudes de manera diferente cuando su sitio y API tienen dominios diferentes , y luego se produce CORS y el navegador automáticamente:
Host=example.com
(el suyo como API)Origin=http://my-site.local:8088
(su sitio)(El encabezado
Referer
tiene el mismo valor queOrigin
). Y ahora, en la pestaña Consola y redes de Chrome, verá:Cuando tiene
Host != Origin
esto es CORS, y cuando el servidor detecta dicha solicitud, generalmente la bloquea de manera predeterminada .Origin=null
se establece cuando abre contenido HTML desde un directorio local y envía una solicitud. La misma situación es cuando envía una solicitud dentro de un<iframe>
, como en el fragmento a continuación (pero aquí elHost
encabezado no está configurado en absoluto); en general, en todos los lugares donde la especificación HTML dice origen opaco, puede traducir esoOrigin=null
. Puede encontrar más información sobre esto aquí .Si no utiliza una solicitud CORS simple, generalmente el navegador también envía automáticamente una solicitud de OPCIONES antes de enviar la solicitud principal; aquí encontrará más información . El fragmento a continuación lo muestra:
Puede cambiar la configuración de su servidor para permitir solicitudes CORS.
Aquí hay un ejemplo de configuración que activa CORS en nginx (archivo nginx.conf) - tenga mucho cuidado con la configuración
always/"$http_origin"
de nginx y"*"
Apache - esto desbloqueará CORS de cualquier dominio.Mostrar fragmento de código
Aquí hay una configuración de ejemplo que activa CORS en Apache (archivo .htaccess)
Mostrar fragmento de código
fuente
Encontró el mismo error en un caso de uso diferente.
Caso de uso: en cromo cuando se intenta llamar al punto final Spring REST en angular.
Solución: agregue la anotación @CrossOrigin ("*") en la parte superior de la clase de controlador correspondiente.
fuente
Si usa .NET como nivel intermedio, verifique claramente el atributo de ruta, por ejemplo,
Tuve un problema cuando fue así,
Arreglado por esto,
fuente
Solo para el proyecto .NET Core Web API, agregue los siguientes cambios:
services.AddMvc()
línea en elConfigureServices()
método del archivo Startup.cs:app.UseMvc()
línea en elConfigure()
método del archivo Startup.cs:fuente