Apa artinya ketika permintaan HTTP mengembalikan kode status 0?

130

Apa artinya ketika panggilan jaringan JavaScript seperti pengambilan atau XMLHttpRequest, atau jenis permintaan jaringan HTTP lainnya, gagal dengan kode status HTTP 0?

Tampaknya ini bukan kode status HTTP yang valid karena kode lain tiga digit dalam spesifikasi HTTP.

Saya mencoba mencabut jaringan sepenuhnya sebagai ujian. Mungkin tidak terkait, tetapi yang menghasilkan kode status 17003 (IIRC), yang pencarian sekilas menyarankan "pencarian server DNS gagal".

Kode yang sama berfungsi dengan baik dari beberapa lokasi dan sistem, namun dalam lingkungan tertentu gagal dengan kode status 0 dan tidak ada responseText yang disediakan.

Ini adalah HTTP POST khas ke URL Internet. Itu tidak melibatkan file: // yang saya mengerti dapat mengembalikan 0 yang menunjukkan keberhasilan di Firefox.

mike nelson
sumber
Mungkinkah itu karena firewall? OS apa yang digunakan klien Anda untuk menjalankan aplikasi?
shahkalpesh
Mungkin Bermanfaat: stackoverflow.com/a/12622082/386579
shasi kanth
Saya mengalami masalah yang sama di Firefox dan mengetahui bahwa plugin pemblokir iklan mencegah semua permintaan ke URL yang mengandung katabanner
Jan

Jawaban:

56

Saya percaya kode kesalahan menunjukkan bahwa responsnya kosong, (karena bahkan header tidak dikembalikan). Ini berarti koneksi diterima dan kemudian ditutup dengan anggun (TCP FIN). Ada beberapa hal yang dapat menyebabkan hal ini, tetapi berdasarkan uraian Anda, beberapa bentuk firewall tampaknya merupakan penyebab yang paling mungkin.

Nick
sumber
2
Saya pikir Anda mungkin benar. (Meskipun, seperti menunjuk oleh @sleepycod WinInet.dll akan diharapkan untuk kembali beberapa kode status tanpa adanya suatu yang nyata kode status http.)
mike nelson
1
Ini belum tentu benar. Saya memiliki masalah yang sama, tetapi dalam kasus saya, permintaan tidak pernah dikirim. Alasannya adalah bahwa pemblokir iklan Firefox mencegah permintaan yang URL-nya berisi katabanner
Jan
194

Banyak jawaban di sini salah. Tampaknya orang mencari tahu apa yang menyebabkan status == 0 dalam kasus khusus mereka dan kemudian menggeneralisasi itu sebagai jawabannya.

Secara praktis, status == 0 untuk XmlHttpRequest yang gagal harus dianggap sebagai kesalahan yang tidak ditentukan.

Spesifikasi W3C yang sebenarnya mendefinisikan kondisi di mana nol dikembalikan di sini: https://fetch.spec.whatwg.org/#concept-network-error

Seperti yang dapat Anda lihat dari spec (fetch atau XmlHttpRequest) kode ini bisa merupakan hasil dari kesalahan yang terjadi bahkan sebelum server dihubungi.

Beberapa situasi umum yang menghasilkan kode status ini tercermin dalam jawaban lain tetapi bisa jadi ada atau tidak ada masalah ini:

  1. Permintaan asal silang ilegal (lihat CORS )
  2. Blokir firewall atau penyaringan
  3. Permintaan itu sendiri dibatalkan dalam kode
  4. Ekstensi browser yang terinstal membuat segalanya menjadi lebih baik

Apa yang akan bermanfaat bagi browser untuk menyediakan pelaporan kesalahan terperinci untuk lebih banyak skenario == 0 status ini. Memang, kadang-kadang status == 0 akan menemani pesan konsol yang bermanfaat, tetapi pada orang lain tidak ada informasi lain.

