0 HTTP Durum kodunun herhangi bir anlamı var mı?


91

Bir tarayıcıdaki bir komut dosyasından XMLHttpRequest yaptığınızda, tarayıcı çevrimdışı çalışmaya ayarlanmışsa veya ağ kablosu çıkarılmışsa, istek bir hatayla tamamlanır ve status = 0 ile tamamlanır. 0 izin verilenler arasında listelenmez HTTP durum kodları.

0 durum kodu ne anlama geliyor? Tüm tarayıcılarda ve tüm HTTP istemci yardımcı programlarında aynı anlama mı geliyor? HTTP spesifikasyonunun bir parçası mı yoksa başka bir protokol spesifikasyonunun parçası mı? Belki de sunucu adresi çözülemediği için HTTP isteğinin hiç yapılamayacağı anlamına geliyor gibi görünüyor.

Kullanıcıya hangi hata mesajının gösterilmesi uygundur? "Ya internete bağlı değilsiniz ya da web sitesi sorunlarla karşılaşıyor ya da adreste bir yazım hatası olabilir"?

Buna FireFox'ta "Çevrimdışı Çalış" olarak ayarlandığında davranışı gördüğümü, ancak "Çevrimdışı Çalış" olarak ayarlandığında Microsoft Internet Explorer'da görmediğimi eklemeliyim. IE'de, kullanıcı çevrimiçi olma seçeneği sunan bir iletişim kutusu alır. FireFox, hatayı geri vermeden önce kullanıcıyı bilgilendirmez.

Bunu, "daha iyi bir hata mesajı gösterme" talebine yanıt olarak istiyorum. Internet Explorer'ın yaptığı şey iyidir. Kullanıcıya soruna neyin neden olduğunu söyler ve onlara sorunu düzeltme seçeneği sunar. FireFox ile eşdeğer bir UX vermek için, sorunun nedenini anlamam ve kullanıcıyı bilgilendirmem gerekiyor. Peki, Durum 0'dan toplamda ne çıkarabilirim? Evrensel bir anlamı var mı yoksa bana hiçbir şey söylemiyor mu?


Lütfen aynı konuyu kapsayan bu soruya bakın: stackoverflow.com/questions/872206/…
Scott Stafford

3
Bunun en doğru cevap olduğuna inanıyorum: stackoverflow.com/a/14507670/700206
whitneyland

İlgili başka bir gönderi - HTTP durum kodu 0 ne anlama geliyor
RBT

Yanıtlar:


155

Kısa cevap

Bu bir HTTP yanıt kodu değildir, ancak WhatWG tarafından XMLHttpRequestbir Getirme yanıtının durum özniteliği için geçerli bir değer olarak belgelenmiştir .

Genel olarak, rapor edilecek gerçek HTTP durum kodu olmadığında ve / veya isteği gönderirken veya yanıtı alırken bir hata oluştuğunda kullanılan varsayılan bir değerdir . Durumun böyle olduğu olası senaryolar aşağıdakileri içerir, ancak bunlarla sınırlı değildir:

  • İstek henüz gönderilmedi veya iptal edildi.
  • Tarayıcı hala yanıt durumunu ve başlıkları almayı bekliyor.
  • İstek sırasında bağlantı kesildi.
  • İstek zaman aşımına uğradı.
  • İstek, sonsuz bir yeniden yönlendirme döngüsüyle karşılaştı.
  • Tarayıcı yanıt durumunu bilir, ancak Aynı Köken Politikasıyla ilgili güvenlik kısıtlamaları nedeniyle ona erişmenize izin verilmiyor .

Uzun cevap

İlk olarak tekrarlamak gerekirse: 0 bir HTTP durum kodu değildir. RFC 7231 Bölüm 6.1'de 0'ı içermeyen tam bir liste var ve bölüm 6'ya giriş açıkça şunu belirtiyor:

Durum kodu öğesi, üç basamaklı bir tam sayı kodudur

hangi 0 değildir.

Bununla birlikte, .statusbir XMLHttpRequest nesnesinin özniteliğinin değeri olarak 0, tüm ilgili ayrıntıları izlemek biraz zor olsa da belgelenmiştir. Https://xhr.spec.whatwg.org/#the-status-attribute adresinden başlayarak, .statusbasitçe şunu belirten özniteliği belgeliyoruz :

