Mã trạng thái HTTP 0 - Tên miền lỗi = NSURLErrorDomain?


94

Tôi đang làm việc trên một dự án iOS.

Trong ứng dụng này, tôi đang tải xuống hình ảnh từ máy chủ.

Vấn đề:

Trong khi tải xuống hình ảnh, tôi nhận được Yêu cầu hết thời gian chờ . Theo tài liệu, mã trạng thái HTTP của yêu cầu hết thời gian chờ là 408.

Nhưng trong ứng dụng của tôi, tôi nhận được mã trạng thái HTTP 0với lỗi sau

Tên miền lỗi = NSURLErrorDomain Code = -1001 "Yêu cầu đã hết thời gian chờ." UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSLocalizedDescription = The request time out ., NSUnderlyingError = 0x13846870 "Yêu cầu đã hết thời gian chờ."}

Trong khi tìm kiếm, qua internet, tôi không tìm thấy thông tin nào về Mã trạng thái HTTP 0.

bất cứ ai có thể giải thích điều này với tôi?


1
Cũng có thể xảy ra do Nội dung hỗn hợp developer.mozilla.org/en-US/docs/Web/Security/Mixed_content
devasghar

Câu trả lời:


96

Không có mã trạng thái HTTP nào 0. Những gì bạn thấy là 0 được trả về bởi API / thư viện mà bạn đang sử dụng. Bạn sẽ phải kiểm tra tài liệu cho điều đó.


7
IE10 có một lỗi khá kỳ lạ, khi nhận được mã trạng thái 401 hoặc 403, nó hiểu đó là mã trạng thái 0. Trong đầu tôi, mã trạng thái 0 là một lỗi vì rõ ràng có gì đó không ổn.
Gaui

5
Thời gian chờ của cổng sẽ nhận được 0 trạng thái trên lỗi http của bạn đã khôi phục lại, angulartutorial.net/2017/03/http-status-codes-and-mentics.html
Prashobh

Câu trả lời là sai. Mã trạng thái 0 tồn tại khi trình duyệt không thể kết nối với máy chủ. Khi bạn gặp các lỗi khác nhau như 504, thì điều này là do cài đặt proxy ngược.
Nickon

Câu trả lời là chính xác. Không có mã trạng thái HTTP 0. Bạn có thể thấy nó là giá trị trả về từ một API, nhưng nó sẽ không xảy ra bên trong thông báo phản hồi HTTP.
Julian Reschke

74

Mã trạng thái bằng 0 trong một NSHTTPURLResponseđối tượng thường có nghĩa là không có phản hồi và có thể xảy ra vì nhiều lý do khác nhau. Máy chủ sẽ không bao giờ trả về trạng thái 0 vì đây không phải là mã trạng thái HTTP hợp lệ.

Trong trường hợp của bạn, dường như bạn nhận được mã trạng thái là 0 vì yêu cầu đã hết thời gian chờ và 0 chỉ là giá trị mặc định cho thuộc tính. Bản thân thời gian chờ có thể do nhiều lý do khác nhau, chẳng hạn như máy chủ không phản hồi kịp thời, bị tường lửa chặn hoặc toàn bộ kết nối mạng của bạn bị ngắt. Thông thường trong trường hợp sau, mặc dù điện thoại đủ thông minh để biết nó không có kết nối mạng và sẽ bị lỗi ngay lập tức. Tuy nhiên, nó vẫn sẽ không thành công với mã trạng thái rõ ràng là 0.

Lưu ý rằng trong trường hợp mã trạng thái là 0, lỗi thực sự được ghi lại trong NSErrorđối tượng trả về , không phải NSHTTPURLResponse.

Theo 408kinh nghiệm của tôi, trạng thái HTTP là khá phổ biến. Tôi chưa bao giờ gặp phải bản thân mình. Nhưng nó rõ ràng được sử dụng trong các trường hợp máy khách cần duy trì kết nối ổ cắm hoạt động với máy chủ và máy chủ đang chờ máy khách gửi thêm dữ liệu qua ổ cắm đang mở, nhưng nó không trong một khoảng thời gian nhất định và máy chủ kết thúc kết nối bằng một 408mã trạng thái, về cơ bản nói với máy khách "bạn đã mất quá nhiều thời gian".


1
Lời giải thích hoàn hảo.
CouchDeveloper

Đây phải là máy nướng được chấp nhận
Cyrus Dsouza


10

Trong SDK iOS Khi hết thời gian gọi API của bạn, bạn sẽ có trạng thái 0 cho điều đó.


5

Từ kinh nghiệm hạn chế của mình, tôi sẽ nói rằng hai tình huống sau có thể gây ra phản ứng status code: 0, hãy ghi nhớ; chúng có thể nhiều hơn, nhưng tôi biết trong số hai điều đó:

  • kết nối của bạn có thể phản hồi chậm.
  • hoặc có thể máy chủ back-end không khả dụng.

vấn đề là, status: 0hơi chung chung và chúng có thể là nhiều trường hợp sử dụng hơn kích hoạt nội dung phản hồi trống.