Whitneyland
sumber
4
Firefox addon NoScript dapat membatalkan permintaan XHR ke host yang tidak terpercaya.
Ivan Solntsev
5
+1, ini semua akurat dan "semacam kesalahan terjadi" adalah interpretasi praktis. Untuk orang-orang yang tertarik pada daftar lengkap kemungkinan penyebab yang diberikan oleh spec, saya telah memposting rincian di stackoverflow.com/a/26451773/1709587 .
Mark Amery
1
Di antara kasus-kasus yang dirinci oleh Mark Amery yang menyebabkan saya paling bermasalah adalah kasus kor. Jika kesalahan menyebabkan respons terhadap validasi kors gagal, Anda akan mendapatkan status 0 alih-alih status http, karena ketika validasi kors gagal, respons tidak dapat diakses. Terutama frustasi ketika mencoba mendeteksi api web yang sedang menjalani pemeliharaan dan merespons 503. Jika api ini tidak menghormati kors saat sedang dalam pemeliharaan, Anda tidak akan dapat mendeteksi 503, Anda hanya akan mendapatkan 0, yang dapat disebabkan oleh begitu banyak lainnya. sesuatu.
Frédéric
Masalah CORS yang saya hadapi: pertimbangkan untuk menggunakan httpalih-alih httpsjika halaman Anda awalnya dibuka httpdan sebaliknya. Kata lain tidak melakukan ajax POSTvia httpsjika halaman Anda diakses via httpdan tidak melakukan ajax POSTvia httpjika halaman Anda awalnya diakses melalui https.
Victor Ponamarev
Permintaan sinkron melempar pengecualian yang lebih bermakna pada status 0: stackoverflow.com/a/49573256/1192811
McX
35

Untuk apa nilainya, tergantung pada browser, panggilan AJAX berbasis jQuery akan memanggil panggilan balik sukses Anda dengan kode status HTTP 0. Kami telah menemukan kode status "0" biasanya berarti pengguna menavigasi ke halaman yang berbeda sebelum panggilan AJAX selesai.

Bukan tumpukan teknologi yang sama seperti yang Anda gunakan, tapi semoga bermanfaat bagi seseorang.

Cory R. King
sumber
Ya, orang mungkin sering mengalami masalah itu, karena halaman ini memiliki 10.000 tampilan.
mike nelson
Atau haruskah saya mengatakan 25.000 tampilan?
mike nelson
3
Ini sangat berharga: persis apa yang gagal dalam pengujian otomatis saya. Terima kasih banyak!
alexfernandez
Terpilih bukan karena ini adalah "jawaban" yang tepat, tetapi itulah yang terjadi dalam kasus saya.
Juan Mendes
Ini benar-benar terjadi tetapi itu bukan satu - satunya alasan Anda akan melihat kode kesalahan == 0. Anda tidak dapat mengasumsikan hanya pengguna yang menavigasi dan karenanya menyaring pesan kesalahan jenis ini.
wal
14

wininet.dll mengembalikan kode status standar dan non-standar yang tercantum di bawah ini.

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

Untuk kode status "nol" apakah Anda mencoba melakukan permintaan pada halaman web lokal yang berjalan di server web atau tanpa server web?

XMLHttpRequest status = 0 dan XMLHttpRequest statusText = tidak diketahui dapat membantu Anda jika Anda tidak menjalankan skrip di server web.

Christophe Eblé
sumber
Terima kasih untuk kodenya. Tidak, ini bukan permintaan lokal, ini permintaan ke server web di internet, dari vbscript yang berjalan secara lokal.
mike nelson
6

Penanganan masalah: apa yang akhirnya kami lakukan

Kami pikir itu ada hubungannya dengan masalah firewall, jadi kami menemukan solusi yang berhasil. Jika ada yang memiliki masalah yang sama, inilah yang kami lakukan:

  1. Kami masih menulis data ke file teks pada hard disk lokal seperti yang kami lakukan sebelumnya, menggunakan HTA.

  2. Ketika pengguna mengklik "kirim data kembali ke server", HTA membaca dalam data dan menulis halaman HTML yang menyertakan data itu sebagai pulau data XML (sebenarnya menggunakan SCRIPT LANGUAGE = blok skrip XML).

  3. HTA meluncurkan tautan ke halaman HTML di browser.

  4. Halaman HTML sekarang berisi javascript yang memposting data ke server (menggunakan Microsoft.XMLHTTP).

