Nie można pobrać danych za pomocą XMLHttpRequest (status 0 i tekst odpowiedzi jest pusty):
xmlhttp = new XMLHttpRequest (); xmlhttp.open ("POBIERZ", "http://www.w3schools.com/XML/cd_catalog.xml", prawda); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) alert ("stan" + xmlhttp.status); } xmlhttp.send ();
Informuje o „statusie 0”.
Taka sama sytuacja z żądaniem localhost (cd_catalog.xml jest zapisywany jako plik lokalny)
xmlhttp.open ("POBIERZ", "http: //localhost/cd_catalog.xml", true);
Ale z żądaniem adresu IP hosta lokalnego
xmlhttp.open ("POBIERZ", "http://127.0.0.1/cd_catalog.xml", prawda);
i z żądaniem pliku lokalnego
xmlhttp.open ("POBIERZ", "cd_catalog.xml", prawda);
wszystko w porządku (stan 200)
Co może powodować problem (stan = 0) z żądaniem online?
PS: Live HTTP Headers pokazuje, że wszystko jest w porządku we wszystkich 4 przypadkach:
HTTP / 1.1 200 OK Content-Length: 4742
PS2: lokalny serwer WWW Apache na VMWare (system operacyjny hosta Win7, system operacyjny gościa Ubuntu, karta sieciowa - NAT). Przeglądarka - Firefox.
javascript
ajax
xmlhttprequest
arigasa
źródło
źródło
http://127.0.0.1
jest przypadkiem? ;)XMLHttpRequest
nie może wykonywać żądań między domenami. Istnieją jednak pewne obejścia. Spójrz na przykład na jquery.Odpowiedzi:
status wynosi 0, gdy plik html zawierający skrypt jest otwierany w przeglądarce za pomocą schematu pliku. Upewnij się, że umieściłeś pliki na swoim serwerze (apache lub tomcat cokolwiek), a następnie otwórz je za pomocą protokołu http w przeglądarce. (tj. http: //localhost/myfile.html ) To jest rozwiązanie.
źródło
file://
schemat). Oczywiście musisz najpierw zezwolić na ładowanie pliku lokalnego, wyłączając CORS.Przyczyną twoich problemów jest to, że próbujesz wykonać połączenie międzydomenowe i kończy się niepowodzeniem .
Jeśli zajmujesz się rozwojem hosta lokalnego, możesz wykonywać połączenia między domenami - robię to cały czas.
W przypadku przeglądarki Firefox musisz ją włączyć w ustawieniach konfiguracji
Następnie dodaj coś takiego do swojego otwartego kodu XHR:
W przypadku IE, o ile dobrze pamiętam, wszystko, co musisz zrobić, to włączyć ustawienia zabezpieczeń przeglądarki w sekcji „Różne → Dostęp do źródeł danych w różnych domenach”, aby umożliwić współpracę z XHR ActiveX.
IE8 i nowsze również dodały możliwości międzydomenowe do natywnych obiektów XmlHttpRequest, ale jeszcze się nimi nie bawiłem.
źródło
--allow-file-access-from-files
--allow-file-access-from-files
przełącznikiem, ale nie trzeba zamykać wszystkich innych uruchomionych instancji. Dokładnie tak, jak w przypadku trybu incognito Chrome - możesz z niego korzystać, bez zamykania innych uruchomionych instancji.Właściwie upewnij się, że typ przycisku to Przycisk nie wyślij, co spowodowało konflikt statusu w miejscu, w którym ostatnio się spotkałem.
źródło
e.preventDefault()
Jeśli serwer odpowiada na metodę OPTIONS oraz na GET i POST (niezależnie od tego, którego z nich używasz) z nagłówkiem takim jak:
To może działać dobrze. Wydaje się w FireFox 3.5 i rekonq 0.4.0. Najwyraźniej z tym nagłówkiem i początkową odpowiedzią na OPCJE serwer mówi do przeglądarki „Śmiało i pozwól, aby to żądanie międzydomenowe przeszło”.
źródło
XMLHttpRequest
(tj. Zgodnie z pierwotnym pytaniem), ponieważ ten zasób nie zawiera (przynajmniej od 24 kwietnia 2015 r.) Żadnego takiego nagłówka CORS.Weź również pod uwagę limit czasu żądania :
Nowoczesna przeglądarka zwraca readyState = 4 i s tatus = 0, jeśli upłynie zbyt dużo czasu przed odpowiedzią serwera.
źródło
Dodaj
setRequestHeader("Access-Control-Allow-Origin","*")
do odpowiedzi serwera.źródło
Miałem podobny problem. Wszystko było w porządku, „readystate” wynosił 4, ale „status” wynosił 0. To dlatego, że korzystałem z przenośnego serwera Apache PHP, a mój plik, w którym użyłem obiektu „XMLHttpRequest”, był plikiem html. Zmieniłem rozszerzenie pliku na php i problem został rozwiązany.
źródło
Otwórz konsolę javascript . Zobaczysz tam komunikat o błędzie. W moim przypadku był to CORS.
źródło
Aby odpowiedzieć na pytanie, dlaczego
http://127.0.0.1/cd_catalog.xml
działa, ahttp://localhost/cd_catalog.xml
nie: Firefox traktuje 127.0.0.1 i localhost jako dwie różne domeny.źródło
Aby zobaczyć, na czym polega problem, gdy pojawi się tajemniczy błąd 0, przejdź do ... | Więcej narzędzi | Narzędzia programistyczne (Ctrl + Shift + I) w Chrome (na stronie podającej błąd)
Przeczytaj czerwony tekst w dzienniku, aby wyświetlić prawdziwy komunikat o błędzie. Jeśli jest tam za dużo, kliknij prawym przyciskiem myszy i Wyczyść konsolę, a następnie powtórz ostatnie żądanie.
Mój pierwszy problem polegał na tym, że po raz pierwszy przekazywałem nagłówki autoryzacji do mojej własnej międzydomenowej usługi internetowej dla przeglądarki.
Miałem już:
Ale nie:
w nagłówku odpowiedzi mojej usługi internetowej.
Po dodaniu tego, mój błąd zerowy zniknął z mojego własnego serwera WWW, a także podczas lokalnego uruchamiania pliku index.html bez serwera WWW, ale nadal wyświetlał błędy w piórze kodu.
Wróć do ... | Więcej narzędzi | Developer Tools podczas otrzymywania błędu w codepen, i jest to jasno wyjaśnione: codepen używa https, więc nie mogę dzwonić do http, ponieważ bezpieczeństwo jest niższe.
Dlatego muszę hostować moją usługę internetową pod adresem https.
Wiedza o tym, jak uzyskać prawdziwy komunikat o błędzie - bezcenna!
źródło
'https://mysiteoriginsite'
została załadowana przez HTTPS, ale zażądała niezabezpieczonego punktu końcowego XMLHttpRequest'http://MyDestinationSite/MyService.svc'
. To żądanie zostało zablokowane; zawartość musi być dostarczana przez HTTPS.Oto inny przypadek
status === 0
, specyficzny dla przesyłania:Jeśli dołączysz
'load'
procedurę obsługi zdarzeniaXHR.upload
, zgodnie z sugestią MDN (przewiń w dół do części „Monitorowanie postępu” przesyłania), obiekt XHR będzie miał,status=0
a wszystkie inne właściwości będą pustymi ciągami. Jeśli podłączysz'load'
moduł obsługi bezpośrednio do obiektu XHR, tak jak podczas pobierania treści, wszystko powinno być w porządku (biorąc pod uwagę, że nie korzystasz z lokalnego hosta).Jeśli jednak chcesz uzyskać dobre dane w swoich
'progress'
programach obsługi zdarzeń, musisz dołączyć procedurę obsługi doXHR.upload
, a nie bezpośrednio do samego obiektu XHR.Do tej pory testowałem to tylko na Chrome OSX, więc nie jestem pewien, jak duży problem dotyczy dokumentacji MDN, a ile implementacji Chrome ...
źródło
Alex Robinson już (i pierwszy) daje poprawną odpowiedź na to pytanie. Ale żeby rozwinąć to trochę bardziej ...
Musisz dodać nagłówek odpowiedzi HTTP:
Access-Control-Allow-Origin: *
Jeśli to zrobisz, rezultatem będzie nie tylko „może zadziałać”, ale „zadziała”.
Uwaga: Musisz dodać nagłówek odpowiedzi HTTP - możesz to zrobić tylko na serwerze, który kontrolujesz. Nigdy nie będzie możliwe bezpośrednie pobranie http://w3schools.com/XML/cd_catalog.xml z oryginalnego adresu URL za pomocą
XMLHttpRequest
(zgodnie z pytaniem OP), ponieważ ten zasób nie (przynajmniej od 24 kwietnia 2015 r.) zawierać dowolny taki nagłówek CORS.http://en.wikipedia.org/wiki/Cross-origin_resource_sharing zawiera więcej informacji.
źródło
Mój problem podobny do tego został rozwiązany poprzez sprawdzenie mojego kodu HTML. Miałem program
onclick
obsługi w moim formularzu przycisk przesyłania do metody. słuszne:onclick="sendFalconRequestWithHeaders()"
. Ta metoda z kolei wywołuje Ajax tak jak twoja i robi to, co chcę. Ale nie zgodnie z oczekiwaniami, moja przeglądarka nic nie zwracała.Nauczyłem się z czyjejś ciężkiej pracy , zwróciłem fałsz w tym programie obsługi i rozwiązałem. Pozwól mi wspomnieć, że przed przybyciem do tego postu, spędziłem cały 3-dniowy weekend i pół dnia w biurze pisania kodu wykonawczego
CORS filters
,jetty config
, innejersey and embedded jetty
rzeczy związane - wystarczy, aby to naprawić, odnawialnego wszystkie moje zrozumienie wokół.cross domain ajax requests
I standardów rzeczy. To było śmieszne, jak proste błędy w javascript sprawiają, że głupi.Prawdę mówiąc, próbowałem
signed.applets.codebase_principal_support = true
i pisałemisLocalHost() **if**
. może ta metoda musi zostać przez nas zaimplementowana, firefox mówi, że nie ma takiej Teraz muszę wyczyścić kod, aby czysto przesłać łatkę git. Dzięki temu ktoś.źródło
Żądanie przeglądarki „127.0.0.1/somefile.html” dociera niezmienione do lokalnego serwera WWW, podczas gdy „localhost / jakiś plik.html” może pojawić się jako „0: 0: 0: 0: 0: 0: 0: 1 / somefile.html” jeśli obsługiwany jest protokół IPv6. Więc to drugie może być przetwarzane jako przejście z jednej domeny do innej.
źródło
Alex Robinson i bmju dostarczyli cennych informacji, aby zrozumieć problemy związane z różnymi źródłami. Chciałem dodać, że może być konieczne wykonanie jawnego wywołania OPTIONS w kodzie klienta przed wykonaniem żądanego GET / POST (np. Względem punktu końcowego usługi CORS OAuth). Twoja przeglądarka / biblioteka może nie obsługiwać automatycznie żądania OPCJI. Gruber, to jedna z możliwych odpowiedzi na twoje pytanie.
źródło
Miałem ten sam problem (readyState to 4, a status 0) , potem zastosowałem inne podejście wyjaśnione w tym samouczku: https://spring.io/guides/gs/consuming-rest-jquery/
W ogóle nie używał XMLHttpRequest , zamiast tego użył metody jquery $ .ajax () :
i dla pliku public / hello.js (lub możesz wstawić go bezpośrednio w tym samym kodzie HTML):
źródło
$.ajax()
używaXMLHttpRequest
od wewnątrz, prawda?Musiałem dodać mój aktualny adres IP (ponownie) do białej listy Atlas MongoDB i pozbyłem się błędu XMLHttpRequest status 0
źródło
Po prostu miałem ten problem, ponieważ użyłem
0.0.0.0
jako mojego serwera, zmieniłem go nalocalhost
i działa.źródło
Edycja: przeczytaj poniższe komentarze Malvolio, ponieważ wiedza w tej odpowiedzi jest nieaktualna.
Nie można wykonywać żądań XMLHttpRequests między domenami.
Wywołanie do
127.0.0.1
działa, ponieważ Twoja strona testowa znajduje się pod adresem127.0.0.1
, a test lokalny również działa, ponieważ ... to jest test lokalny.Pozostałe dwa testy kończą się niepowodzeniem, ponieważ JavaScript nie może komunikować się z odległym serwerem za pośrednictwem XMLHttpRequest.
Zamiast tego możesz rozważyć:
Mam nadzieję, że to pomoże
źródło
XMLHttpRequest
s to nie tylko dobry pomysł, jest tak powszechny w dzisiejszych czasach, że NIE robienie ich w nowoczesnej aplikacji internetowej (poza jakimś rodzajem HelloWorlds) jest czymś śmiesznym. Każda zewnętrzna usługa REST, z której korzysta Twoja aplikacja, wymaga połączenia między domenamiXMLHttpRequest
. I dlatego wszystkie te rzeczy z CORS zostały dodane.