Estou tentando configurar o AngularJS para se comunicar com um recurso de origem cruzada, onde o host do recurso que entrega meus arquivos de modelo está em um domínio diferente e, portanto, a solicitação XHR que o angular executa deve ser de domínio cruzado. Eu adicionei o cabeçalho CORS apropriado ao meu servidor para a solicitação HTTP para fazer isso funcionar, mas parece não funcionar. O problema é que, quando inspeciono as solicitações HTTP no meu navegador (chrome), a solicitação enviada ao arquivo do ativo é uma solicitação OPTIONS (deve ser uma solicitação GET).
Não tenho certeza se isso é um bug no AngularJS ou se preciso configurar alguma coisa. Pelo que entendi, o wrapper XHR não pode fazer uma solicitação HTTP OPTIONS, portanto, parece que o navegador está tentando descobrir se é "permitido" fazer o download do ativo primeiro antes de executar a solicitação GET. Se for esse o caso, também preciso definir o cabeçalho CORS (Access-Control-Allow-Origin: http://asset.host ... ) Com o host do recurso também?
fonte
$resource
POST está gerando uma solicitação OPTIONS para meu servidor ExpressJS back-end (no mesmo host; mas em uma porta diferente).Para o Angular 1.2.0rc1 +, você precisa adicionar uma resourceUrlWhitelist.
1.2: versão de lançamento, eles adicionaram uma função escapeForRegexp para que você não precise mais escapar das strings. Você pode adicionar o URL diretamente
certifique-se de adicionar ** para subpastas. Aqui está um jsbin funcional para 1.2: http://jsbin.com/olavok/145/edit
1.2.0rc: se você ainda estiver em uma versão rc, o Angular 1.2.0rc1 será a solução:
Aqui está um exemplo de jsbin em que funciona para 1.2.0rc1: http://jsbin.com/olavok/144/edit
Pré 1.2: Para versões mais antigas (ref http://better-inter.net/enabling-cors-in-angular-js/ ), você precisa adicionar as 2 linhas a seguir à sua configuração:
Aqui está um exemplo do jsbin em que funciona nas versões anteriores à 1.2: http://jsbin.com/olavok/11/edit
fonte
NOTA: Não tenho certeza se funciona com a versão mais recente do Angular.
ORIGINAL:
Também é possível substituir a solicitação OPTIONS (foi testada apenas no Chrome):
fonte
$resource('http://yourserver/yourentity/:id', {}, {query: {method: 'GET'});
Seu serviço deve responder a uma
OPTIONS
solicitação com cabeçalhos como estes:Aqui está um bom documento: http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server
fonte
O mesmo documento diz
Diferentemente das solicitações simples (discutidas acima), as solicitações "preflighted" primeiro enviam um cabeçalho de solicitação HTTP OPTIONS para o recurso no outro domínio, para determinar se a solicitação real é segura para enviar. As solicitações entre sites são comprovadas dessa maneira, pois podem ter implicações nos dados do usuário. Em particular, um pedido é comprovado se:
Quando a solicitação original é Obter sem cabeçalhos personalizados, o navegador não deve fazer a solicitação de Opções, como faz agora. O problema é que ele gera um cabeçalho X-Requested-With que força a solicitação de Opções. Consulte https://github.com/angular/angular.js/pull/1454 sobre como remover este cabeçalho
fonte
Isso corrigiu meu problema:
fonte
Se você estiver usando um servidor nodeJS, poderá usar esta biblioteca, ela funcionou bem para mim https://github.com/expressjs/cors
e depois que você pode fazer um
npm update
.fonte
Aqui está a maneira como eu corrigi esse problema no ASP.NET
Primeiro, você deve adicionar o pacote de pepitas Microsoft.AspNet.WebApi.Cors
Em seguida, modifique o arquivo App_Start \ WebApiConfig.cs
Adicione este atributo à sua classe de controlador
Consegui enviar json para a ação dessa maneira
Referência: Habilitando solicitações de origem cruzada na API da Web do ASP.NET 2
fonte
De alguma forma eu consertei mudando
para
fonte
Perfeitamente descrito no comentário de pkozlowski. Eu tinha uma solução funcional com o AngularJS 1.2.6 e o ASP.NET Web Api, mas quando eu atualizei o AngularJS para 1.3.3, as solicitações falharam.
A solução para o servidor Web API foi adicionar o tratamento das solicitações OPTIONS no início do método de configuração (mais informações nesta postagem do blog ):
fonte
Se você estiver usando as APIs Jersey for REST, poderá fazer o seguinte
Você não precisa alterar sua implementação de serviços da web.
Vou explicar para o Jersey 2.x
1) Primeiro adicione um ResponseFilter como mostrado abaixo
2) no web.xml, na declaração de servlet de jersey, adicione o seguinte
fonte
Desisti de tentar corrigir esse problema.
Meu web.config do IIS tinha o "
Access-Control-Allow-Methods
" , experimentei adicionar definições de configuração ao meu código Angular, mas depois de algumas horas tentando convencer o Chrome a chamar um serviço da Web JSON entre domínios, desisti miseravelmente.No final, eu adicionei uma página web mudo manipulador ASP.Net, tem que ligar para o meu serviço JSON web, e retornar os resultados. Começou a funcionar em 2 minutos.
Aqui está o código que eu usei:
E no meu controlador Angular ...
Tenho certeza de que existe uma maneira mais simples / mais genérica de fazer isso, mas a vida é muito curta ...
Isso funcionou para mim, e eu posso continuar fazendo o trabalho normal agora !!
fonte
Para um projeto IIS MVC 5 / Angular CLI (Sim, eu estou ciente de que seu problema está com o Angular JS) com API, fiz o seguinte:
web.config no
<system.webServer>
nóglobal.asax.cs
Isso deve corrigir seus problemas para o MVC e o WebAPI sem ter que fazer tudo o que for possível. Em seguida, criei um HttpInterceptor no projeto CLI Angular que foi adicionado automaticamente às informações relevantes do cabeçalho. Espero que isso ajude alguém em uma situação semelhante.
fonte
Um pouco tarde para a festa,
Se você estiver usando Angular 7 (ou 5/6/7) e PHP como a API e ainda estiver recebendo esse erro, tente adicionar as seguintes opções de cabeçalho ao ponto final (PHP API).
Nota : O que requer apenas é
Access-Control-Allow-Methods
. Mas, eu estou colando aqui outros doisAccess-Control-Allow-Origin
eAccess-Control-Allow-Headers
, simplesmente porque você precisará que todos eles sejam configurados corretamente para que o Angular App fale corretamente com sua API.Espero que isso ajude alguém.
Felicidades.
fonte