Semoga ini bisa membantu siapa pun dengan persyaratan serupa. Dalam hal ini, itu adalah game Flash yang digunakan pada laptop di pameran dagang. Kami tidak pernah memiliki akses ke laptop dan hanya dapat mengirim email kepada klien karena pameran dagang ini terjadi di negara lain.

mike nelson
sumber
Hai, saya sedang menyelidiki masalah serupa yang terjadi pada pelanggan dalam produksi. Anda mengatakan masalah untuk Anda disebabkan oleh firewall. Apakah Anda mengingat efek apa yang disebabkan oleh firewall, atau apa yang dilakukan firewall untuk menyebabkan ini?
Ibrahim Najjar
5

Kode respons HTTP 0 menunjukkan bahwa permintaan AJAX dibatalkan.

Ini bisa terjadi baik dari batas waktu, aborsi XHR atau firewall menginjak permintaan. Waktu habis adalah umum, itu berarti permintaan gagal dieksekusi dalam waktu yang ditentukan. Aborsi XHR sangat mudah dilakukan ... Anda sebenarnya dapat memanggil .abort () pada objek XMLHttpRequest untuk membatalkan panggilan AJAX. ( Ini adalah praktik yang baik untuk aplikasi satu halaman jika Anda tidak ingin panggilan AJAX kembali dan mencoba untuk referensi objek yang telah dihancurkan. ) Seperti disebutkan dalam jawaban yang ditandai, firewall juga akan mampu membatalkan permintaan dan memicu ini 0 tanggapan.

Abort XHR: Batalkan permintaan Ajax menggunakan 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()

Perlu dicatat bahwa menjalankan metode .abort () pada objek XHR juga akan memunculkan callback kesalahan. Jika Anda melakukan segala jenis penanganan kesalahan yang mem-parsing objek-objek ini, Anda akan segera melihat bahwa XHR yang dibatalkan dan batas waktu XHR adalah identik, tetapi dengan jQuery textStatus yang diteruskan ke panggilan kesalahan akan "batalkan" ketika dibatalkan dan "batas waktu" dengan batas waktu terjadi. Jika Anda menggunakan Zepto (sangat sangat mirip dengan jQuery), errorType akan menjadi "kesalahan" ketika dibatalkan dan "batas waktu" ketika batas waktu terjadi.

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);
Cory Danielson
sumber
4

Seperti yang dijabarkan oleh jawaban ini di halaman ini , kode status 0 berarti permintaan gagal karena suatu alasan, dan perpustakaan javascript mengartikan kegagalan sebagai kode status 0.

Untuk menguji ini, Anda dapat melakukan salah satu dari yang berikut:

1) Gunakan ekstensi chrome ini, Diminta untuk mengalihkan url Anda dari httpsversi url Anda ke httpversi, karena ini akan menyebabkan kesalahan keamanan konten campuran, dan pada akhirnya menghasilkan kode status 0. Keuntungan dari pendekatan ini adalah Anda tidak Anda harus mengubah aplikasi sama sekali, dan Anda cukup "menulis ulang" url Anda menggunakan ekstensi ini.

2) Ubah kode aplikasi Anda untuk secara opsional membuat endpoint Anda mengarahkan ulang ke httpversi url Anda, bukan httpsversi (atau sebaliknya). Jika Anda melakukan ini, permintaan akan gagal dengan kode status 0.

Taman Brad
sumber
1
"Gunakan ekstensi chrome ini" - Ekstensi chrome? Dalam aplikasi HTA?
Quentin
4
Poin yang bagus! Tetapi kebanyakan orang yang tiba di sini tidak datang ke sini untuk aplikasi HTA. Mereka googling "javascript http status kode 0" atau sesuatu seperti itu, dan tiba di sini - jadi saya pikir bagian HTA dari pertanyaan ini adalah yang paling tidak penting, secara keseluruhan, dan pada akhirnya ini masih relevan.
Brad Parks
2

