He creado una demostración usando JavaScript para la API de búsqueda de fotos de Flickr. Ahora lo estoy convirtiendo a AngularJs. He buscado en internet y encontré la siguiente configuración.
Configuración:
myApp.config(function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
delete $httpProvider.defaults.headers.common['X-Requested-With'];
});
Servicio:
myApp.service('dataService', function($http) {
delete $http.defaults.headers.common['X-Requested-With'];
this.flickrPhotoSearch = function() {
return $http({
method: 'GET',
url: 'http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=3f807259749363aaa29c76012fa93945&tags=india&format=json&callback=?',
dataType: 'jsonp',
headers: {'Authorization': 'Token token=xxxxYYYYZzzz'}
});
}
});
Controlador:
myApp.controller('flickrController', function($scope, dataService) {
$scope.data = null;
dataService.flickrPhotoSearch().then(function(dataResponse) {
$scope.data = dataResponse;
console.log($scope.data);
});
});
Pero aún así recibí el mismo error. Aquí hay algunos enlaces que probé:
XMLHttpRequest no puede cargar la URL. Origen no permitido por Access-Control-Allow-Origin
javascript
angularjs
xmlhttprequest
cors
ankitr
fuente
fuente
Respuestas:
Usted no El servidor al que realiza la solicitud debe implementar CORS para otorgar JavaScript desde el acceso a su sitio web. Su JavaScript no puede otorgarse permiso para acceder a otro sitio web.
fuente
https://www.google.com
usar una aplicación como POSTMAN, pero cuando tratoGET
dehttps://www.google.com
usar una llamada AJAX obtengo el error CORS? ¿No hay forma de que la llamada AJAX se comporte de manera similar a la llamada de POSTMAN?Tuve un problema similar y para mí se redujo a agregar los siguientes encabezados HTTP en la respuesta del extremo receptor :
Es posible que prefiera no usar
*
al final, sino solo el nombre de dominio del host que envía los datos. Me gusta*.example.com
Pero esto solo es factible cuando tiene acceso a la configuración del servidor.
fuente
header('Access-Control-Allow-Origin: *');
Http.get()
o similar, agregueheader('Access-Control-Allow-Origin: *')
como la primera salida en el script PHP llamado (es decir, antes de generar la respuesta real, JSON, lo que sea.)Intente usar el servicio de recursos para consumir flickr jsonp:
Modelo:
fuente
Este problema ocurre debido a la política del modelo de seguridad de la aplicación web que es la Política del mismo origen Según la política, un navegador web permite que los scripts contenidos en una primera página web accedan a los datos de una segunda página web, pero solo si ambas páginas tienen el mismo origen. Eso significa que el solicitante debe coincidir con el host, el protocolo y el puerto exactos del sitio solicitante.
Tenemos múltiples opciones para superar este problema de encabezado CORS.
Uso de proxy : en esta solución, ejecutaremos un proxy de modo que cuando la solicitud pase por el proxy, parezca que tiene el mismo origen. Si está utilizando el nodeJS , puede usar cors-anywhere para hacer el proxy. https://www.npmjs.com/package/cors-anywhere .
Ejemplo :
JSONP : JSONP es un método para enviar datos JSON sin preocuparse por problemas entre dominios. No utiliza el objeto XMLHttpRequest. En su lugar, utiliza la
<script>
etiqueta. https://www.w3schools.com/js/js_json_jsonp.aspLado del servidor: en el lado del servidor, debemos habilitar las solicitudes de origen cruzado. Primero, recibiremos las solicitudes Preflight (OPTIONS) y debemos permitir la solicitud que es el código de estado 200 (ok).
Las solicitudes verificadas previamente envían primero 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 de sitios cruzados se verifican de esta manera, ya que pueden tener implicaciones para los datos del usuario. En particular, una solicitud se verifica previamente si utiliza métodos distintos a GET o POST. Además, si POST se utiliza para enviar datos de solicitud con un tipo de contenido que no sea application / x-www-form-urlencoded, multipart / form-data o text / plain, por ejemplo, si la solicitud POST envía una carga XML al servidor usando application / xml o text / xml, la solicitud se verifica previamente. Establece encabezados personalizados en la solicitud (por ejemplo, la solicitud utiliza un encabezado como X-PINGOTHER)
Si está utilizando el resorte, solo agregar el siguiente código resolverá el problema. Aquí he deshabilitado el token csrf que no importa habilitar / deshabilitar de acuerdo a sus requerimientos.
Si está utilizando la seguridad de primavera, use el código siguiente junto con el código anterior.
fuente
Encontré un problema similar como este, el problema fue con el backend. Estaba usando el servidor de nodo (Express). Recibí una solicitud de la interfaz (angular) como se muestra a continuación
Pero dio el siguiente error
Este es el código de backend escrito usando express sin los encabezados
Después de agregar un encabezado al método se resolvió el problema
Puede obtener más detalles sobre cómo habilitar CORS en el nodo JS
fuente
Respondido por mí mismo.
CORS angular js + restEasy en POST
Bueno, finalmente llegué a esta solución: la razón por la que funcionó con IE es porque IE envía directamente una POST en lugar de primero una solicitud de verificación previa para pedir permiso. Pero todavía no sé por qué el filtro no pudo administrar una solicitud de OPCIONES y envía encabezados predeterminados que no se describen en el filtro (parece una anulación para ese único caso ... tal vez una cosa fácil de descansar ... .)
Así que creé una ruta OPTIONS en mi servicio de descanso que reescribe la respuesta e incluye los encabezados en la respuesta usando el encabezado de respuesta
Todavía estoy buscando la manera limpia de hacerlo si alguien se enfrentó a esto antes.
fuente
Apache / HTTPD tiende a estar presente en la mayoría de las empresas o si está usando Centos / etc en casa. Entonces, si tiene eso, puede hacer un proxy muy fácilmente para agregar los encabezados CORS necesarios.
Tengo una publicación de blog sobre esto aquí, ya que sufrí con ella varias veces recientemente. Pero lo importante es simplemente agregar esto a su archivo /etc/httpd/conf/httpd.conf y asegurarse de que ya está haciendo "Listen 80":
Esto garantiza que todas las solicitudes a las URL en la ruta your-server-ip: 80 / SomePath a http: // target-ip: 8080 / SomePath (la API sin compatibilidad con CORS) y que regresen con la correcta Access-Control-Allow- Encabezado de origen para permitirles trabajar con su aplicación web.
Por supuesto, puede cambiar los puertos y apuntar a todo el servidor en lugar de SomePath si lo desea.
fuente
Esta respuesta describe dos formas de solucionar las API que no admiten CORS:
Una solución alternativa es usar un CORS PROXY:
Para más información, ver
Use JSONP si la API lo admite:
La DEMO en PLNKR
Para más información, ver
fuente
fuente
podemos habilitar CORS en la interfaz utilizando el módulo ngResourse. Pero lo más importante, deberíamos tener este código mientras hacemos la solicitud ajax en el controlador,
Además, debe agregar ngResourse CDN en la parte del script y agregarlo como una dependencia en el módulo de la aplicación.
Luego use "ngResourse" en la sección de dependencia del módulo de la aplicación
var routerApp = angular.module("routerApp", ["ui.router", 'ngResource']);
fuente