statusNitelik dönmelidir yanıtın ‘ın durumunu .

Bu anlamsız ve totolojik gelebilir, ancak gerçekte burada bilgi var! Bu dokümantasyonun burada bir yanıttan değil bir .responseözniteliğinden bahsettiğini unutmayın, bu XMLHttpRequestnedenle bu bize bir XHR nesnesindeki durumun tanımının Getirme spesifikasyonundaki bir yanıtın durumunun tanımına ertelendiğini söyler.

Ama hangi tepki nesnesi? Ya gerçekten bir yanıt almadıysak? "Response" kelimesinin üzerindeki satır içi bağlantı bizi https://xhr.spec.whatwg.org/#response adresine götürür ve bu da şunu açıklar:

An'ın XMLHttpRequestilişkili bir yanıtı vardır. Aksi belirtilmedikçe bu bir ağ hatasıdır .

Dolayısıyla durumunu aldığımız yanıt varsayılan olarak bir ağ hatasıdır. XHR spesifikasyonunda "yanıtı ayarla" ifadesinin kullanıldığı her yerde arama yaptığımızda, beş yerde ayarlandığını görebiliriz:

Getirme standardına baktığımızda şunu görebiliriz:

Bir ağ hatası bir olan yanıtı kimin durumu her zaman0

böylece XHR spesifikasyonunun yanıtın bir ağ hatasına ayarlanması gerektiğini söylediği herhangi bir durumda bir XHR nesnesinde 0 durumunu göreceğimizi hemen söyleyebiliriz. (İlginçtir ki, bu, Getirme spesifikasyonunun bize durumu aldıktan sonra bedeni ayrıştırırken olabileceğini söylediği vücudun akışının "hatalı" olduğu durumu içerir - bu yüzden teoride bir XHR nesnesinin statüsüne sahip olmasının mümkün olduğunu düşünüyorum. 200 olarak ayarlayın, ardından vücudu alırken bir yetersiz bellek hatası veya başka bir şeyle karşılaşın ve bu nedenle durumunu 0 olarak değiştirin.)

Getirme standardında, durumu 0 olarak tanımlanan, varlıkları çapraz kaynaklı isteklerle ve aynı kaynak politikasıyla ilgili olan birkaç başka yanıt türünün de bulunduğunu da not ediyoruz:

Opak filtrelenmiş yanıt, durumu ... olan filtrelenmiş bir yanıttır0 .

Opak yeniden yönlendirme filtreli yanıt, durumu ... olan filtrelenmiş bir yanıttır0 .

(bu iki yanıt türü hakkında çeşitli diğer ayrıntılar atlanmıştır).

