Wat betekent het als een HTTP-verzoek statuscode 0 retourneert?

Wat betekent het als JavaScript-netwerkaanroepen zoals fetch of XMLHttpRequest, of een ander type HTTP-netwerkverzoek, mislukken met een HTTP-statuscode van 0?

Dit lijkt geen geldige HTTP-statuscode te zijn, aangezien andere codes uit drie cijfers bestaan in de HTTP-specificatie.

Ik heb bij wijze van test geprobeerd het netwerk volledig los te koppelen. Het kan niets met elkaar te maken hebben, maar dat resulteerde in statuscode 17003 (IIRC), waarvan vluchtig zoeken suggereert dat “DNS-server opzoeken mislukt”.

Dezelfde code werkt prima vanaf sommige locaties en systemen, maar binnen bepaalde omgevingen mislukt het met statuscode 0 en wordt er geen responseText verstrekt.

Dit is een typische HTTP POST naar een internet-URL. Het heeft geen betrekking op file:// waarvan ik begrijp dat het 0 kan retourneren, wat wijst op succes in Firefox.


Antwoord 1, autoriteit 100%

Ik geloof dat de foutcode aangeeft dat het antwoord leeg was (omdat er zelfs geen headers werden geretourneerd). Dit betekent dat de verbinding is geaccepteerd en vervolgens netjes is gesloten (TCP FIN).
Er zijn een aantal dingen die dit kunnen veroorzaken, maar op basis van uw beschrijving lijkt een of andere vorm van firewall de meest waarschijnlijke boosdoener.


Antwoord 2, autoriteit 98%

Veel van de antwoorden hier zijn fout.Het lijkt erop dat mensen erachter komen wat status==0 in hun specifieke geval veroorzaakte en dat vervolgens generaliseren als het antwoord.

Praktisch gesproken moet status==0 voor een mislukt XmlHttpRequest worden beschouwd als een ongedefinieerde fout.

De werkelijke W3C-specificatie definieert de voorwaarden waarvoor hier nul wordt geretourneerd:
https://fetch.spec.whatwg.org/#concept-network-error

Zoals je kunt zien aan de specificatie (fetch of XmlHttpRequest) kan deze code het resultaat zijn van een fout die is opgetreden zelfs voordat er contact met de server is opgenomen.

Sommige veelvoorkomende situaties die deze statuscode opleveren, worden weerspiegeld in de andere antwoorden, maar het kan een of geen van deze problemen zijn:

  1. Illegaal verzoek om verschillende oorsprongen (zie CORS)
  2. Firewallblokkering of filtering
  3. Het verzoek zelf is in code geannuleerd
  4. Een geïnstalleerde browserextensie verpest de boel

Het zou handig zijn als browsers gedetailleerde foutrapportage bieden voor meer van deze status==0-scenario’s. Soms wordt status==0 inderdaad vergezeld van een nuttig consolebericht, maar in andere is er geen andere informatie.


Antwoord 3, autoriteit 59%

Voor wat het waard is, afhankelijk van de browser, zullen op jQuery gebaseerde AJAX-aanroepen uw succesvolle callback terugbellen met een HTTP-statuscode van 0. We hebben ontdekt dat een statuscode van “0” meestal betekent dat de gebruiker naar een andere pagina voordat het AJAX-gesprek is voltooid.

Niet dezelfde technologie die u gebruikt, maar hopelijk nuttig voor iemand.


Antwoord 4, autoriteit 23%

wininet.dllretourneert zowel standaard als niet-standaard statuscodes die hieronder worden vermeld.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed
12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

Probeer je voor de statuscode “nul” een verzoek te doen op een lokale webpagina die op een webserver of zonder een webserver draait?

XMLHttpRequest-status = 0 en XMLHttpRequest-statusText = onbekendkan je helpen als je je script niet op een webserver draait.


Antwoord 5, autoriteit 16%

Een HTTP-antwoordcode van 0 geeft aan dat het AJAX-verzoek is geannuleerd.

Dit kan gebeuren door een time-out, XHR-abortus of een firewall die op het verzoek stampt. Een time-out is gebruikelijk, dit betekent dat het verzoek niet binnen een bepaalde tijd kon worden uitgevoerd. Een XHR-abortus is heel eenvoudig uit te voeren… je kunt eigenlijk .abort() aanroepen op een XMLHttpRequest-object om de AJAX-aanroep te annuleren. (Dit is een goede gewoonte voor een applicatie met één pagina als u niet wilt dat AJAX-aanroepen terugkeren en proberen te verwijzen naar objecten die zijn vernietigd.) Zoals vermeld in het gemarkeerde antwoord, zou een firewall ook in staat zijn om het verzoek te annuleren en deze 0-reactie te activeren.

XHR afbreken: Abortus Ajax-verzoeken afbreken met jQuery

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});
//kill the request
xhr.abort()

Het is vermeldenswaard dat het uitvoeren van de .ABort () -methode op een XHR-object ook de foutmelding zal vuren. Als u een foutenbehandeling doet die deze objecten parseert, zult u snel merken dat een afgebroken XHR en een time-out XHR identiek zijn, maar met jQuery de TextStatus die wordt doorgegeven aan de foutencallback is “abort” wanneer het wordt afgebroken en “time-out” met een time-out optreedt. Als u ZEEPO (zeer vergelijkbaar met jQuery) gebruikt, wordt de Errortype “FOUT” bij het afgebroken en “Time-out” wanneer een time-out optreedt.

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

Antwoord 6, Autoriteit 10%

Workaround: Wat we uiteindelijk eindigden

