XMLHttpRequest ile API Getir


163

Fetch API'nin Promises kullandığını ve her ikisinin de bir sunucuya AJAX istekleri yapmanıza izin verdiğini biliyorum.

Getirme API'sının XMLHttpRequest(ve dayalı Getirme API'sı çoklu dolgusunda) bulunmayan bazı ekstra özellikleri olduğunu okudum XHR.

Getirme API'sının ekstra özellikleri nelerdir?


2
Yerinde hatırlayamama rağmen, XHR ile yapabileceğiniz bir veya iki şey var.
Getirmenin

2
Birlikte yapamaz iki şey XHR'nin ile can ilgili getirmenin bulundu ... sen getir istek zaman aşımı için kendi değerinizi ayarlayabilir olamaz, ne de ilerleme olayları alabilirsiniz
Jaromanda X

3
Getirme, çoğu XMLHttpRequest türü için bir şeyler yapmanın basitleştirilmiş bir yoludur. Kullanım durumunuz Fetch'in yaptıklarına uyuyorsa kullanın. Aşağı doğru aldığınızda, XMLHttpRequest API çoğu insanın ne için kullandığı için çirkin. Getirme, XMLHttpRequest'in etrafına sarılmış bir kütüphaneye ihtiyaç duymayan şeyleri daha lezzetli hale getirmek için daha temiz bir yol sunma çabasıydı.
jfriend00

