Estou usando o Angular 4 HttpClient
para enviar solicitações para serviços externos. É uma configuração muito padrão:
this.httpClient.get(url).subscribe(response => {
//do something with response
}, err => {
console.log(err.message);
}, () => {
console.log('completed');
}
O problema é que, quando a solicitação falha, vejo uma Http failure response for (unknown url): 0 Unknown Error
mensagem genérica
no console. Enquanto isso, quando inspeciono a solicitação com falha no chrome, vejo que o status da resposta é 422 e, na guia "preview", vejo a mensagem real descrevendo a causa da falha.
Como acesso a mensagem de resposta real que posso ver nas ferramentas de desenvolvimento do chrome?
angular
typescript
grdl
fonte
fonte
err
objeto - não só amessage
Respostas:
O problema estava relacionado ao CORS . Percebi que havia outro erro no console do Chrome:
Isso significa que a resposta do servidor de back-end estava ausente do
Access-Control-Allow-Origin
cabeçalho, embora o back-end nginx estivesse configurado para adicionar esses cabeçalhos às respostas comadd_header
diretiva .No entanto, esta diretiva adiciona cabeçalhos apenas quando o código de resposta é 20X ou 30X. Nas respostas a erros, os cabeçalhos estavam ausentes. Eu precisava usar o
always
parâmetro para garantir que o cabeçalho fosse adicionado, independentemente do código de resposta:add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
Depois que o back-end foi configurado corretamente, eu pude acessar a mensagem de erro real no código Angular.
fonte
Caso alguém acabe tão perdido quanto eu ... Meus problemas NÃO foram causados pelo CORS (eu tenho controle total do (s) servidor (es) e o CORS foi configurado corretamente!).
Meu problema foi porque estou usando a plataforma Android nível 28, que desabilita as comunicações de rede de texto não criptografado por padrão, e estava tentando desenvolver o aplicativo que aponta para o IP do meu laptop (que está executando o servidor da API). O URL base da API é algo como http: // [LAPTOP_IP]: 8081 . Como não é https , o android webview bloqueia completamente o xfer da rede entre o telefone / emulador e o servidor no meu laptop. Para corrigir isso:
Adicionar uma configuração de segurança de rede
Novo arquivo no projeto: resources / android / xml / network_security_config.xml
NOTA: Isso deve ser usado com cuidado, pois permitirá todo o texto não criptografado do seu aplicativo (nada forçado a usar https). Você pode restringir ainda mais, se desejar.
Consulte a configuração no arquivo config.xml principal
É isso aí! A partir daí, reconstruí o APK e o aplicativo agora conseguia se comunicar pelo emulador e pelo telefone.
Mais informações sobre o segundo da rede: https://developer.android.com/training/articles/security-config.html#CleartextTrafficPermitted
fonte
http
.. que não iria ser um problema se eu usarhttps
.... mas no caso de eu ainda quero usarhttp
, eu diretamente adicionarandroid:usesCleartextTraffic="true"
naapplication
tag noAndroidManifest.xml
. ..e está funcionando .... obrigado por mencionarcleartext
...trabalhando para mim depois de desativar a extensão de bloco de anúncios no chrome, esse erro aparece em algum momento porque algo que bloqueia o http no navegador
fonte
Se você estiver usando o aplicativo .NET Core, esta solução pode ajudar!
Além disso, isso pode não ser um erro de solicitação angular ou outro no seu aplicativo front-end
Primeiro, você precisa adicionar o pacote Microsoft CORS Nuget:
Você precisará adicionar os serviços CORS no seu startup.cs. No seu método ConfigureServices, você deve ter algo semelhante ao seguinte:
Em seguida, adicione o middleware CORS ao seu aplicativo. No seu startup.cs, você deve ter um método Configure. Você precisa tê-lo semelhante a este:
As opções lambda são uma API fluente para que você possa adicionar / remover quaisquer opções extras necessárias. Você pode realmente usar a opção "AllowAnyOrigin" para aceitar qualquer domínio, mas eu recomendo que você não faça isso, pois abre chamadas de origem cruzada de qualquer pessoa. Você também pode limitar as chamadas de origem cruzada ao método HTTP (GET / PUT / POST etc), para que você possa expor apenas as chamadas GET entre domínios, etc.
fonte
Esse erro estava ocorrendo para mim no Firefox, mas não no Chrome, durante o desenvolvimento local, e acabou sendo causado pelo fato de o Firefox não confiar no certificado SSL da minha API local (que não é válido, mas eu o adicionei à minha loja local de certificados , que permite chrome confiar, mas não ff). Navegar para a API diretamente e adicionar uma exceção no Firefox corrigiu o problema.
fonte
Para mim, foi causado por um servidor JsonSerializerException.
O cliente disse:
Tornar o tipo de resposta mais simples, eliminando os loops, resolveu o problema.
fonte
Se você estiver usando o Laravel como seu back-end, edite seu arquivo .htaccess apenas colando este código, para resolver o problema de CROS no seu projeto Angular ou IONIC
fonte
Um erro semelhante pode ocorrer quando você não fornece um certificado de cliente válido e um token que seu servidor entende:
Erro:
Código de exemplo:
Note-se que ambos
MyClientCert
&MyToken
são strings vazias, daí o erro.MyClientCert
&MyToken
pode ser qualquer nome que seu servidor entenda.fonte
Estou usando as extensões ASP.NET SPA, que me criam um proxy nas portas 5000 e 5001 que passam para a porta 4200 da Angular durante o desenvolvimento.
Eu tinha o CORS configurado corretamente para a porta https 5001 e tudo estava bem, mas inadvertidamente fui para um marcador antigo que era para a porta 5000. Então, de repente, essa mensagem surgiu. Como outros já disseram no console, houve uma mensagem de erro 'preflight'.
Portanto, independentemente do seu ambiente, se você estiver usando o CORS, verifique se todas as portas foram especificadas - pois o host e a porta são importantes.
fonte
Eu recebia a mensagem exata sempre que meus pedidos demoravam mais de 2 minutos para terminar. O navegador se desconectaria da solicitação, mas a solicitação no back-end continuou até que fosse concluída. O servidor (API Web da ASP.NET no meu caso) não detectou a desconexão.
Depois de um dia inteiro pesquisando, finalmente encontrei esta resposta , explicando que, se você usar a configuração do proxy , ela terá um tempo limite padrão de 120 segundos (ou 2 minutos).
Portanto, você pode editar sua configuração de proxy e configurá-la para o que precisar:
Agora, eu estava usando agentkeepalive para fazê-lo funcionar com a autenticação NTLM e não sabia que o tempo limite do agente não tinha nada a ver com o tempo limite do proxy, portanto, é necessário definir os dois. Levei um tempo para perceber isso, então aqui está um exemplo:
fonte
Para mim, era um problema de navegador, pois meus pedidos estavam funcionando bem no Postman.
Acontece que, por algum motivo, o Firefox e o Chrome bloquearam solicitações de entrada
6000
, depois que mudei a porta da API do ASP.NET para4000
, o erro mudou para um erro conhecido do CORS que eu poderia corrigir.O Chrome pelo menos me mostrou o
ERR_UNSAFE_PORT
que me deu uma pista sobre o que poderia estar errado.fonte
Se você tiver um cabeçalho de cors adequado no lugar. Sua rede corporativa pode estar removendo o cabeçalho cors. Se o site estiver acessível externamente, tente acessá-lo de fora da sua rede para verificar se a rede está causando o problema - uma boa ideia, independentemente da causa.
fonte
No núcleo do asp.net, se o seu controlador de API não tiver uma anotação chamada
[AllowAnonymous]
, adicione-a acima do nome do seu controlador, comofonte
Não é tão antigo quanto as outras perguntas, mas apenas lutei com isso em um aplicativo Ionic-Laravel, e nada funciona a partir daqui (e outras postagens), então instalei https://github.com/barryvdh/laravel-cors o complemento em Laravel e começou e funciona muito bem.
fonte
O meu foi causado por um relacionamento inválido nos modelos que eu estava tentando consultar. Descoberto por depuração da resposta que caiu na relação.
fonte
Para mim, não era um problema angular. Era um campo do tipo DateTime no banco de dados que tem um valor de (0000-00-00) e meu modelo não pode vincular essa propriedade correta, então mudei para um valor válido como (2019-08-12).
Estou usando o .net core, OData v4 e MySql (conector EF pomelo)
fonte
fonte
Se este for um serviço de nó, tente as etapas descritas aqui
Basicamente, é um erro de compartilhamento de recursos de origem cruzada (CORS). Mais informações sobre esses erros aqui .
Depois de atualizar meu serviço de nó com as seguintes linhas, ele funcionou:
fonte
Meu erro foi que o arquivo era muito grande (o núcleo do dotnet parece ter um limite de ~ 25Mb). Configuração
resolveu o problema para mim.
fonte