Dalam kasus saya statusnya menjadi 0 ketika saya lupa untuk menempatkan WWW di depan domain saya. Karena semua permintaan ajax saya hardcoded http: /WWW.mydomain.com dan halaman web dimuat hanya akan http://mydomain.com itu menjadi masalah keamanan karena itu adalah domain yang berbeda. Saya akhirnya melakukan redirect di file .htaccess saya untuk selalu menempatkan www di depan.

sesama warga negara
sumber
1

Dalam kasus saya, itu karena panggilan AJAX diblokir oleh browser karena kebijakan asal-sama . Itu adalah hal yang paling tidak diharapkan, karena semua HTML dan skrip saya berasal dari mana 127.0.0.1. Bagaimana mereka dapat dianggap memiliki asal yang berbeda?

Bagaimanapun, penyebab utama adalah <base>tag yang tampak tidak bersalah :

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

Saya menghapus <base>tag, yang tidak saya perlukan, dan sekarang berfungsi dengan baik!

Saintali
sumber
1

Saya menemukan alasan baru dan tidak berdokumen untuk status == 0. Inilah yang saya miliki:

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

Itu bukan lintas-asal, jaringan, atau karena permintaan yang dibatalkan (dengan kode atau navigasi pengguna). Tidak ada apa pun di konsol pengembang atau log jaringan.

Saya dapat menemukan sangat sedikit dokumentasi tentang keadaan () (Mozilla tidak mencantumkannya, W3C melakukannya) dan tidak ada yang menyebutkan "ditolak".

Ternyata itu adalah pemblokir iklan saya (uBlock Origin on Firefox).

Jonathan Amend
sumber
1

Selain jawaban Lee , Anda dapat menemukan lebih banyak informasi tentang penyebab sebenarnya dengan beralih ke permintaan sinkron , karena Anda juga akan mendapatkan pengecualian:

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

Sebagai contoh :

NetworkError: Terjadi kesalahan jaringan.

McX
sumber
0

Jika ada orang lain yang menemukan masalah ini, ini memberi saya masalah karena permintaan AJAX dan permintaan formulir normal dikirim. Saya menyelesaikannya dengan baris berikut:

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

Kuncinya ada return false, yang menyebabkan formulir tidak terkirim. Anda juga bisa saja mengembalikan false dari dalam submitfunc (), tetapi saya menemukan secara eksplisit menulisnya menjadi lebih jelas.

samoz
sumber
1
Cegah Default bekerja untuk ini juga. Ini adalah fungsi javascript yang mencegah browser dari mengeksekusi perilaku default selama acara, memungkinkan Anda untuk menimpa / mencegah fungsi asli dengan rapi ... return false juga melakukan hal yang sama.
Cory Danielson
0

Perlu dicatat bahwa unggahan file ajax melebihi client_max_body_sizearahan untuk nginx akan mengembalikan kode kesalahan ini.

r3wt
sumber
0

Jika Anda menguji pada PC lokal, itu tidak akan berfungsi. Untuk menguji contoh Ajax Anda perlu menempatkan file HTML di server web.

ExcelinEfendisi
sumber
0

Dalam kasus saya, kesalahan terjadi pada halaman yang diminta dengan protokol HTTP, dengan Javascript di dalamnya mencoba membuat permintaan HTTPS. Dan sebaliknya.

Setelah memuat halaman, tekan F12 (atau Ctrl + U) dan lihat kode HTML halaman Anda. Jika Anda melihat sesuatu seperti itu dalam kode Anda:

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

Dan halaman Anda diminta seperti ini:

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

Anda pasti akan menghadapi kesalahan ini.

Untuk memperbaikinya, atur protokol permintaan Javascript sama dengan protokol permintaan halaman.

Situasi ini melibatkan protokol yang berbeda, untuk permintaan halaman dan js, telah disebutkan sebelumnya dalam jawaban Brad Parks tetapi, saya kira teknik diagnostik yang disajikan di sini lebih mudah, untuk sebagian besar pengguna.

aldemarcalazans
sumber