Estoy usando Angular 4 HttpClient
para enviar solicitudes a un servicio externo. Es una configuración muy estándar:
this.httpClient.get(url).subscribe(response => {
//do something with response
}, err => {
console.log(err.message);
}, () => {
console.log('completed');
}
El problema es que, cuando falla la solicitud, veo un Http failure response for (unknown url): 0 Unknown Error
mensaje genérico
en la consola. Mientras tanto, cuando inspecciono la solicitud fallida en Chrome, puedo ver que el estado de la respuesta es 422, y en la pestaña "vista previa" veo el mensaje real que describe la causa del error.
¿Cómo accedo al mensaje de respuesta real que puedo ver en las herramientas de desarrollo de Chrome?
angular
typescript
grdl
fuente
fuente
err
objeto completo , no solo elmessage
Respuestas:
El problema estaba relacionado con CORS . Noté que había otro error en la consola de Chrome:
Esto significa que a la respuesta del servidor backend le faltaba el
Access-Control-Allow-Origin
encabezado aunque el backend nginx estaba configurado para agregar esos encabezados a las respuestas con laadd_header
directiva .Sin embargo, esta directiva solo agrega encabezados cuando el código de respuesta es 20X o 30X. En las respuestas de error faltaban los encabezados. Necesitaba usar el
always
parámetro para asegurarme de que se agregue el encabezado independientemente del código de respuesta:add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
Una vez que el backend se configuró correctamente, pude acceder al mensaje de error real en el código angular.
fuente
En caso de que alguien más termine tan perdido como yo ... Mis problemas NO se debieron a CORS (¡tengo el control total de los servidores y CORS se configuró correctamente!).
Mi problema fue porque estoy usando el nivel 28 de la plataforma Android que deshabilita las comunicaciones de red de texto sin formato de forma predeterminada y estaba tratando de desarrollar la aplicación que apunta a la IP de mi computadora portátil (que ejecuta el servidor API). La URL base de la API es algo así como http: // [LAPTOP_IP]: 8081 . Como no es https , la vista web de Android bloquea completamente la transferencia de red entre el teléfono / emulador y el servidor de mi computadora portátil. Para arreglar esto:
Agregar una configuración de seguridad de red
Nuevo archivo en el proyecto: resources / android / xml / network_security_config.xml
NOTA: Esto debe usarse con cuidado ya que permitirá todo el texto sin cifrar de su aplicación (nada forzado a usar https). Puede restringirlo más si lo desea.
Haga referencia a la configuración en config.xml principal
¡Eso es! A partir de ahí, reconstruí el APK y la aplicación ahora podía comunicarse tanto desde el emulador como desde el teléfono.
Más información sobre la red sec: https://developer.android.com/training/articles/security-config.html#CleartextTrafficPermitted
fuente
http
.. sería no será un problema si usohttps
.... pero en caso de que aún desea utilizarhttp
, i añadir directamenteandroid:usesCleartextTraffic="true"
enapplication
la etiqueta enAndroidManifest.xml
. ..y está funcionando .... gracias por mencionar sobrecleartext
...trabajando para mí después de desactivar la extensión de bloqueo de anuncios en Chrome, este error aparece en algún momento porque algo que bloquea http en el navegador
fuente
Si está utilizando la aplicación .NET Core, ¡esta solución podría ayudar!
Además, esto podría no ser un error de solicitud angular u otro en su aplicación frontal
Primero, debe agregar el paquete Microsoft CORS Nuget:
Luego, debe agregar los servicios CORS en su startup.cs. En su método ConfigureServices debería tener algo similar a lo siguiente:
A continuación, agregue el middleware CORS a su aplicación. En su startup.cs debe tener un método Configure. Necesitas tenerlo similar a esto:
Las opciones lambda son una API fluida, por lo que puede agregar / eliminar cualquier opción adicional que necesite. De hecho, puede usar la opción "AllowAnyOrigin" para aceptar cualquier dominio, pero le recomiendo que no lo haga, ya que abre llamadas de origen cruzado de cualquier persona. También puede limitar las llamadas de origen cruzado a su método HTTP (GET / PUT / POST, etc.), por lo que solo puede exponer llamadas GET entre dominios, etc.
fuente
Este error me estaba ocurriendo en Firefox pero no en Chrome mientras desarrollaba localmente, y resultó ser causado por Firefox no confiando en el certificado ssl de mi API local (que no es válido, pero lo había agregado a mi tienda de certificados local, lo que permitió Chrome confía en él pero no en ff). Navegar a la API directamente y agregar una excepción en Firefox solucionó el problema.
fuente
Para mí, fue causado por una excepción JsonSerializerException del lado del servidor.
El cliente dijo:
Simplificar el tipo de respuesta al eliminar los bucles resolvió el problema.
fuente
Si está utilizando Laravel como su Backend, edite su archivo .htaccess simplemente pegando este código, para resolver el problema CROS en su proyecto Angular o IONIC
fuente
Puede ocurrir un error similar cuando no proporcionó un certificado de cliente válido y un token que su servidor comprenda:
Error:
Código de ejemplo:
Tenga en cuenta que ambos
MyClientCert
&MyToken
son cadenas vacías, de ahí el error.MyClientCert
&MyToken
puede ser cualquier nombre que comprenda su servidor.fuente
Estoy usando ASP.NET SPA Extensions que me crea un proxy en los puertos 5000 y 5001 que pasan al puerto 4200 de Angular durante el desarrollo.
Había configurado CORS correctamente para el puerto https 5001 y todo estaba bien, pero sin darme cuenta fui a un marcador antiguo que era para el puerto 5000. Entonces, de repente, apareció este mensaje. Como han dicho otros en la consola, había un mensaje de error de "verificación previa".
Por lo tanto, independientemente de su entorno, si está utilizando CORS, asegúrese de tener todos los puertos especificados, ya que el host y el puerto son importantes.
fuente
Recibía ese mensaje exacto cada vez que mis solicitudes tardaban más de 2 minutos en completarse. El navegador se desconectaría de la solicitud, pero la solicitud en el backend continuó hasta que finalizó. El servidor (ASP.NET Web API en mi caso) no detectaría la desconexión.
Después de un día entero de búsqueda, finalmente encontré esta respuesta , explicando que si usa la configuración de proxy , tiene un tiempo de espera predeterminado de 120 segundos (o 2 minutos).
Por lo tanto, puede editar la configuración de su proxy y configurarla para lo que necesite:
Ahora, estaba usando agentkeepalive para que funcione con la autenticación NTLM y no sabía que el tiempo de espera del agente no tiene nada que ver con el tiempo de espera del proxy, por lo que ambos deben configurarse. Me tomó un tiempo darme cuenta de eso, así que aquí hay un ejemplo:
fuente
Para mí, era un problema del navegador, ya que mis solicitudes funcionaban bien en Postman.
Resulta que, por alguna razón, Firefox y Chrome bloquearon las solicitudes que iban al puerto
6000
, una vez que cambié el puerto de la API ASP.NET a4000
, el error cambió a un error CORS conocido que pude corregir.Chrome al menos me mostró lo
ERR_UNSAFE_PORT
que me dio una pista sobre lo que podría estar mal.fuente
Si tiene un encabezado cors adecuado en su lugar. Su red corporativa puede estar eliminando el encabezado cors. Si el sitio web es accesible desde el exterior, intente acceder desde fuera de su red para verificar si la red está causando el problema, una buena idea independientemente de la causa.
fuente
En asp.net core, si su controlador api no tiene una anotación llamada
[AllowAnonymous]
, agréguela arriba del nombre de su controlador comofuente
No es tan antiguo como otras preguntas, pero simplemente luché con esto en una aplicación Ionic-Laravel, y nada funciona desde aquí (y otras publicaciones), así que instalé https://github.com/barryvdh/laravel-cors complemento en Laravel y comenzó y funciona bastante bien.
fuente
La mía fue causada por una relación no válida en los modelos que estaba tratando de consultar. Descubierto al depurar la respuesta, se estrelló en la relación.
fuente
Para mí no fue un problema angular. Era un campo de tipo DateTime en la base de datos que tiene un valor de (0000-00-00) y mi modelo no puede vincular esa propiedad correctamente, así que cambié a un valor válido como (2019-08-12).
Estoy usando .net core, OData v4 y MySql (conector EF pomelo)
fuente
fuente
Si se trata de un servicio de nodo, pruebe los pasos descritos aquí
Básicamente, es un error de intercambio de recursos de origen cruzado (CORS). Más información sobre estos errores aquí. .
Una vez que actualicé mi servicio de nodo con las siguientes líneas, funcionó:
fuente
Mi error fue que el archivo era demasiado grande (el núcleo de dotnet parece tener un límite de @ ~ 25Mb). Ajuste
resolvió el problema por mí.
fuente