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.
sumber
banner
Jawaban:
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.
sumber
banner
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:
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.
sumber
http
alih-alihhttps
jika halaman Anda awalnya dibukahttp
dan sebaliknya. Kata lain tidak melakukan ajaxPOST
viahttps
jika halaman Anda diakses viahttp
dan tidak melakukan ajaxPOST
viahttp
jika halaman Anda awalnya diakses melaluihttps
.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.
sumber
wininet.dll
mengembalikan kode status standar dan non-standar yang tercantum di bawah ini.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.
sumber
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:
Kami masih menulis data ke file teks pada hard disk lokal seperti yang kami lakukan sebelumnya, menggunakan HTA.
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).
HTA meluncurkan tautan ke halaman HTML di browser.
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.
sumber
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
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.
sumber
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
https
versi url Anda kehttp
versi, 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
http
versi url Anda, bukanhttps
versi (atau sebaliknya). Jika Anda melakukan ini, permintaan akan gagal dengan kode status 0.sumber
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.
sumber
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 :Saya menghapus
<base>
tag, yang tidak saya perlukan, dan sekarang berfungsi dengan baik!sumber
Saya menemukan alasan baru dan tidak berdokumen untuk status == 0. Inilah yang saya miliki:
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).
sumber
Selain jawaban Lee , Anda dapat menemukan lebih banyak informasi tentang penyebab sebenarnya dengan beralih ke permintaan sinkron , karena Anda juga akan mendapatkan pengecualian:
Sebagai contoh :
sumber
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:
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.
sumber
Perlu dicatat bahwa unggahan file ajax melebihi
client_max_body_size
arahan untuk nginx akan mengembalikan kode kesalahan ini.sumber
Jika Anda menguji pada PC lokal, itu tidak akan berfungsi. Untuk menguji contoh Ajax Anda perlu menempatkan file HTML di server web.
sumber
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:
Dan halaman Anda diminta seperti ini:
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.
sumber