Cosa significa quando una richiesta HTTP restituisce il codice di stato 0?


130

Cosa significa che quando le chiamate di rete JavaScript come fetch o XMLHttpRequest o qualsiasi altro tipo di richiesta di rete HTTP falliscono con un codice di stato HTTP pari a 0?

Questo non sembra essere un codice di stato HTTP valido poiché altri codici hanno tre cifre nella specifica HTTP.

Ho provato a scollegare completamente la rete come test. Potrebbe non essere correlato, ma ciò ha comportato il codice di stato 17003 (IIRC), che la ricerca rapida suggerisce che "la ricerca del server DNS non è riuscita".

Lo stesso codice funziona bene da alcune posizioni e sistemi, tuttavia in alcuni ambienti ha esito negativo con il codice di stato 0 e non viene fornito alcun testo di risposta.

Questo è un tipico POST HTTP per un URL Internet. Non comporta file: // che capisco potrebbe restituire 0 che indica il successo in Firefox.


Potrebbe essere dovuto al firewall? Su quale sistema operativo il tuo client esegue l'app?
Shahkalpesh,



Ho avuto lo stesso problema in Firefox e ho scoperto che un annuncio blocker plug impedisce tutte le richieste di URL che contengono la parolabanner
Jan

Risposte:


56

Credo che il codice di errore indichi che la risposta era vuota (poiché non sono state restituite nemmeno le intestazioni). Ciò significa che la connessione è stata accettata e quindi chiusa con garbo (TCP FIN). Ci sono un certo numero di cose che potrebbero causare questo, ma sulla base della tua descrizione, una qualche forma di firewall sembra il colpevole più probabile.


2
Penso che tu abbia probabilmente ragione. (Anche se, come sottolineato da @sleepycod, wininet.dll dovrebbe restituire un codice di stato in assenza di un vero codice di stato http.)
Mike Nelson,

1
Questo non è necessariamente corretto. Ho avuto lo stesso problema, ma nel mio caso non è mai stata inviata una richiesta. La ragione era che un Firefox ad blocker impedito richieste i cui URL contengono la parolabanner
Jan

194

Molte delle risposte qui sono sbagliate. Sembra che la gente capisca cosa sta causando status == 0 nel suo caso particolare e quindi lo generalizza come risposta.

In pratica, lo stato == 0 per un XmlHttpRequest non riuscito dovrebbe essere considerato un errore indefinito.

Le specifiche W3C effettive definiscono le condizioni per le quali viene restituito zero qui: https://fetch.spec.whatwg.org/#concept-network-error

Come puoi vedere dalle specifiche (fetch o XmlHttpRequest) questo codice potrebbe essere il risultato di un errore che si è verificato anche prima che il server venisse contattato.

Alcune delle situazioni comuni che producono questo codice di stato si riflettono nelle altre risposte ma potrebbe trattarsi di uno o nessuno di questi problemi:

  1. Richiesta di origine incrociata illegale (vedi CORS )
  2. Blocco firewall o filtro
  3. La richiesta stessa è stata annullata nel codice
  4. Un'estensione del browser installata sta facendo confusione

Ciò che sarebbe utile sarebbe che i browser fornissero una segnalazione dettagliata degli errori per più di questi scenari status == 0. In effetti, a volte status == 0 accompagnerà un utile messaggio della console, ma in altri non ci sono altre informazioni.


4
Il componente aggiuntivo Firefox NoScript può annullare la richiesta XHR a host non attendibili.
Ivan Solntsev il

5
+ 1, tutto ciò è accurato e "si è verificata una sorta di errore" è l'interpretazione pratica. Per le persone interessate a un elenco completo delle possibili cause fornite dalle specifiche, ho pubblicato una suddivisione su stackoverflow.com/a/26451773/1709587 .
Mark Amery,

1
Tra i casi dettagliati da Mark Amery che mi causano più problemi è il caso cors. Se l'errore causa la mancata convalida cors della risposta, si otterrà uno stato 0 anziché lo stato http, poiché quando la convalida cors fallisce, la risposta non è accessibile. Particolarmente frustrante quando si tenta di rilevare un'API Web in fase di manutenzione e risponde al 503. Se questa API non onora il cors durante la manutenzione, non si sarà in grado di rilevare il 503, si otterrà solo 0, che può essere causato da così tante altre cose.
Frédéric

Problema CORS che ho dovuto affrontare: considera di utilizzare httpinvece che httpsse la tua pagina è stata inizialmente caricata httpe viceversa. Altre parole non eseguono ajax POSTvia httpsse la tua pagina è stata acceduta via httpe non eseguono ajax POSTvia httpse la tua pagina è stata inizialmente aperta tramite https.
Victor Ponamarev,

