Używam Angular 4 HttpClient
do wysyłania żądań do usługi zewnętrznej. To bardzo standardowa konfiguracja:
this.httpClient.get(url).subscribe(response => {
//do something with response
}, err => {
console.log(err.message);
}, () => {
console.log('completed');
}
Problem polega na tym, że gdy żądanie nie powiedzie się, Http failure response for (unknown url): 0 Unknown Error
w konsoli pojawia się ogólny
komunikat. W międzyczasie, gdy sprawdzam nieudane żądanie w chrome, widzę, że status odpowiedzi to 422, aw zakładce "podgląd" widzę aktualny komunikat opisujący przyczynę niepowodzenia.
Jak uzyskać dostęp do rzeczywistego komunikatu odpowiedzi, który widzę w narzędziach programistycznych Chrome?
angular
typescript
grdl
źródło
źródło
err
obiekt - nie tylkomessage
Odpowiedzi:
Problem był związany z CORS . Zauważyłem, że pojawił się inny błąd w konsoli Chrome:
Oznacza to, że w odpowiedzi z serwera zaplecza brakowało
Access-Control-Allow-Origin
nagłówka, mimo że nginx zaplecza został skonfigurowany do dodawania tych nagłówków do odpowiedzi zadd_header
dyrektywą .Jednak ta dyrektywa dodaje nagłówki tylko wtedy, gdy kod odpowiedzi to 20X lub 30X. W odpowiedziach na błędy brakowało nagłówków. Musiałem użyć
always
parametru, aby upewnić się, że nagłówek jest dodawany niezależnie od kodu odpowiedzi:add_header 'Access-Control-Allow-Origin' 'http://localhost:4200' always;
Po prawidłowym skonfigurowaniu zaplecza mogłem uzyskać dostęp do rzeczywistego komunikatu o błędzie w kodzie Angular.
źródło
Na wypadek, gdyby ktoś inny zgubił się tak samo jak ja ... Moje problemy NIE były spowodowane przez CORS (mam pełną kontrolę nad serwerami i CORS został poprawnie skonfigurowany!).
Mój problem polegał na tym, że używam platformy Android na poziomie 28, która domyślnie wyłącza komunikację sieciową w postaci zwykłego tekstu i próbowałem opracować aplikację, która wskazuje adres IP mojego laptopa (na którym działa serwer API). Podstawowy adres URL interfejsu API to http: // [LAPTOP_IP]: 8081 . Ponieważ nie jest to protokół HTTPS , Android Webview całkowicie blokuje xfer sieciowy między telefonem / emulatorem a serwerem na moim laptopie. Aby to naprawić:
Dodaj konfigurację zabezpieczeń sieci
Nowy plik w projekcie: resources / android / xml / network_security_config.xml
UWAGA: Należy tego używać ostrożnie, ponieważ zezwoli na cały zwykły tekst z Twojej aplikacji (nic nie jest zmuszone do używania https). Jeśli chcesz, możesz to jeszcze bardziej ograniczyć.
Odwołaj się do konfiguracji w głównym config.xml
Otóż to! Stamtąd przebudowałem APK i aplikacja była teraz w stanie komunikować się zarówno z emulatora, jak i telefonu.
Więcej informacji na temat sieci sec: https://developer.android.com/training/articles/security-config.html#CleartextTrafficPermitted
źródło
http
.. to nie jest problem, jeśli mogę użyćhttps
.... ale w przypadku nadal chcę korzystaćhttp
, i bezpośrednio dodaćandroid:usesCleartextTraffic="true"
wapplication
taguAndroidManifest.xml
. ..i działa .... dzięki za wzmiankę ocleartext
...działa u mnie po wyłączeniu rozszerzenia blokującego reklamy w chrome, ten błąd czasami pojawia się ponieważ coś blokuje http w przeglądarce
źródło
Jeśli korzystasz z aplikacji .NET Core, to rozwiązanie może pomóc!
Co więcej, może to nie być błąd Angulara lub inny błąd żądania w Twojej aplikacji front-end
Najpierw musisz dodać pakiet Microsoft CORS Nuget:
Następnie musisz dodać usługi CORS do pliku startup.cs. W metodzie ConfigureServices powinieneś mieć coś podobnego do następującego:
Następnie dodaj oprogramowanie pośredniczące CORS do swojej aplikacji. W swoim startup.cs powinieneś mieć metodę Configure. Musisz mieć podobny do tego:
Opcje lambda to płynny interfejs API, dzięki czemu możesz dodawać / usuwać dodatkowe opcje, których potrzebujesz. W rzeczywistości możesz użyć opcji „AllowAnyOrigin”, aby zaakceptować dowolną domenę, ale zdecydowanie odradzam to robić, ponieważ otwiera to połączenia między źródłami od kogokolwiek. Możesz również ograniczyć wywołania między źródłami do ich metody HTTP (GET / PUT / POST itp.), Dzięki czemu możesz ujawniać tylko wywołania GET między domenami itp.
źródło
Ten błąd występował u mnie w przeglądarce Firefox, ale nie w Chrome podczas lokalnego programowania, i okazało się, że jest on spowodowany tym, że Firefox nie ufa certyfikatowi ssl mojego lokalnego interfejsu API (który jest nieprawidłowy, ale dodałem go do mojego lokalnego magazynu certyfikatów, co pozwoliło chrome mu wierzy, ale nie ff). Bezpośrednie przejście do interfejsu API i dodanie wyjątku w przeglądarce Firefox rozwiązało problem.
źródło
U mnie było to spowodowane przez wyjątek JsonSerializerException po stronie serwera.
Klient powiedział:
Uproszczenie typu odpowiedzi poprzez wyeliminowanie pętli rozwiązało problem.
źródło
Jeśli używasz Laravel jako zaplecza, edytuj plik .htaccess, po prostu wklejając ten kod, aby rozwiązać problem CROS w projekcie Angular lub IONIC
źródło
Podobny błąd może wystąpić, gdy nie podałeś ważnego certyfikatu klienta i tokena, które Twój serwer rozumie:
Błąd:
Przykładowy kod:
Zauważ, że oba
MyClientCert
&MyToken
są pustymi ciągami, stąd błąd.MyClientCert
&MyToken
może być dowolną nazwą zrozumiałą dla Twojego serwera.źródło
Używam rozszerzeń ASP.NET SPA, które tworzą proxy na portach 5000 i 5001, które przechodzą do portu 4200 Angulara podczas programowania.
Miałem poprawnie skonfigurowany CORS dla portu https 5001 i wszystko było w porządku, ale nieumyślnie przeszedłem do starej zakładki, która była dla portu 5000. Wtedy nagle pojawił się ten komunikat. Jak powiedzieli inni w konsoli, pojawił się komunikat o błędzie „preflight”.
Dlatego niezależnie od środowiska, jeśli używasz CORS, upewnij się, że określono wszystkie porty - ponieważ host i port mają znaczenie.
źródło
Otrzymywałem tę dokładną wiadomość, gdy moje prośby zajmowały więcej niż 2 minuty. Przeglądarka rozłączała się z żądaniem, ale żądanie w zapleczu trwało aż do zakończenia. Serwer (ASP.NET Web API w moim przypadku) nie wykrył rozłączenia.
Po całodniowych poszukiwaniach w końcu znalazłem tę odpowiedź , wyjaśniając, że jeśli używasz konfiguracji proxy , ma domyślny limit czasu wynoszący 120 sekund (lub 2 minuty).
Możesz więc edytować konfigurację serwera proxy i ustawić ją na dowolną potrzebną:
Teraz używałem agentkeepalive, aby działało z uwierzytelnianiem NTLM i nie wiedziałem, że limit czasu agenta nie ma nic wspólnego z limitem czasu serwera proxy, więc oba muszą być ustawione. Trochę mi to zajęło, więc oto przykład:
źródło
Dla mnie był to problem z przeglądarką, ponieważ moje żądania działały dobrze w programie Postman.
Okazuje się, że z jakiegoś powodu Firefox i Chrome zablokowały żądania przechodzące do portu
6000
, kiedy zmieniłem port API ASP.NET na4000
, błąd zmienił się na znany błąd CORS, który mogłem naprawić.Chrome przynajmniej pokazał mi,
ERR_UNSAFE_PORT
co dało mi wskazówkę, co może być nie tak.źródło
Jeśli masz odpowiedni nagłówek cors na miejscu. Twoja sieć firmowa może usuwać nagłówek cors. Jeśli witryna jest dostępna z zewnątrz, spróbuj uzyskać do niej dostęp spoza sieci, aby sprawdzić, czy to sieć powoduje problem - dobry pomysł niezależnie od przyczyny.
źródło
W asp.net core, jeśli kontroler API nie ma wywoływanej adnotacji
[AllowAnonymous]
, dodaj ją powyżej nazwy kontrolera, na przykładźródło
Nie jest tak stara jak inne pytania, ale po prostu zmagałem się z tym w aplikacji Ionic-Laravel i nic stąd nie działa (i inne posty), więc zainstalowałem https://github.com/barryvdh/laravel-cors uzupełnienie w Laravel i zaczął i działa całkiem dobrze.
źródło
Mój był spowodowany nieprawidłową relacją w modelach, które próbowałem sprawdzić. Zrozumiano, debugując odpowiedź, która spowodowała awarię w relacji.
źródło
Dla mnie to nie był problem kątowy. Czy w bazie danych było pole typu DateTime, które ma wartość (0000-00-00), a mój model nie może powiązać tej właściwości poprawnie, więc zmieniłem na prawidłową wartość, taką jak (2019-08-12).
Używam .net core, OData v4 i MySql (złącze EF pomelo)
źródło
źródło
Jeśli jest to usługa węzłowa, wykonaj czynności opisane tutaj
Zasadniczo jest to błąd udostępniania zasobów między źródłami (CORS). Więcej informacji o takich błędach tutaj .
Po zaktualizowaniu usługi węzła następującymi wierszami zadziałało:
źródło
Mój błąd polegał na tym, że plik był zbyt duży (rdzeń dotnet wydaje się mieć limit @ ~ 25 MB). Oprawa
rozwiązał problem za mnie.
źródło