Eu desenvolvi um aplicativo PhoneGap que agora está sendo transformado em um site móvel. Tudo funciona bem, exceto uma pequena falha. Eu uso uma determinada API de terceiros por meio de uma solicitação POST, que funciona bem no aplicativo, mas falha na versão do site móvel.
Depois de um olhar mais atento, parece que o AngularJS (na verdade, acho que o navegador) está enviando primeiro uma solicitação OPTIONS. Aprendi muito hoje sobre o CORS, mas não consigo descobrir como desativá-lo completamente. Não tenho acesso a essa API (portanto, alterações nesse lado são impossíveis), mas eles adicionaram o domínio no qual estou trabalhando ao cabeçalho Access-Control-Allow-Origin.
Este é o código do qual estou falando:
var request = {
language: 'fr',
barcodes: [
{
barcode: 'somebarcode',
description: 'Description goes here'
}
]
};
}
var config = {
headers: {
'Cache-Control': 'no-cache',
'Content-Type': 'application/json'
}
};
$http.post('http://somedomain.be/trackinginfo', request, config).success(function(data, status) {
callback(undefined, data);
}).error(function(data, status) {
var err = new Error('Error message');
err.status = status;
callback(err);
});
Como posso evitar que o navegador (ou AngularJS) envie essa solicitação OPTIONS e pule para a solicitação POST real? Estou usando o AngularJS 1.2.0.
Desde já, obrigado.
Como disse Ray, você pode pará-lo modificando o cabeçalho do conteúdo, como -
Por exemplo -
Ou diretamente para uma chamada -
Isso não enviará nenhuma solicitação de opção pré-voo.
NOTA: A solicitação não deve ter nenhum parâmetro de cabeçalho personalizado. Se o cabeçalho da solicitação contiver qualquer cabeçalho personalizado, o navegador fará uma solicitação pré-voo, você não pode evitá-la.
fonte
$http
?GET
e um cabeçalho extraAuthorization
. Mas ainda enviando o pré-vôo.Ao executar certos tipos de solicitações AJAX de domínio cruzado, os navegadores modernos que suportam CORS irão inserir uma solicitação extra de "comprovação" para determinar se eles têm permissão para executar a ação. Da consulta de exemplo:
Como resultado deste fragmento, podemos ver que ao endereço foram enviadas duas solicitações (OPTIONS e GET). A resposta do servidor inclui cabeçalhos que confirmam a permissibilidade da consulta GET. Se o seu servidor não estiver configurado para processar uma solicitação OPTIONS corretamente, as solicitações do cliente falharão. Por exemplo:
fonte
Acho que a melhor maneira é verificar se o pedido é do tipo "OPÇÕES" e retornar 200 do middleware. Funcionou para mim
fonte
Preflight é um recurso de segurança da web implementado pelo navegador. Para o Chrome, você pode desativar toda a segurança da web adicionando a sinalização --disable-web-security.
Por exemplo: "C: \ Arquivos de programas \ Google \ Chrome \ Application \ chrome.exe" --disable-web-security --user-data-dir = "C: \ newChromeSettingsWithoutSecurity". Você pode primeiro criar um novo atalho de cromo, ir para suas propriedades e alterar o alvo como acima. Isso deve ajudar!
fonte
definir o tipo de conteúdo como indefinido faria o javascript passar os dados do cabeçalho como estão, e sobrescrever as configurações de cabeçalho $ httpProvider padrão do angular. Documentação Angular $ http
fonte