Ancak bunların ötesinde, Getirme algoritmasının (daha önce incelediğimiz XHR spesifikasyonu yerine) tarayıcının bir ağ hatası döndürmesini istediği birçok durum da vardır ! Aslında, "bir ağ hatası döndür" ifadesi , Getirme standardında 40 kez görünür . Burada 40'ın hepsini listelemeye çalışmayacağım, ancak şunları içerdiğini not ediyorum:

  • Talebin planının tanınmadığı durum (ör. Madeupscheme: //foobar.com'a bir istek göndermeye çalışmak)
  • Olağanüstü belirsiz talimat "Şüpheniz varsa, bir ağ hatası verin." ftp: // ve file: // URL'leri işleme algoritmalarında
  • Sonsuz yönlendirmeler: "İsteğin yeniden yönlendirme sayısı yirmi ise, bir ağ hatası döndür."
  • "HttpRequest'in yanıt lekelenmesi" cors "değilse ve istek ve yanıt dönüşleri engellenmiş çapraz kaynak ilkesi denetimi, ardından bir ağ hatası döndür." Gibi CORS ile ilgili bir dizi sorun.
  • Bağlantı hataları: "Eğer bağlantı başarısızlık, bir ağ hata döndürür."

Başka bir deyişle: bir şey yanlış gittiğinde diğer sunucudan 500 veya 400 gibi gerçek HTTP hata durum kodu almak yerine, sizin XHR nesne üzerinde 0 bir durum özniteliği ile sona veya tarayıcıda tepki nesne getir. Spesifikasyonda numaralandırılan olası spesifik nedenlerin sayısı çok fazladır.

Son olarak: Eğer spesifikasyonun geçmişiyle ilgileniyorsanız, bu cevabın 2020'de tamamen yeniden yazıldığını ve bu cevabın önceki revizyonunun ilginizi çekebileceğini unutmayın; bu , esasen aynı sonuçları ayrıştırır. XHR için daha eski (ve çok daha basit) W3 spesifikasyonu, daha modern ve daha karmaşık WhatWG spesifikasyonları ile değiştirilmeden önce, bu cevapların bahsettiği.


53

Durum 0, sayfayı yenileyerek veya ulaşılamayan bir URL talep ederek yanıt alınmadan önce bir ajax çağrısı iptal edildiğinde görünür.

bu durum belgelenmemiştir ancak ajax ve gadget.io'dan makeRequest çağrıları üzerinden mevcuttur.


4
Merhaba, Başarısız ("Ağ Yok") ve iptal edilen istek arasında ayrım yapmanın bir yolu var mı?
Ankur

2
Bu durum, XmlHttpRequest durumu olarak belgelenmiştir. Elbette bir http durumu değil, ancak belgelenmiştir. w3.org/TR/XMLHttpRequest/#the-status-attribute Daha fazla ayrıntı için Mark Amery yanıtına bakın.
Frédéric


4

Bunun eski bir gönderi olduğunu bilin. Ancak bu sorunlar hala var.

İşte konuyla ilgili bazı bulgularım, kabaca açıklanmış.

"Durum" 0, XMLHttpRequest spesifikasyonuna göre 3 şeyden biri anlamına gelir:

  • dns adı çözümlemesi başarısız oldu (bu, örneğin ağ fişi çekildiğinde)

  • sunucu yanıt vermedi (diğer bir deyişle ulaşılamıyor veya yanıt vermiyor)

  • CORS sorunu nedeniyle istek iptal edildi (kürtaj, kullanıcı aracısı tarafından gerçekleştirilir ve başarısız bir OPTIONS uçuş öncesi izler).

Daha ileri gitmek istiyorsanız, XMLHttpRequest'in derinliklerine dalın. Hazır durum güncelleme dizisini okumayı öneririm ([0,1,2,3,4] normal dizidir, [0,1,4] 0 durumuna karşılık gelir, [0,1,2,4] içerik yok demektir hata olabilir veya olmayabilir). Ayrıntıları anlamak için xhr'ye (onreadystatechange, onabort, onerror, ontimeout) dinleyiciler eklemek isteyebilirsiniz.

Spesifikasyondan ( XHR Yaşam spesifikasyonu ):

const unsigned short UNSENT = 0;
const unsigned short OPENED = 1;
const unsigned short HEADERS_RECEIVED = 2;
const unsigned short LOADING = 3;
const unsigned short DONE = 4;

1
Buradaki listenizdeki tüm olası nedenler doğrudur, ancak listeniz kapsamlı değildir. Örneğin, ayrıntılı zaman aşımı, sonsuz yönlendirme döngüler ve diğer nedenleri kaçırıyorsun Cevabıma . Bununla birlikte, yeni canlı XHR spesifikasyonuna işaretçi kullanışlıdır; Cevabımı eski W3 spesifikasyonu yerine bundan alıntı yapacak şekilde güncellemeliyim.
Mark Amery

0

İOS 9'dan beri, info.plist dosyanıza "Uygulama Taşıma Güvenlik Ayarları" eklemeniz ve güvenli olmayan HTTP web hizmetine istekte bulunmadan önce "Rasgele Yüklemelere İzin Ver" e izin vermeniz gerekir. Bu sorunu uygulamamdan birinde yaşadım.


-1

Evet, ajax araması nasıl iptal edildi. Nedeni aşağıdaki olabilir.

  1. Ajax isteğini tamamlamadan önce, kullanıcı başka bir sayfaya gitti.
  2. Ajax isteğinde zaman aşımı var.
  3. Sunucu herhangi bir yanıt döndüremiyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.