We dachten dat het te maken had met firewallkwesties, en dus kwamen we met een tijdelijke oplossing die de truc deden. Als iemand ditzelfde probleem heeft, is dit wat we deden:

  1. We schrijven nog steeds de gegevens naar een tekstbestand op de lokale harde schijf zoals we eerder hebben gedaan, met behulp van een HTA.

  2. Wanneer de gebruiker op “Gegevens terug naar Server klikt”, luidt de HTA in de gegevens en schrijft een HTML-pagina uit die dat gegevens bevat als een XML Data Island (daadwerkelijk gebruik van een scripttaal = XML-scriptblok) .

  3. De HTA lanceert een link naar de HTML-pagina in de browser.

  4. De HTML-pagina bevat nu het JavaScript dat de gegevens berichten op de server (met behulp van Microsoft.xmlhttp).

Ik hoop dat dit iedereen helpt met een vergelijkbare vereiste. In dit geval was het een flash-game die op een laptop op beurzen wordt gebruikt. We hadden nooit toegang tot de laptop en konden het alleen maar e-mailen naar de klant, omdat deze beurs in een ander land gebeurde.


Antwoord 7, Autoriteit 7%

Zoals gedetailleerd door dit antwoord op deze pagina, betekent een statuscode van 0 dat het verzoek om de een of andere reden is mislukt, en een javascript-bibliotheek interpreteerde de fout als een statuscode van 0.

Om dit te testen kun je een van de volgende dingen doen:

1) Gebruik deze Chrome-extensie, Verzoekom uw URL om te leiden van de https-versie van uw url naar de http-versie, aangezien dit een gemengde inhoudsbeveiligingsfout veroorzaakt en uiteindelijk een statuscode van 0 genereert. Het voordeel van deze aanpak is dat u uw app helemaal niet hoeft te wijzigen en dat u uw url eenvoudig kunt “herschrijven” met deze extensie.

2) Wijzig de code van uw app om uw eindpunt eventueel om te leiden naar de http-versie van uw url in plaats van de https-versie (of omgekeerd). Als u dit doet, zal het verzoek mislukken met statuscode 0.


Antwoord 8, autoriteit 3%

In mijn geval werd de status 0 wanneer ik zou vergeten het WWW voor mijn domein te plaatsen. Omdat al mijn ajax-verzoeken hardcoded waren http://WWW.mydomain.com en de geladen webpagina gewoon http://mydomain.comhet werd een beveiligingsprobleem omdat het een ander domein is. Ik heb uiteindelijk een omleiding gedaan in mijn .htaccess-bestand om altijd www vooraan te plaatsen.


Antwoord 9, autoriteit 2%

In mijn geval was dat omdat de AJAX-oproep door de browser werd geblokkeerd vanwege het beleid van dezelfde oorsprong. Het was het minst verwachte, omdat al mijn HTML’s en scripts werden bediend vanuit 127.0.0.1. Hoe kan worden aangenomen dat ze een verschillende oorsprong hebben?

Hoe dan ook, de oorzaak was een onschuldig ogende <base>tag:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

Ik heb de <base>Tag verwijderd, die ik niet door de weg heb gekregen, en nu werkt het prima!


Antwoord 10, Autoriteit 2%

Ik vond een nieuwe en ongedocumenteerde reden voor status == 0. Hier is wat ik had:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

Het was geen cross-herkomst, netwerk of vanwege geannuleerde aanvragen (per code of door gebruikersnavigatie). Niets in de ontwikkelaarconsole of netwerklogboek.

Ik kon heel weinig documentatie vinden over de staat () (Mozilla vermeldt het niet, W3C doet) en geen van het genoemde “afgewezen”.

Blijkt dat het mijn advertentieblokker (ublock oorsprong op Firefox) was).


Antwoord 11, Autoriteit 2%

In aanvulling op het antwoord van Lee , kunt u meer informatie vinden over de echte oorzaak door over te schakelen op synchrone aanvragen, zoals u ook een uitzondering krijgt:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

Bijvoorbeeld:

NetworkError: er is een netwerkfout opgetreden.


Antwoord 12

In het geval dat iemand anders dit probleem tegenkomt, dit gaf me problemen vanwege het AJAX-verzoek en een normaal formulierverzoek dat werd verzonden. Ik heb het opgelost met de volgende regel:

<form onsubmit="submitfunc(); return false;">

De sleutel daar is de return false, waardoor het formulier niet wordt verzonden. Je kunt ook gewoon false retourneren van binnenuit submitfunc(), maar ik vind het explicieter om het expliciet te schrijven.


Antwoord 13

Opgemerkt moet worden dat een upload van een ajax-bestand die de client_max_body_size-richtlijn voor nginx overschrijdt, deze foutcode retourneert.


Antwoord 14

Als u op een lokale pc test, werkt het niet. Om bijvoorbeeld Ajax te testen moet je de HTML-bestanden op een webserver plaatsen.


Antwoord 15

In mijn geval deed de fout zich voor op een pagina die werd aangevraagd met het HTTP-protocol, met een Javascript erin die een HTTPS-verzoek probeerde te maken. En omgekeerd.

Druk na het laden van de pagina op F12 (of Ctrl + U) en bekijk de HTML-code van uw pagina. Als je zoiets in je code ziet:

<!-- javascript request inside the page -->
<script>
var ajaxurl = "https://example.com/wp-admin/admin-ajax.php";
(...)
</script>

En uw pagina is op deze manier opgevraagd:

http://example.com/example- page/2019/09/13/my-post/#elf_l1_Lw

Je zult deze fout zeker tegenkomen.

Om het op te lossen, stelt u het protocol van het Javascript-verzoek in op het protocol van het paginaverzoek.

Deze situatie met verschillende protocollen, voor pagina- en js-verzoeken, werd eerder genoemd in het antwoord van Brad Parks, maar ik denk dat de hier gepresenteerde diagnostische techniek voor de meerderheid van de gebruikers eenvoudiger is.

Other episodes