wake-up-neo.net

XMLHttpRequest-Status (ResponseText ist leer)

Es können keine Daten mit XMLHttpRequest abgerufen werden (Status 0 und responseText ist leer):

 xmlhttp = new XMLHttpRequest (); 
 xmlhttp.open ("GET", "http://www.w3schools.com/XML/cd_catalog.xml", true); 
 xmlhttp.onreadystatechange = Funktion () 
 {
 if (xmlhttp.readyState == 4) 
 alert ("status" + xmlhttp.status); 
} 
 xmlhttp.send (); 

Es meldet "Status 0".

Die gleiche Situation bei der localhost-Anforderung (cd_catalog.xml wird als lokale Datei gespeichert)

 xmlhttp.open ("GET", "http: //localhost/cd_catalog.xml", true); 

Aber mit der localhost-IP-Anfrage

 xmlhttp.open ("GET", "http://127.0.0.1/cd_catalog.xml", true); 

und mit der lokalen Dateianforderung

 xmlhttp.open ("GET", "cd_catalog.xml", true); 

alles ist in Ordnung (Status 200)

Was kann das Problem (Status = 0) bei der Online-Anfrage verursachen?

PS: Live-HTTP-Header zeigt, dass in allen 4 Fällen alles in Ordnung ist:

 HTTP/1.1 200 OK 
 Inhaltslänge: 4742 

PS2: Lokaler Apache-Webserver unter VMWare (Host OS Win7, Guest OS Ubuntu, Netzwerkadapter - NAT). Browser - Firefox.

87
arigasa

