Câu trả lời ngắn
Nó không phải là mã phản hồi HTTP, nhưng nó được WhatWG ghi lại như một giá trị hợp lệ cho thuộc tính trạng thái của một XMLHttpRequest
hoặc một phản hồi Tìm nạp.
Nói chung, nó là giá trị mặc định được sử dụng khi không có mã trạng thái HTTP thực để báo cáo và / hoặc xảy ra lỗi khi gửi yêu cầu hoặc nhận phản hồi. Các tình huống có thể xảy ra trong trường hợp này bao gồm, nhưng không giới hạn:
- Yêu cầu chưa được gửi hoặc đã bị hủy bỏ.
- Trình duyệt vẫn đang chờ nhận trạng thái phản hồi và tiêu đề.
- Kết nối bị ngắt trong khi yêu cầu.
- Yêu cầu đã hết thời gian chờ.
- Yêu cầu gặp phải vòng lặp chuyển hướng vô hạn.
- Trình duyệt biết trạng thái phản hồi, nhưng bạn không được phép truy cập nó do các hạn chế bảo mật liên quan đến Chính sách nguồn gốc .
Câu trả lời dài
Đầu tiên, cần nhắc lại: 0 không phải là mã trạng thái HTTP. Có một danh sách đầy đủ về chúng trong RFC 7231 Phần 6.1 , không bao gồm 0 và phần giới thiệu của phần 6 nói rõ rằng
Phần tử mã trạng thái là một mã số nguyên có ba chữ số
mà 0 thì không.
Tuy nhiên, 0 dưới dạng giá trị .status
thuộc tính của đối tượng XMLHttpRequest được ghi lại, mặc dù hơi khó để theo dõi tất cả các chi tiết liên quan. Chúng tôi bắt đầu tại https://xhr.spec.whatwg.org/#the-status-attribute , ghi lại .status
thuộc tính, chỉ đơn giản là:
Các status
thuộc tính phải trả lại phản ứng của tình trạng .
Điều đó nghe có vẻ trống rỗng và phiến diện, nhưng thực tế có thông tin ở đây! Hãy nhớ rằng tài liệu này đang nói ở đây về .response
thuộc tính của một XMLHttpRequest
, không phải là một phản hồi, vì vậy, điều này cho chúng ta biết rằng định nghĩa trạng thái trên đối tượng XHR được chuyển sang định nghĩa về trạng thái của phản hồi trong thông số Tìm nạp.
Nhưng đối tượng phản hồi nào? Điều gì sẽ xảy ra nếu chúng tôi thực sự chưa nhận được phản hồi? Liên kết nội dòng về từ "phản hồi" đưa chúng ta đến https://xhr.spec.whatwg.org/#response , giải thích:
An XMLHttpRequest
có một phản hồi liên quan. Trừ khi có quy định khác, đó là lỗi mạng .
Vì vậy, phản hồi có trạng thái mà chúng tôi nhận được theo mặc định là lỗi mạng. Và bằng cách tìm kiếm ở mọi nơi cụm từ "đặt phản hồi thành" được sử dụng trong thông số XHR, chúng ta có thể thấy rằng cụm từ "đặt phản hồi thành" được đặt ở năm vị trí:
Đối với một lỗi mạng, khi:
Đối với phản hồi được tạo ra bằng cách gửi yêu cầu bằng Tìm nạp, bằng cách thực hiện nhiệm vụ phản hồi quy trình Tìm nạp (nếu yêu cầu XHR không liên tục) hoặc tác vụ cuối nội dung phản hồi quy trình Tìm nạp (nếu yêu cầu XHR là đồng bộ).
Nhìn vào tiêu chuẩn Tìm nạp , chúng ta có thể thấy rằng:
Một lỗi mạng là một phản ứng có tình trạng luôn luôn là0
vì vậy chúng tôi có thể ngay lập tức cho biết rằng chúng tôi sẽ thấy trạng thái 0 trên đối tượng XHR trong bất kỳ trường hợp nào mà thông số XHR cho biết phản hồi phải được đặt thành lỗi mạng. (Thật thú vị, điều này bao gồm trường hợp luồng của cơ thể bị "lỗi", điều mà thông số Tìm nạp cho chúng ta biết có thể xảy ra trong quá trình phân tích cú pháp cơ thể sau khi nhận được trạng thái - vì vậy về lý thuyết, tôi cho rằng đối tượng XHR có thể có trạng thái của nó đặt thành 200, sau đó gặp lỗi hết bộ nhớ hoặc lỗi gì đó trong khi nhận nội dung và do đó, thay đổi trạng thái của nó trở lại 0)
Chúng tôi cũng lưu ý trong tiêu chuẩn Tìm nạp rằng tồn tại một số loại phản hồi khác có trạng thái được xác định là 0, sự tồn tại của chúng liên quan đến các yêu cầu có nguồn gốc chéo và chính sách cùng nguồn gốc:
Phản hồi được lọc không rõ ràng là phản hồi đã lọc có ... trạng thái là 0
...
Phản hồi được lọc chuyển hướng không rõ ràng là phản hồi được lọc có ... trạng thái là 0
...
(bỏ qua nhiều chi tiết khác về hai loại phản hồi này).
Nhưng ngoài những điều này, cũng có nhiều trường hợp thuật toán Tìm nạp (chứ không phải thông số XHR mà chúng ta đã xem xét) yêu cầu trình duyệt trả về lỗi mạng! Thật vậy, cụm từ "trả lại lỗi mạng" xuất hiện 40 lần trong tiêu chuẩn Tìm nạp. Tôi sẽ không cố gắng liệt kê tất cả 40 ở đây, nhưng tôi lưu ý rằng chúng bao gồm:
- Trường hợp không nhận dạng được lược đồ của yêu cầu (ví dụ: cố gắng gửi yêu cầu đến madeupscheme: //foobar.com)
- Hướng dẫn mơ hồ tuyệt vời "Khi nghi ngờ, hãy trả lại lỗi mạng." trong các thuật toán để xử lý ftp: // và tệp: // URL
- Chuyển hướng vô hạn: "Nếu số chuyển hướng của yêu cầu là 20, hãy trả về lỗi mạng."
- Một loạt các vấn đề liên quan đến CORS, chẳng hạn như "Nếu phản hồi của httpRequest bị nhiễm bẩn không phải là" cors "và kiểm tra chính sách tài nguyên chéo có bị chặn trả về yêu cầu và phản hồi, thì trả về lỗi mạng."
- Lỗi kết nối: "Nếu kết nối không thành công, hãy trả về lỗi mạng."
Nói cách khác: bất cứ khi nào họ gặp khó khăn khác hơn nhận được một HTTP thực mã trạng thái lỗi như 500 hoặc 400 từ máy chủ, bạn kết thúc với một thuộc tính trạng thái 0 trên đối tượng XHR hoặc Fetch đối tượng phản ứng trong trình duyệt. Số lượng các nguyên nhân cụ thể có thể được liệt kê trong thông số kỹ thuật là rất lớn.
Cuối cùng: nếu bạn quan tâm đến lịch sử của thông số kỹ thuật vì lý do nào đó, hãy lưu ý rằng câu trả lời này đã được viết lại hoàn toàn vào năm 2020 và bạn có thể quan tâm đến bản sửa đổi trước của câu trả lời này , về cơ bản phân tích các kết luận giống nhau từ Thông số kỹ thuật W3 cũ hơn (và đơn giản hơn nhiều ) cho XHR, trước khi chúng được thay thế bằng thông số kỹ thuật WhatWG hiện đại hơn và phức tạp hơn mà câu trả lời này đề cập đến.