Richieste sincrone gettano un'eccezione più meaningfull su 0 Stato: stackoverflow.com/a/49573256/1192811
McX

35

Per quello che vale, a seconda del browser, le chiamate AJAX basate su jQuery chiameranno la tua callback di successo con un codice di stato HTTP pari a 0. Abbiamo trovato un codice di stato "0" in genere significa che l'utente è passato a una pagina diversa prima la chiamata AJAX è stata completata.

Non lo stesso stack tecnologico che stai utilizzando, ma speriamo utile per qualcuno.


Sì, probabilmente la gente ha riscontrato questo problema molto, dato che questa pagina ha avuto 10.000 visualizzazioni.
Mike Nelson,

O dovrei dire 25.000 visualizzazioni?
Mike Nelson,

3
Vale molto: è esattamente ciò che non funzionava correttamente nei miei test automatici. Molte grazie!
alexfernandez,

Non è stato votato perché questa è "la" risposta giusta, ma è ciò che stava accadendo nel mio caso.
Juan Mendes,

Ciò si verifica sicuramente, ma non è l' unica ragione per cui vedrai il codice di errore == 0. non puoi presumere che sia solo l'utente a navigare e quindi filtrare i messaggi di errore di questo tipo.
wal

14

wininet.dll restituisce codici di stato sia standard che non standard elencati di seguito.

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

Per il codice di stato "zero" stai cercando di fare una richiesta su una pagina web locale in esecuzione su un server web o senza un server web?

XMLHttpRequest status = 0 e XMLHttpRequest statusText = unknown può aiutarti se non esegui lo script su un server web.


Grazie per i codici No, non è una richiesta locale, è una richiesta a un server Web su Internet, da un vbscript in esecuzione localmente.
Mike Nelson,

6

Soluzione alternativa: cosa abbiamo finito per fare

Abbiamo pensato che avesse a che fare con i problemi del firewall e quindi abbiamo trovato una soluzione alternativa che ha funzionato. Se qualcuno ha lo stesso problema, ecco cosa abbiamo fatto:

  1. Continuiamo a scrivere i dati in un file di testo sul disco rigido locale come in precedenza, utilizzando un HTA.

  2. Quando l'utente fa clic su "invia i dati al server", l'HTA legge i dati e scrive una pagina HTML che include tali dati come un'isola di dati XML (utilizzando effettivamente un LINGUA SCRIPT = blocco di script XML).

  3. L'HTA avvia un collegamento alla pagina HTML nel browser.

  4. La pagina HTML ora contiene il javascript che pubblica i dati sul server (usando Microsoft.XMLHTTP).

Spero che questo aiuti chiunque abbia un requisito simile. In questo caso si trattava di un gioco Flash utilizzato su un laptop durante le fiere. Non abbiamo mai avuto accesso al laptop e non potevamo che inviarlo via e-mail al cliente poiché questa fiera stava accadendo in un altro paese.


Ciao, sto studiando un problema simile che si sta verificando in un cliente in produzione. Dici che il problema per te è stato causato da un firewall. Ti capita di ricordare qual è stato l'effetto causato dal firewall o che cosa ha fatto il firewall per causare questo?
Ibrahim Najjar,

5

Un codice di risposta HTTP pari a 0 indica che la richiesta AJAX è stata annullata.

Questo può accadere da un timeout, un aborto XHR o un firewall che calpesta la richiesta. Un timeout è comune, significa che la richiesta non è stata eseguita entro un tempo specificato. Un aborto XHR è molto semplice da fare ... puoi effettivamente chiamare .abort () su un oggetto XMLHttpRequest per annullare la chiamata AJAX. ( Questa è una buona pratica per un'applicazione a pagina singola se non si desidera che le chiamate AJAX ritornino e tentino di fare riferimento a oggetti che sono stati distrutti. ) Come menzionato nella risposta contrassegnata, un firewall sarebbe anche in grado di annullare la richiesta e attivare questo 0 risposta.

XHR Abort: interrompe le richieste Ajax utilizzando 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()

Vale la pena notare che l'esecuzione del metodo .abort () su un oggetto XHR genererà anche la richiamata dell'errore. Se stai eseguendo qualsiasi tipo di gestione degli errori che analizza questi oggetti, noterai rapidamente che un XHR interrotto e un XHR di timeout sono identici, ma con jQuery il textStatus che viene passato al callback dell'errore sarà "interrotto" quando interrotto e si verifica un "timeout" con un timeout. Se stai usando Zepto (molto simile a jQuery), errorType sarà "errore" quando interrotto e "timeout" quando si verifica un timeout.

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

4

Come dettagliato da questa risposta in questa pagina , un codice di stato 0 indica che la richiesta non è riuscita per qualche motivo e una libreria javascript ha interpretato il fallimento come un codice di stato 0.

Per provare questo è possibile effettuare una delle seguenti operazioni:

1) Usa questa estensione di Chrome, eventualmente per reindirizzare il tuo url dalla httpsversione del tuo url alla httpversione, in quanto ciò causerà un errore di sicurezza del contenuto misto e alla fine genererà un codice di stato di 0. Il vantaggio di questo approccio è che non devi assolutamente cambiare la tua app e puoi semplicemente "riscrivere" il tuo URL usando questa estensione.

