Estoy tratando de configurar AngularJS para comunicarse con un recurso de origen cruzado donde el host de activos que entrega mis archivos de plantilla está en un dominio diferente y, por lo tanto, la solicitud XHR de que angular realiza debe ser de dominio cruzado. Agregué el encabezado CORS apropiado a mi servidor para la solicitud HTTP para que esto funcione, pero parece que no funciona. El problema es que cuando inspecciono las solicitudes HTTP en mi navegador (Chrome), la solicitud enviada al archivo de activos es una solicitud de OPCIONES (debería ser una solicitud GET).
No estoy seguro de si esto es un error en AngularJS o si necesito configurar algo. Por lo que entiendo, el contenedor XHR no puede realizar una solicitud HTTP OPTIONS, por lo que parece que el navegador está tratando de averiguar si está "permitido" descargar el activo primero antes de realizar la solicitud GET. Si este es el caso, ¿debo configurar el encabezado CORS (Access-Control-Allow-Origin: http://asset.host ... ) con el host del activo también?
fuente
$resource
POST de AngularJS está generando una solicitud de OPCIONES a mi servidor ExpressJS de fondo (en el mismo host; pero un puerto diferente).Para Angular 1.2.0rc1 +, debe agregar una lista de recursos resourceUrlWhitelist.
1.2: versión de lanzamiento, agregaron una función escapeForRegexp para que ya no tenga que escapar de las cadenas. Puedes agregar la URL directamente
asegúrese de agregar ** para subcarpetas. Aquí hay un jsbin que funciona para 1.2: http://jsbin.com/olavok/145/edit
1.2.0rc: si todavía está en una versión rc, la solución Angular 1.2.0rc1 se ve así:
Aquí hay un ejemplo de jsbin donde funciona para 1.2.0rc1: http://jsbin.com/olavok/144/edit
Pre 1.2: Para versiones anteriores (ref http://better-inter.net/enabling-cors-in-angular-js/ ) necesita agregar las siguientes 2 líneas a su configuración:
Aquí hay un ejemplo de jsbin donde funciona para versiones anteriores a 1.2: http://jsbin.com/olavok/11/edit
fuente
NOTA: No estoy seguro de que funcione con la última versión de Angular.
ORIGINAL:
También es posible anular la solicitud de OPCIONES (solo se probó en Chrome):
fuente
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Su servicio debe responder una
OPTIONS
solicitud con encabezados como estos:Aquí hay un buen documento: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
fuente
El mismo documento dice
A diferencia de las solicitudes simples (discutidas anteriormente), las solicitudes "con verificación previa" primero envían un encabezado de solicitud de OPCIONES HTTP al recurso en el otro dominio, para determinar si la solicitud real es segura de enviar. Las solicitudes entre sitios se verifican previamente de esta manera, ya que pueden tener implicaciones para los datos del usuario. En particular, una solicitud se verifica previamente si:
Cuando la solicitud original es Obtener sin encabezados personalizados, el navegador no debe realizar la solicitud de Opciones, como lo hace ahora. El problema es que genera un encabezado X-Requested-With que fuerza la solicitud de Opciones. Consulte https://github.com/angular/angular.js/pull/1454 sobre cómo eliminar este encabezado
fuente
Esto solucionó mi problema:
fuente
Si está utilizando un servidor nodeJS, puede usar esta biblioteca, funcionó bien para mí https://github.com/expressjs/cors
y después puedes hacer un
npm update
.fuente
Esta es la forma en que solucioné este problema en ASP.NET
Primero, debe agregar el paquete nuget Microsoft.AspNet.WebApi.Cors
Luego modifique el archivo App_Start \ WebApiConfig.cs
Agregue este atributo en su clase de controlador
Pude enviar a json a la acción de esta manera
Referencia: Habilitación de solicitudes de origen cruzado en ASP.NET Web API 2
fuente
De alguna manera lo arreglé cambiando
a
fuente
Perfectamente descrito en el comentario de pkozlowski. Tenía una solución de trabajo con AngularJS 1.2.6 y ASP.NET Web Api, pero cuando actualicé AngularJS a 1.3.3, las solicitudes fallaron.
La solución para el servidor Web Api fue agregar el manejo de las solicitudes de OPCIONES al comienzo del método de configuración (más información en esta publicación de blog ):
fuente
Si está utilizando Jersey para REST API, puede hacer lo siguiente
No tiene que cambiar la implementación de sus servicios web.
Explicaré para Jersey 2.x
1) Primero agregue un ResponseFilter como se muestra a continuación
2) luego en el web.xml, en la declaración de servlet de jersey agregue lo siguiente
fuente
Dejé de intentar solucionar este problema.
Mi IIS web.config tenía el correspondiente "
Access-Control-Allow-Methods
" en él, experimenté agregando configuraciones de configuración a mi código Angular, pero después de quemar algunas horas tratando de hacer que Chrome llamara a un servicio web JSON entre dominios, me rendí miserablemente.Al final, agregué una tonta página web de controlador ASP.Net, obtuve eso llamara a mi servicio web JSON y devolviera los resultados. Estuvo en funcionamiento en 2 minutos.
Aquí está el código que usé:
Y en mi controlador angular ...
Estoy seguro de que hay una forma más simple / genérica de hacerlo, pero la vida es demasiado corta ...
¡Esto funcionó para mí, y ahora puedo seguir haciendo el trabajo normal!
fuente
Para un proyecto IIS MVC 5 / CLI angular (Sí, estoy consciente de que su problema es con Angular JS) con API, hice lo siguiente:
web.config debajo del
<system.webServer>
nodoglobal.asax.cs
Eso debería solucionar sus problemas para MVC y WebAPI sin tener que hacer todo lo demás. Luego creé un HttpInterceptor en el proyecto Angular CLI que agregó automáticamente en la información de encabezado relevante. Espero que esto ayude a alguien en una situación similar.
fuente
Poco tarde a la fiesta
Si está utilizando Angular 7 (o 5/6/7) y PHP como API y todavía recibe este error, intente agregar las siguientes opciones de encabezado al punto final (PHP API).
Nota : Lo que solo requiere es
Access-Control-Allow-Methods
. Pero, estoy pegando aquí otros dosAccess-Control-Allow-Origin
yAccess-Control-Allow-Headers
, simplemente porque necesitará que todos estos estén configurados correctamente para que Angular App se comunique correctamente con su API.Espero que esto ayude a alguien.
Salud.
fuente