Đó là trạng thái API, không phải trạng thái HTTP. Nếu không có phản hồi HTTP, thì không có mã trạng thái HTTP trong đó.
Marquis of Lorne

Mã trạng thái 0 không có nghĩa là có Mã phản hồi HTTP nhưng nó có thể là vấn đề nếu máy chủ của bạn không khả dụng.
Ravi

5

Mã trạng thái '0' có thể xảy ra vì ba lý do
1) Khách hàng không thể kết nối với máy chủ
2) Khách hàng không thể nhận được phản hồi trong khoảng thời gian chờ
3) Yêu cầu đã bị Khách hàng "dừng (hủy bỏ)" .

Nhưng ba lý do này không được chuẩn hóa


Bạn có nguồn nào về điều đó không?
rgoliveira

bất kỳ mã nguồn nào có thể áp dụng để kiểm tra hai điểm đầu tiên, bạn chỉ cần một yêu cầu dựa trên ajax. nhưng cái thứ 3 đang xảy ra khi hủy yêu cầu người dùng, điều này có thể được thực hiện bằng hàm hủy bỏ trong jquery.
Hariprasath Yadav

4

Phản hồi HTTP 0 không phải là phản hồi HTTP tiêu chuẩn. Nhưng nó chỉ ra rằng máy khách không thể kết nối với máy chủ và do đó tình trạng hết thời gian đã xảy ra.


2

Chúng tôi đã nhận được lỗi:

NHẬN http: //localhost/pathToWebSite/somePage.aspx gây ra lỗi http.status: 0

Cuộc gọi đó được thực hiện từ tác vụ windows gọi một tệp VBS, vì vậy để khắc phục sự cố, đã trỏ một trình duyệt đến url và chúng tôi nhận được Lỗi bảo mật:

Kết nối của bạn không phải là riêng tư

Những kẻ tấn công có thể đang cố gắng lấy cắp thông tin của bạn từ localhost (ví dụ: mật khẩu, tin nhắn hoặc thẻ tín dụng). NET :: ERR_CERT_COMMON_NAME_INVALID

Tự động báo cáo chi tiết về các sự cố bảo mật có thể xảy ra cho Google. Chính sách bảo mật Quay lại sự an toàn Máy chủ này không thể chứng minh rằng nó là localhost; chứng chỉ bảo mật của nó là từ * .ourdomain.com. Điều này có thể do định cấu hình sai hoặc kẻ tấn công chặn kết nối của bạn. Tìm hiểu thêm.

Điều này là do chúng tôi đặt quy tắc Ghi lại URL IIS để buộc các kết nối sử dụng https. Quy tắc đó chuyển http: // localhost thành https: // localhost nhưng chứng chỉ SSL của chúng tôi dựa trên tên miền bên ngoài không phải localhost, do đó lỗi được báo cáo là mã trạng thái 0. Vì vậy, lỗi Bảo mật có thể là một lý do rất khó hiểu cho mã trạng thái này 0.

Trong trường hợp của chúng tôi, giải pháp là thêm một ngoại lệ vào quy tắc cho localhost và cho phép http: //localhost/pathToWebSite/somePage.aspx sử dụng http. Ít người biết đến, vâng, nhưng tôi sẽ gặp vấn đề này vào năm sau và bây giờ tôi sẽ tìm thấy câu trả lời của mình trong một tìm kiếm trên google.


2

Đôi khi Trình duyệt phản hồi trình xử lý lỗi http bằng Đối tượng Lỗi, có trạng thái được đặt thành 0, ngay cả khi bạn có thể thấy trạng thái lỗi 404, 401, 500, v.v. trong mạng.

Điều này có thể xảy ra nếu Ứng dụng và API của bạn nằm trên các miền khác nhau - cơ chế CORS được áp dụng. Theo CORS cho mỗi trình duyệt yêu cầu API gửi hai yêu cầu:

  1. đánh dấu trước yêu cầu OPTIONS để hiểu liệu API có cho phép yêu cầu Thực tế / Nguồn gốc hay không.
  2. khi API cho phép (yêu cầu OPTIOS phản hồi với trạng thái 204 và tiêu đề Access-Control-Allow-Origin chính xác) - trình duyệt gửi "Yêu cầu thực tế / nguồn gốc" tiếp theo.

Trong Ứng dụng, chúng tôi đang xử lý Phản hồi lỗi cho "Yêu cầu thực tế / Nguồn gốc" và nếu "yêu cầu OPTIONS trước" không thành công - trình duyệt không cung cấp đối tượng HttpError chính xác cho trình xử lý lỗi http. Vì vậy, để có được trạng thái chính xác của phản hồi http - hãy đảm bảo nhận được phản hồi yêu cầu OPTIONS thành công.




-1

Khi hết thời gian chờ tại cổng, trạng thái sẽ bằng 0 khi bạn gọi lại lỗi.

.error( function( data,status,headers,config){
    console.log(status) 
 }

Mã trạng thái HTTP

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.