1
Tarayıcılarda saf desteğe sahiptir ( caniuse.com/#search=fetch ), bu nedenle bunun için bir polifill vardır github.com/github/fetch , xhr üzerinde çalışıyor
ilyabasiuk

4
@ Aynı şeyi yapmak için fetch(url).then(function(data) (...));kullanmaktan daha basit olmadığını nasıl söyleyemezsiniz XMLHttpRequest? Çok fazla başka özelliği olabilir, ancak geez, yaygın şeyler için kullanımı daha kolaydır. Temizlenmiş bir API.
jfriend00

Yanıtlar:


120

XHR ile değil, getirme ile yapabileceğiniz birkaç şey var:

  • Önbellek API'sini istek ve yanıt nesneleriyle birlikte kullanabilirsiniz;
  • no-corsCORS uygulamayan bir sunucudan yanıt alarak istekleri gerçekleştirebilirsiniz . Yanıt gövdesine doğrudan JavaScript'ten erişemezsiniz, ancak yanıt metnini diğer API'larla (ör. Önbellek API'sı) kullanabilirsiniz;
  • Akış yanıtları (XHR ile tüm yanıt bellekte arabelleğe alınır, getirme ile düşük seviyeli akışa erişebilirsiniz). Bu henüz tüm tarayıcılarda mevcut değildir, ancak yakında kullanıma sunulacaktır.

XHR ile yapabileceğiniz ancak getirmeyle yapamayacağınız birkaç şey var, ancak er ya da geç kullanılabilir olacaklar (buradaki "Gelecekteki iyileştirmeler" paragrafını okuyun: https: //hacks.mozilla .org / 2015/03 / this-api-is-so-fetching / ):

  • Bir isteği iptal et (@sideshowbarker yorumunda açıkladığı gibi, bu artık Firefox ve Edge'de çalışıyor);
  • İlerlemeyi rapor edin.

Bu makale https://jakearchibald.com/2015/thats-so-fetch/ daha ayrıntılı bir açıklama içermektedir.


1
Getirme API'sı için spesifikasyon artık iptal sağlıyor. Destek şimdiye kadar Firefox 57 ve Edge 16'da gönderildi. Demolar: fetch-abort-demo-edge.glitch.me , mdn.github.io/dom-examples/abort-api . Ve açık Chrome ve Webkit özellik hataları bugs.chromium.org/p/chromium/issues/detail?id=750599 , bugs.webkit.org/show_bug.cgi?id=174980 . Nasıl yapılır: developers.google.com/web/updates/2017/09/abortable-fetch , geliştirici.mozilla.org/en -US/ docs /Web/ API/AbortSignal#Examples . Ve stackoverflow.com/a/47250621/441757
sideshowbarker

1
Diğer bir fark, fetchisteklerin Geliştirici Araçları'nda yeniden oynatılamamasıdır.
Parziphal

Ve deneyimlerime göre, fetchdosyalar için istekte bulunabilir, ancak XHR bunu yapamaz.
D. Pardal

64

getirmek

  • belgeleri tüketmek için yerleşik bir yöntemi kaçırmak
  • henüz bir zaman aşımı ayarlamanın bir yolu yok
  • içerik türü yanıt üstbilgisini geçersiz kılamıyor
  • içerik uzunluğu yanıt başlığı mevcut ancak açıkta değilse , akış sırasında gövdenin toplam uzunluğu bilinmiyor
  • istek tamamlanmış olsa bile sinyalin iptal işleyicisini arayacak
  • yükleme ilerlemesi yok ( ReadableStreamistek gövdeleri henüz gelmediği durumlar için destek )

XHR

  • için hiçbir yolu yoktur değil göndermek çerezler (kullanarak dışında standart dışı mozAnonbayrağı veya AnonXMLHttpRequestyapıcı)
  • FormDataörnekleri döndüremiyorum
  • fetchadlı kullanıcının no-corsmoduna eşdeğer değil
  • her zaman yönlendirmeleri takip et

13
fetchilerlemesini de kaçırıyor. XHR ile progressetkinlikteki ilerlemeyi izleyebilirsiniz
rzr

1
"Yanıtın içerik türü üstbilgisini geçersiz kılamıyor" ... bu sadece başlamak için kötü bir fikir. 'içerik türü neyin döndürüleceğini belirler ve GERİ DÖNÜŞ bunu ön uca dikte etmelidir. GERÇEKTEN, içerik türü tür için 'SADECE BAŞLIK' olmalıdır çünkü talep edilen, iade edilmesi gereken şeydir. Özel bir alt alandan farklı bir şey sunmak isterseniz veya belirli bir işlevi ayrı olarak işleyebilmeniz için. Herkesin boğazının% 99'unu% 1 kuralını zorlamaya çalışıyorsunuz.
Orubel

@Knu yep ve şimdi daha gelişmiş durumdayız ve% 90'lık bir çözümü kolayca otomatikleştirebilir ve ucube vakaların farklı işlevlere yönlendirilmesine izin verebiliriz.
18'de Orubel

1
@rzr tam olarak değil Response#body.
Knu

9

Yukarıdaki cevaplar iyi ve iyi bilgiler sağlıyor, ancak bu google geliştiricileri blog girişinde paylaşılanla aynı görüşü paylaşıyorum, çünkü ana fark (pratik bir perspektiften) geri dönen yerleşik sözün kolaylığıdır.fetch

Bunun gibi bir kod yazmak yerine

function reqListener() {
    var data = JSON.parse(this.responseText);
}

function reqError(err) { ... }

var oReq = new XMLHttpRequest();
oReq.onload = reqListener;
oReq.onerror = reqError;
oReq.open('get', './api/some.json', true);
oReq.send();

işleri temizleyebilir ve vaatler ve modern sözdizimi ile biraz daha özlü ve okunabilir bir şey yazabiliriz

fetch('./api/some.json')
    .then((response) => {
        response.json().then((data) => { 
            ... 
        });
    })
    .catch((err) => { ... });

8
@TheOpti IE 11'e temel getirme desteğini çoklu doldurabilirsiniz. Ayrıca birçok kullanıcı tabanındaki IE 11 kullanımı şu anda% 1'in altında olduğu gibi IE11'i birçok projede desteklenen bir tarayıcı olarak bırakabilirsiniz.
Devon Holcombe
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.