2) Cambia il codice della tua app per rendere facoltativamente il reindirizzamento dell'endpoint alla httpversione dell'URL anziché alla httpsversione (o viceversa). In tal caso, la richiesta avrà esito negativo con il codice di stato 0.


1
"Usa questa estensione di Chrome" - Un'estensione di Chrome? In un'applicazione HTA?
Quentin,

4
Buon punto di sicuro! Ma la maggior parte delle persone che arrivano qui non arrivano per le applicazioni HTA. Stanno googling "javascript http status code 0" o qualcosa del genere, e stanno arrivando qui - quindi penso che la parte HTA di questa domanda sia della minima importanza, nel complesso, e alla fine questo è ancora rilevante.
Brad Parks,

2

Nel mio caso lo stato è diventato 0 quando avrei dimenticato di mettere il WWW davanti al mio dominio. Poiché tutte le mie richieste Ajax erano hardcoded http: /WWW.mydomain.com e la pagina web caricata sarebbe stata semplicemente http://mydomain.com, è diventato un problema di sicurezza perché è un dominio diverso. Ho finito per fare un reindirizzamento nel mio file .htaccess per mettere sempre www in primo piano.


1

Nel mio caso, è stato perché la chiamata AJAX veniva bloccata dal browser a causa della stessa politica di origine . Era la cosa meno attesa, perché tutti i miei HTML e script da cui venivano serviti 127.0.0.1. Come possono essere considerati di origini diverse?

Comunque, la causa principale era un <base>tag dall'aspetto innocente :

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

Ho rimosso il <base>tag, che non mi serviva a proposito, e ora funziona bene!


1

Ho trovato un motivo nuovo e non documentato per lo stato == 0. Ecco cosa avevo:

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

Non era di origine incrociata, di rete o a causa di richieste cancellate (tramite codice o navigazione dell'utente). Niente nella console dello sviluppatore o nel registro di rete.

Ho trovato pochissima documentazione su state () (Mozilla non lo elenca, W3C lo fa) e nessuno di questi ha menzionato "rifiutato".

Si è scoperto che era il mio blocco degli annunci (uBlock Origin su Firefox).


1

Oltre alla risposta di Lee , puoi trovare ulteriori informazioni sulla vera causa passando a richieste sincrone , in quanto otterrai anche un'eccezione:

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

Per esempio :

NetworkError: si è verificato un errore di rete.


0

Nel caso in cui qualcun altro dovesse riscontrare questo problema, questo mi stava dando problemi dovuti alla richiesta AJAX e all'invio di una normale richiesta di modulo. L'ho risolto con la seguente riga:

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

La chiave è il ritorno false, che impedisce al modulo di inviare. Potresti anche restituire false dall'interno di submitfunc (), ma trovo che scriverlo esplicitamente sia più chiaro.


1
Prevenire Default funziona anche per questo. È una funzione javascript che impedisce al browser di eseguire comportamenti predefiniti durante gli eventi, consentendo di scavalcare / prevenire ordinatamente la funzionalità nativa ... return false fa lo stesso.
Cory Danielson,

0

Va notato che un caricamento di file Ajax che supera la client_max_body_sizedirettiva per nginx restituirà questo codice di errore.


0

Se stai testando su PC locale, non funzionerà. Per provare l'esempio Ajax è necessario posizionare i file HTML su un server Web.


0

Nel mio caso, l'errore si è verificato in una pagina richiesta con protocollo HTTP, con un Javascript al suo interno che tenta di effettuare una richiesta HTTPS. E viceversa.

Dopo il caricamento della pagina, premi F12 (o Ctrl + U) e dai un'occhiata al codice HTML della tua pagina. Se vedi qualcosa del genere nel tuo codice:

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

E la tua pagina è stata richiesta in questo modo:

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

Sicuramente dovrai affrontare questo errore.

Per risolverlo, impostare il protocollo della richiesta Javascript uguale al protocollo della richiesta pagina.

Questa situazione che coinvolge diversi protocolli, per le richieste di pagine e js, è stata menzionata in precedenza nella risposta di Brad Parks ma, immagino che la tecnica diagnostica qui presentata sia più semplice, per la maggior parte degli utenti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.