Nota da modificação : Esta pergunta é sobre por que o Postman não está sujeito a restrições de CORS da mesma maneira que um XMLHttpRequest. Esta pergunta não é sobre como corrigir um erro "Não 'Acesso ao controle de permissão de origem' ...".
Pare de postar :
- Configurações CORS para cada idioma / estrutura sob o sol. Em vez disso, encontre a pergunta da sua linguagem / estrutura relevante .
- Serviços de terceiros que permitem que uma solicitação contorne o CORS
- Opções de linha de comando para desativar o CORS para vários navegadores
Estou tentando fazer autorização usando JavaScript , conectando -me ao Flask interno da API RESTful . No entanto, quando faço a solicitação, recebo o seguinte erro:
XMLHttpRequest não pode carregar http: // myApiUrl / login . Nenhum cabeçalho 'Access-Control-Allow-Origin' está presente no recurso solicitado. Portanto, a origem 'null' não é permitida.
Sei que a API ou o recurso remoto deve definir o cabeçalho, mas por que funcionou quando fiz a solicitação pela extensão Postman do Chrome ?
Este é o código da solicitação:
$.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);
});
Respostas:
Se eu entendi direito, você está fazendo um XMLHttpRequest em um domínio diferente do que sua página está. Portanto, o navegador está bloqueando-o, pois normalmente permite uma solicitação na mesma origem por motivos de segurança. Você precisa fazer algo diferente quando quiser fazer uma solicitação entre domínios. Um tutorial sobre como conseguir isso é Usando o CORS .
Quando você está usando carteiro, eles não são restritos por esta política. Citado em XMLHttpRequest de origem cruzada :
fonte
É muito simples de resolver se você estiver usando PHP . Basta adicionar o seguinte script no início da sua página PHP que lida com a solicitação:
Se você estiver usando o Node-red, precisará permitir o CORS no
node-red/settings.js
arquivo, sem comentar as seguintes linhas:Se você estiver usando o Flask da mesma forma que a pergunta; você tem que instalar primeiro
flask-cors
Em seguida, inclua os Flask cors em seu aplicativo.
Uma aplicação simples será semelhante a:
Para mais detalhes, você pode verificar a documentação do Flask .
fonte
Porque
$ .ajax ({type: "POST" - chama OPTIONS
$ .post ( - chama POST
Ambos são diferentes. O carteiro chama "POST" corretamente, mas quando o chamamos, será "OPTIONS".
Para serviços web C # - API Web
Por favor, adicione o seguinte código no seu arquivo web.config na tag <system.webServer>. Isso funcionará:
Verifique se você não está cometendo nenhum erro na chamada do Ajax
jQuery
Nota: Se você estiver procurando por baixar conteúdo de um site de terceiros , isso não ajudará . Você pode tentar o seguinte código, mas não o JavaScript.
fonte
*
usohttps://www.myotherdomain.com
A aplicação de uma restrição CORS é um recurso de segurança definido por um servidor e implementado por um navegador .
No entanto, a ferramenta Postman não se preocupa com a política do CORS do servidor.
É por isso que o erro CORS aparece no navegador, mas não no Postman.
fonte
Na investigação abaixo como API, uso http://example.com em vez de http: // myApiUrl / login da sua pergunta, porque esta primeira está funcionando.
Presumo que sua página esteja em http: //my-site.local: 8088 .
A razão pela qual você vê resultados diferentes é que o Postman:
Host=example.com
(sua API)Origin
Isso é semelhante à maneira como os navegadores enviam solicitações quando o site e a API têm o mesmo domínio (os navegadores também definem o item de cabeçalho
Referer=http://my-site.local:8088
, mas não o vejo no Postman). Quando oOrigin
cabeçalho não está definido, geralmente os servidores permitem tais solicitações por padrão.Esta é a maneira padrão como o Postman envia solicitações. Mas um navegador envia solicitações de maneira diferente quando o site e a API têm domínios diferentes e, em seguida, ocorre o CORS e o navegador automaticamente:
Host=example.com
(o seu como API)Origin=http://my-site.local:8088
(seu site)(O cabeçalho
Referer
tem o mesmo valor queOrigin
). E agora, na guia Console e redes do Chrome, você verá:Quando você tem
Host != Origin
o CORS, e quando o servidor detecta essa solicitação, geralmente a bloqueia por padrão .Origin=null
é definido quando você abre o conteúdo HTML de um diretório local e envia uma solicitação. A mesma situação é quando você envia uma solicitação dentro de um<iframe>
, como no snippet abaixo (mas aqui oHost
cabeçalho não está definido) - em geral, em todos os lugares em que a especificação HTML diz origem opaca, você pode traduzir isso paraOrigin=null
. Mais informações sobre isso você pode encontrar aqui .Se você não usar uma solicitação CORS simples, geralmente o navegador também envia automaticamente uma solicitação OPTIONS antes de enviar a solicitação principal - mais informações estão aqui . O snippet abaixo mostra:
Você pode alterar a configuração do seu servidor para permitir solicitações CORS.
Aqui está um exemplo de configuração que ativa o CORS no nginx (arquivo nginx.conf) - tenha muito cuidado com a configuração
always/"$http_origin"
do nginx e"*"
do Apache - isso desbloqueará o CORS de qualquer domínio.Mostrar snippet de código
Aqui está um exemplo de configuração que ativa o CORS no Apache (arquivo .htaccess)
Mostrar snippet de código
fonte
Foi encontrado o mesmo erro em diferentes casos de uso.
Caso de uso: no chrome, quando tentou chamar o ponto final do Spring REST em angular.
Solução: adicione a anotação @CrossOrigin ("*") na parte superior da respectiva classe Controller.
fonte
Se você usa o .NET como camada intermediária, verifique o atributo route claramente, por exemplo,
Eu tive problemas quando era assim,
Corrigido por isso,
fonte
Somente para o projeto da API Web do .NET Core, adicione as seguintes alterações:
services.AddMvc()
linha noConfigureServices()
método do arquivo Startup.cs:app.UseMvc()
linha noConfigure()
método do arquivo Startup.cs:fonte