status ist 0, wenn Ihre HTML-Datei, die das Skript enthält, über das Dateischema im Browser geöffnet wird. Stellen Sie sicher, dass Sie die Dateien auf Ihrem Server ablegen (Apache oder Tomcat) und öffnen Sie sie dann über das http-Protokoll im Browser. (d. h. http: //localhost/myfile.html ) Dies ist die Lösung.

38
Abhishek_8

Die Ursache Ihrer Probleme besteht darin, dass Sie versuchen, einen domänenübergreifenden Anruf durchzuführen, und dass dies fehlschlägt .

Wenn Sie eine localhost-Entwicklung durchführen, können Sie domänenübergreifende Anrufe tätigen. Ich mache das ständig. 

Für Firefox müssen Sie es in Ihren Konfigurationseinstellungen aktivieren

signed.applets.codebase_principal_support = true

Dann fügen Sie dem offenen XHR-Code so etwas hinzu:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

Wenn ich mich recht erinnere, müssen Sie für IE nur die Sicherheitseinstellung des Browsers unter "Verschiedenes → Auf Datenquellen über Domänen zugreifen" aktivieren, damit er mit ActiveX XHRs funktioniert. 

IE8 und höher fügten den nativen XmlHttpRequest-Objekten auch domänenübergreifende Funktionen hinzu, aber mit diesen habe ich noch nicht gespielt.

26
Slammer

Vergewissern Sie sich tatsächlich, dass Ihr Schaltflächentyp "Button nicht Submit" ist, was zu Statuskonflikten geführt hat, als ich mich kürzlich traf.

25
dyuan

Wenn der Server auf eine OPTIONS-Methode und auf GET und POST (je nachdem, welche Methode Sie verwenden) mit einem Header wie folgt reagiert:

Access-Control-Allow-Origin: *

Es könnte gut funktionieren. Scheint in FireFox 3.5 und rekonq 0.4.0 . Anscheinend sagt der Server mit diesem Header und der ersten Antwort auf OPTIONS zum Browser: "Gehen Sie voran und lassen Sie diese domänenübergreifende Anfrage durchgehen."

16
Alex Robinson

Beachten Sie auch das Request Timeout :

Moderner Browser return readyState = 4 und s tatus = 0 , wenn zu viel Zeit vergeht, bevor der Server antwortet.

9

Fügen Sie setRequestHeader("Access-Control-Allow-Origin","*") zur Serverantwort hinzu.

6
Ivan

Öffne Javascript-Konsole . Dort wird eine Fehlermeldung angezeigt. In meinem Fall war es CORS.

3
Jarekczek

Ich war mit einem ähnlichen Problem konfrontiert. Alles war in Ordnung, der "readystate" war 4, aber der "Status" war 0. Dies lag daran, dass ich einen tragbaren Apache PHP -Server verwendete und meine Datei, in der ich das "XMLHttpRequest" -Objekt verwendete, eine HTML-Datei war Datei. Ich habe die Dateierweiterung in PHP geändert und das Problem wurde behoben.

3
Reyan

Um die Frage zu beantworten, warum http://127.0.0.1/cd_catalog.xml funktioniert, während http://localhost/cd_catalog.xml nicht funktioniert: Firefox behandelt 127.0.0.1 und localhost als zwei verschiedene Domänen.

2
Tomi Aarnio

Alex Robinson gibt bereits (und erst) die richtige Antwort auf dieses Problem. Aber um es etwas weiter zu erläutern ...

Sie müssen den HTTP-Antwortheader hinzufügen:

Access-Control-Allow-Origin: *

Wenn Sie dies tun, ist das Ergebnis nicht nur "möglicherweise funktioniert", sondern "wird funktionieren".

Hinweis: Sie müssen einen HTTP-Header _ response hinzufügen. Sie können dies also nur auf einem Server tun, den Sie steuern. Es ist nie möglich, http://w3schools.com/XML/cd_catalog.xml von seiner ursprünglichen URL mithilfe einer XMLHttpRequest (gemäß der OP-Frage) abzurufen, da diese Ressource nicht (zumindest nicht als vom 24. April 2015) einen solchen CORS-Header enthalten.

http://en.wikipedia.org/wiki/Cross-Origin_resource_sharing gibt weitere Informationen.

1
Mike Beaton

Hier ist ein weiterer Fall, in dem status === 0 für das Hochladen spezifisch ist:

Wenn Sie einen 'load'-Ereignishandler an XHR.upload anhängen, wie in vorgeschlagen von MDN (scrollen Sie zum Upload-Teil von 'Monitoring progress'), hat das XHR-Objekt status=0 und alle anderen Eigenschaften werden leere Zeichenfolgen sein. Wenn Sie den 'load'-Handler direkt an das XHR-Objekt anhängen, wie Sie es beim Herunterladen von Inhalten tun würden, ist dies in Ordnung (sofern Sie nicht localhost ausführen).

Wenn Sie jedoch gute Daten in Ihren 'progress'-Ereignishandlern erhalten möchten, müssen Sie einen Handler an XHR.upload, not direkt an das XHR-Objekt selbst anhängen.

Ich habe dies bisher nur unter Chrome OSX getestet. Daher bin ich mir nicht sicher, wie viel von dem Problem hier die Dokumentation von MDN ist und wie viel die Implementierung von Chrome ist.

1
ericsoco

Ich musste meine aktuelle IP-Adresse (wieder) der Atlas MongoDB-Whitelist hinzufügen und habe daher den Fehler XMLHttpRequest Status 0 beseitigt

0
Anja

Um zu sehen, was das Problem ist, wenn Sie den kryptischen Fehler 0 erhalten, gehen Sie zu ... | Weitere Tools | Entwicklertools (Strg + Umschalt + I) in Chrome (auf der fehlerhaften Seite)

Lesen Sie den roten Text im Protokoll, um die wahre Fehlermeldung zu erhalten. Wenn sich zu viel darin befindet, klicken Sie mit der rechten Maustaste und Clear Console, und wiederholen Sie die letzte Abfrage. 

Mein erstes Problem war, dass ich zum ersten Mal Authorization-Header an meinen eigenen domänenübergreifenden Webdienst für den Browser übergeben habe.

Ich hatte bereits: 

Access-Control-Allow-Origin: *

Aber nicht:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

im Antwortheader meines Webservice.

Nachdem ich das hinzugefügt hatte, war mein Fehler null von meinem eigenen Webserver verschwunden, ebenso wie beim Ausführen der index.html-Datei lokal ohne Webserver, was jedoch immer noch Fehler im Code-Pen ergab.

Zurück zu ... | Weitere Tools | Entwicklertools, während der Fehler in codepen angezeigt wird, und es wird klar erklärt: codepen verwendet https, daher kann ich keine Aufrufe an http tätigen, da die Sicherheit geringer ist. 

Ich muss daher meinen Webservice auf https hosten.

Wissen, wie Sie die wahre Fehlermeldung erhalten - unbezahlbar!

0
Maya

Mein ähnliches Problem wurde durch die Überprüfung meines HTML-Codes gelöst. Ich hatte einen onclick-Handler in meinem Formular zum Senden einer Schaltfläche. wie folgt: onclick="sendFalconRequestWithHeaders()". Diese Methode wiederum ruft ajax wie Ihre auf und macht, was ich will. Aber nicht wie erwartet, mein Browser gab nichts zurück.

Learned From jemandes harte Arbeit Ich bin in diesem Handler falsch zurückgekommen und habe das Problem gelöst. Bevor ich zu diesem Beitrag komme, habe ich ein ganzes dreitägiges Wochenende und einen halben Tag in Office-Code geschrieben Implementieren von CORS filters, jetty config, anderen jersey and embedded jetty-bezogenen Dingen - um dies zu beheben. Ich verwende mein gesamtes Verständnis um cross domain ajax requests und Standardsachen. Es war lächerlich, wie einfache Fehler in Javascript Sie stumm machen.

Um wahr zu sein, habe ich signed.applets.codebase_principal_support = true ausprobiert und isLocalHost() **if** geschrieben. Diese Methode muss möglicherweise von uns implementiert werden. Firefox gibt an, dass es keine solche gibt. Jetzt muss ich meinen Code bereinigen, um Git-Patch sauber zu senden. Vielen Dank dafür.

0
Siva Tumma

Alex Robinson und bmju lieferten wertvolle Informationen zum Verständnis von Problemen mit Origin. Ich möchte hinzufügen, dass Sie möglicherweise einen expliziten OPTIONS-Aufruf in Ihrem Clientcode ausführen müssen, bevor Sie den gewünschten GET/POST-Befehl (z. B. für einen CORS OAuth-Serviceendpunkt) vornehmen. Ihr Browser/Ihre Bibliothek verarbeitet die Anfrage OPTIONS möglicherweise nicht automatisch. Gruber, das ist eine der möglichen Antworten auf Ihre Frage.

0
Tim McConnell

Ich hatte gerade dieses Problem, weil ich 0.0.0.0 als Server verwendet habe, es in localhost geändert habe und es funktioniert.

0
Vad

Ich hatte das gleiche Problem (readyState war 4 und Status 0), dann folgte ich einem anderen in diesem Tutorial erläuterten Ansatz: https://spring.io/guides/gs/consuming-rest- jquery/

Er hat XMLHttpRequest überhaupt nicht verwendet, stattdessen jquery $ .ajax () - Methode:

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="hello.js"></script>
</head>

<body>
    <div>
        <p class="greeting-id">The ID is </p>
        <p class="greeting-content">The content is </p>
    </div>
</body>

und für die Datei public/hello.js (oder Sie könnten sie direkt in denselben HTML-Code einfügen):

$(document).ready(function() 
 {
    $.ajax({
        url: "http://rest-service.guides.spring.io/greeting"
   }).then(function(data) {
      $('.greeting-id').append(data.id);
      $('.greeting-content').append(data.content);
   });
 });
0
RMDev

Eine Browseranforderung "127.0.0.1/somefile.html" trifft unverändert auf dem lokalen Webserver ein, während "localhost/somefile.html" möglicherweise als "0: 0: 0: 0: 0: 0: 0: 0: 0/somefile.html" ankommt "Wenn IPv6 unterstützt wird . Letzteres kann so verarbeitet werden, dass er von einer Domäne zur anderen wechselt.

0
Massimo Roscio