Jawaban singkat
Ini bukan kode respons HTTP, tetapi didokumentasikan oleh WhatWG sebagai nilai yang valid untuk atribut status file XMLHttpRequest
atau respons Ambil.
Secara umum, ini adalah nilai default yang digunakan ketika tidak ada kode status HTTP nyata untuk dilaporkan dan / atau kesalahan terjadi saat mengirim permintaan atau menerima respons. Skenario yang mungkin terjadi termasuk, tetapi tidak terbatas pada:
- Permintaan belum dikirim, atau telah dibatalkan.
- Browser masih menunggu untuk menerima status dan header tanggapan.
- Koneksi terputus selama permintaan.
- Waktu permintaan habis.
- Permintaan tersebut mengalami loop pengalihan tak terbatas.
- Browser mengetahui status respons, tetapi Anda tidak diizinkan untuk mengaksesnya karena batasan keamanan terkait dengan Kebijakan Asal yang Sama .
Jawaban panjang
Pertama, untuk mengulangi: 0 bukanlah kode status HTTP. Ada daftar lengkapnya di RFC 7231 Bagian 6.1 , yang tidak menyertakan 0, dan pengantar ke bagian 6 menyatakan dengan jelas bahwa
Elemen kode status adalah kode integer tiga digit
mana yang bukan 0.
Namun, 0 sebagai nilai .status
atribut objek XMLHttpRequest didokumentasikan, meskipun agak sulit untuk melacak semua detail yang relevan. Kami mulai di https://xhr.spec.whatwg.org/#the-status-attribute , mendokumentasikan .status
atribut, yang hanya menyatakan:
The status
atribut harus mengembalikan respon ‘s statusnya .
Kedengarannya hampa dan tautologis, tetapi kenyataannya ada informasi di sini! Ingatlah bahwa dokumentasi ini berbicara di sini tentang .response
atribut dari XMLHttpRequest
, bukan respons, jadi ini memberi tahu kita bahwa definisi status pada objek XHR ditangguhkan ke definisi status respons dalam spesifikasi Ambil.
Tapi objek respon apa? Bagaimana jika kita belum benar-benar menerima tanggapan? Tautan sebaris pada kata "respons" membawa kita ke https://xhr.spec.whatwg.org/#response , yang menjelaskan:
An XMLHttpRequest
memiliki tanggapan terkait. Kecuali dinyatakan sebaliknya, itu adalah kesalahan jaringan .
Jadi respons yang statusnya kami dapatkan secara default adalah kesalahan jaringan. Dan dengan menelusuri di mana pun frasa "set response to" digunakan dalam spesifikasi XHR, kita dapat melihat bahwa frasa tersebut disetel di lima tempat:
Untuk kesalahan jaringan, ketika:
Untuk respons yang dihasilkan dengan mengirimkan permintaan menggunakan Fetch, baik melalui tugas respons proses Fetch (jika permintaan XHR adalah asikron) atau tugas akhir tubuh respons proses Fetch (jika permintaan XHR sinkron).
Melihat dalam standar Fetch , kita dapat melihat bahwa:
Sebuah kesalahan jaringan adalah respon yang statusnya selalu0
sehingga kita dapat segera mengetahui bahwa kita akan melihat status 0 pada objek XHR dalam setiap kasus di mana spesifikasi XHR mengatakan bahwa respons harus disetel ke kesalahan jaringan. (Menariknya, ini termasuk kasus di mana aliran tubuh mendapat "kesalahan", yang menurut spesifikasi Ambil dapat terjadi selama penguraian tubuh setelah menerima status - jadi secara teori saya rasa mungkin saja objek XHR memiliki statusnya setel ke 200, lalu temukan kesalahan kehabisan memori atau sesuatu saat menerima isi dan ubah statusnya kembali ke 0.)
Kami juga mencatat dalam standar Ambil bahwa ada beberapa jenis respons lain yang statusnya ditentukan sebagai 0, yang keberadaannya terkait dengan permintaan lintas sumber dan kebijakan asal yang sama:
Respons yang difilter buram adalah respons yang difilter yang ... statusnya adalah 0
...
Respons terfilter pengalihan buram adalah respons yang difilter yang ... statusnya adalah 0
...
(berbagai detail lain tentang kedua jenis respons ini dihilangkan).
Namun di luar ini, ada juga banyak kasus di mana algoritme Ambil (daripada spesifikasi XHR, yang telah kita lihat) meminta browser untuk mengembalikan kesalahan jaringan! Memang, frase "mengembalikan kesalahan jaringan" muncul 40 kali dalam standar Ambil. Saya tidak akan mencoba mencantumkan semua 40 di sini, tetapi saya perhatikan bahwa mereka termasuk:
- Kasus di mana skema permintaan tidak dikenali (misalnya mencoba mengirim permintaan ke madeupscheme: //foobar.com)
- Instruksi yang sangat tidak jelas "Jika ragu, kembalikan kesalahan jaringan." dalam algoritme untuk menangani URL ftp: // dan file: //
- Pengalihan tak terbatas: "Jika jumlah pengalihan permintaan dua puluh, kembalikan kesalahan jaringan."
- Sekumpulan masalah terkait CORS, seperti "Jika httpRequest respon tainting bukan" cors "dan pemeriksaan kebijakan sumber daya lintas sumber dengan permintaan dan respon kembali diblokir, kemudian mengembalikan kesalahan jaringan."
- Kegagalan koneksi: "Jika koneksi gagal, kembalikan kesalahan jaringan."
Dengan kata lain: setiap kali ada sesuatu yang tidak beres lain daripada mendapatkan HTTP nyata kode status kesalahan seperti 500 atau 400 dari server, Anda berakhir dengan atribut status 0 pada objek XHR Anda atau Ambil objek respon dalam browser. Jumlah kemungkinan penyebab spesifik yang disebutkan dalam spesifikasi sangat banyak.
Terakhir: jika Anda tertarik dengan riwayat spesifikasi karena suatu alasan, perhatikan bahwa jawaban ini telah sepenuhnya ditulis ulang pada tahun 2020, dan Anda mungkin tertarik dengan revisi sebelumnya dari jawaban ini , yang pada dasarnya mengurai kesimpulan yang sama dari spesifikasi W3 yang lebih tua (dan lebih sederhana) untuk XHR, sebelum ini digantikan oleh spesifikasi WhatWG yang lebih modern dan lebih rumit yang dirujuk oleh jawaban ini.