XMLHttpRequest - XMLHttpRequest

XMLHttpRequest ( XHR ) bir bir API bir şeklinde nesne yöntemleri bir arasında veri aktarımı web tarayıcı ve bir web sunucusu . Nesne, tarayıcının JavaScript ortamı tarafından sağlanır . Özellikle, yüklenen bir web sayfasını sürekli olarak değiştirmek amacıyla XHR'den veri alınması , Ajax tasarımının altında yatan kavramdır . Adına rağmen XHR, HTTP dışındaki protokollerle de kullanılabilir ve veriler yalnızca XML biçiminde değil , JSON , HTML veya düz metin biçiminde de olabilir .

WHATWG , yaşayan bir belge olarak bir XHR standardını korur . Devam eden çalışma W3C stabil özellikleri oluşturmak için WHATWG standart anlık dayanır.

Tarih

XMLHttpRequest nesnesinin arkasındaki konsept , ilk olarak Microsoft Exchange Server 2000 için Outlook Web Access (Microsoft tarafından) geliştiricileri tarafından yaratılmıştır . IXMLHTTPRequest adlı bir arabirim geliştirildi ve bu kavram kullanılarak MSXML kitaplığının ikinci sürümüne uygulandı . MSXML kütüphanenin ikinci versiyonu ile sevk edildi Internet Explorer 5.0 üzerinden erişim sağlayan Mart 1999 ActiveX için, IXMLHTTPRequest kullanarak arayüz XMLHTTP sarmalayıcı MSXML kütüphanesi.

Internet Explorer sürüm 5 ve 6, XMLHttpRequest tanımlayıcısının kendisi, yayımları sırasında standart olmadığı için, kendi komut dosyası dillerinde XMLHttpRequest nesne tanımlayıcısını tanımlamamıştır. XMLHttpRequest tanımlayıcısı yoksa, nesne algılama yoluyla geriye dönük uyumluluk sağlanabilir. Microsoft, XMLHttpRequest nesne tanımlayıcısını , Ekim 2006'da yayımlanan Internet Explorer 7.0'daki komut dosyası dillerine ekledi .

Mozilla projesi geliştirilmiş ve adı verilen bir arabirim uygulanan nsIXMLHttpRequest içine Gecko düzen motoru. Bu arayüz, Microsoft'un IXMLHTTPRequest arayüzüne mümkün olduğunca yakın çalışacak şekilde modellenmiştir . Mozilla, XMLHttpRequest adını verdikleri bir JavaScript nesnesi aracılığıyla bu arabirimi kullanmak için bir sarmalayıcı oluşturdu . XMLHttpRequest nesnesi erken 6 Aralık 2000 tarihinde yayımlanan Gecko sürümü 0.6 olarak erişilebilir, ama geç saatlere kadar 5 Haziran 2002 tarihinde yayımlanan Gecko 1.0 sürümünde olduğu kadar tamamen işlevsel değildi XMLHttpRequest nesnesi haline fiili standart diğer büyük de Şubat 2004'te yayımlanan Safari 1.2'de uygulanan web istemcileri, Nisan 2005'te yayınlanan Konqueror , Opera 8.0 ve Eylül 2005'te yayınlanan iCab 3.0b352.

jQuery gibi tarayıcılar arası JavaScript kitaplıklarının ortaya çıkmasıyla birlikte , geliştiriciler XMLHttpRequest işlevselliğini dolaylı olarak çağırabilir.

standartlar

World Wide Web Consortium yayınlanmış bir çalışma taslak için şartname XMLHttpRequest , 5 Nisan 2006 tarihinde nesnenin düzenlenebilir tarafından Anne van Kesteren ait Opera Software ve W3C Dekanı Jackson. Amacı, "mevcut uygulamalara dayalı minimum birlikte çalışabilir özellikler kümesini belgelemek ve Web geliştiricilerinin bu özellikleri platforma özel kod olmadan kullanmalarına izin vermektir."

W3C de başka yayınlanmış Çalışma Taslağı için şartname XMLHttpRequest 25 Şubat'ta nesne, "XMLHttpRequest Düzey 2", 2008. Seviye 2'ye genişletilmiş işlevsellik oluşur XMLHttpRequest dahil nesne, ancak çapraz için ilerleme olaylar, destek sınırlı değildir site istekleri ve bayt akışlarının işlenmesi. 2011'in sonunda, Seviye 2 spesifikasyonu terk edildi ve orijinal spesifikasyona dahil edildi.

2012'nin sonunda, WHATWG geliştirmeyi devraldı ve Web IDL kullanarak bir yaşam standardını sürdürüyor . W3C'nin mevcut taslakları, WHATWG standardının anlık görüntülerine dayanmaktadır .

HTTP isteği

Aşağıdaki bölümler, XMLHttpRequest nesnesini kullanan bir isteğin, W3C Çalışma Taslağına dayalı olarak uyumlu bir kullanıcı aracısı içinde nasıl çalıştığını gösterir. XMLHttpRequest nesnesi için W3C standardı hala bir taslak olduğundan, kullanıcı aracıları W3C tanımının tüm işlevlerine uymayabilir ve aşağıdakilerden herhangi biri değişebilir. Birden çok kullanıcı aracısında XMLHttpRequest nesnesiyle komut dosyası yazarken çok dikkatli olunmalıdır. Bu makale, ana kullanıcı aracıları arasındaki tutarsızlıkları listelemeye çalışacaktır.

açık bir yöntem

HTTP ve HTTPS XMLHttpRequest nesnesinin istekleri de ilklendirilmelidir açık bir yöntem . Bu yöntem , istek için kullanılacak istek yöntemini, URL'yi ve URI kullanıcı bilgilerini doğrulamak ve çözmek için gerçek bir istek göndermeden önce çağrılmalıdır . Bu yöntem, URL'nin var olduğunu veya kullanıcı bilgilerinin doğru olduğunu garanti etmez. Bu yöntem en fazla beş parametre kabul edebilir , ancak bir isteği başlatmak için yalnızca iki tane gerektirir.

open( Method, URL, Asynchronous, UserName, Password )

Yöntemin ilk parametresi, kullanılacak HTTP istek yöntemini belirten bir metin dizesidir . XMLHttpRequest nesnesi için W3C taslağı tarafından tanımlanan, uyumlu bir kullanıcı aracısı tarafından desteklenmesi gereken istek yöntemleri şu anda aşağıdaki gibi listelenmiştir.

  • GET ( Internet Explorer 7+ , Mozilla 1+ tarafından desteklenir )
  • POST ( IE7 +, Mozilla 1+ tarafından desteklenir )
  • HEAD (IE7+ tarafından desteklenir)
  • KOYMAK
  • SİLMEK
  • SEÇENEKLER (IE7+ tarafından desteklenir)

Ancak, istek yöntemleri yukarıda listelenenlerle sınırlı değildir. W3C taslağı, bir tarayıcının kendi takdirine bağlı olarak ek istek yöntemlerini destekleyebileceğini belirtir.

Yöntemin ikinci parametresi , HTTP isteğinin URL'sini gösteren başka bir metin dizesidir . W3C, tarayıcıların bir hata oluşturmasını ve geçerli belgeden farklı bir bağlantı noktasına veya ihost URI bileşenine sahip bir URL isteğine izin vermemesini önerir .

İsteğin eşzamansız olup olmayacağını belirten bir boole değeri olan üçüncü parametre, W3C taslağı tarafından gerekli bir parametre değildir. Bu parametrenin varsayılan değerinin, sağlanmadığı takdirde W3C uyumlu bir kullanıcı aracısı tarafından doğru olduğu varsayılmalıdır. Eşzamansız bir istek ("doğru"), geçerli komut dosyasının yürütülmesine devam etmeden önce bir sunucu yanıtında beklemez. Bunun yerine , isteğin çeşitli aşamalarında XMLHttpRequest nesnesinin onreadystatechange olay dinleyicisini çağırır . Bununla birlikte, eşzamanlı bir istek ("yanlış"), istek tamamlanana kadar geçerli komut dosyasının yürütülmesini engeller ve böylece onreadystatechange olay dinleyicisini çağırmaz . Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), Blink 39.0 (Chrome) ve Edge 13 ile başlayarak, ana iş parçacığındaki eşzamanlı isteklerin, donmaya neden olacakları için kullanıcı deneyimi üzerindeki olumsuz etkileri nedeniyle kullanımdan kaldırıldığını unutmayın. iş parçacığı isteği gerçekleştirirken kullanıcı arabiriminin.

Dördüncü ve beşinci parametreler sırasıyla kullanıcı adı ve şifredir . Bu parametreler veya sadece kullanıcı adı, sunucu tarafından bu istek için gerekliyse, kimlik doğrulama ve yetkilendirme için sağlanabilir.

var xmlhttp;

if (window.XMLHttpRequest) {
    xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", filepath, false);
    xmlhttp.send(null);
}

setRequestHeader yöntemi

Bir isteğin başarılı bir şekilde başlatılmasının ardından , XMLHttpRequest nesnesinin setRequestHeader yöntemi , istekle birlikte HTTP üstbilgileri göndermek için çağrılabilir .

setRequestHeader( Name, Value )

Bu yöntemin ilk parametresi, başlığın metin dizesi adıdır. İkinci parametre, metin dizesi değeridir. Bu yöntem, istekle birlikte gönderilmesi gereken her başlık için çağrılmalıdır. W3C uyumlu bir kullanıcı aracısında açık yöntemin bir sonraki çağrışında buraya eklenen tüm başlıklar kaldırılacaktır .

gönderme yöntemi

Bir HTTP isteği göndermek için XMLHttpRequest'in gönderme yöntemi çağrılmalıdır. Bu yöntem, istekle birlikte gönderilecek içeriği içeren tek bir parametreyi kabul eder.

send( Data )

Herhangi bir içeriğin gönderilmesi gerekmiyorsa bu parametre atlanabilir. W3C taslağı, bu parametrenin, DOM belge nesnesi dışında, bir metin dizesine dönüştürülebildiği sürece, komut dosyası dili için kullanılabilen herhangi bir tür olabileceğini belirtir . Bir kullanıcı aracısı parametreyi serileştiremezse, parametre yoksayılmalıdır. Ancak Firefox 3.0.x ve önceki sürümleri, sendargüman olmadan çağrılırsa bir istisna atar .

Parametre bir DOM belge nesnesiyse, bir kullanıcı aracısı , belge nesnesinin inputEncoding özelliği tarafından belirtilen kodlamayı kullanarak belgenin iyi biçimli XML'e dönüştürülmesini sağlamalıdır . Eğer Content-Type istek başlığı ile eklenmedi setRequestHeader ; henüz, otomatik olarak "charset = application / xml olarak uyumlu kullanıcı arayüzleri ile eklenmelidir charset ," charset belgeyi kodlamak için kullanılan kodlama.

Kullanıcı aracısı bir proxy sunucusu kullanacak şekilde yapılandırılırsa , XMLHttpRequest nesnesi, orijinal sunucu yerine proxy'ye bağlanmak için isteği uygun şekilde değiştirir ve Proxy-Authorizationyapılandırıldığı gibi üstbilgileri gönderir .

Onreadystatechange olay dinleyicisi

Eğer açık XMLHttpRequest nesnesinin yöntemine üçüncü parametre seti ile çağrıldı gerçek zaman uyumsuz bir istek için, onreadystatechange olay dinleyicisi otomatik olarak değişir, aşağıdaki eylemlerden biri için çağrılır readyState XMLHttpRequest nesnesinin özelliği.

Durum değişiklikleri şu şekilde çalışır:

  • Durum Açıklaması
   0		The request is not initialized.
   1		The request has been set up.
   2		The request has been sent.
   3		The request is in process.
   4		The request is completed.
  • open yöntemi başarıyla çağrıldıktan sonra, XMLHttpRequest nesnesinin readyState özelliğine 1 (OPENED) değeri atanmalıdır.
  • Sonra gönderme yöntemi çağrıldığı ve HTTP yanıt başlıkları alındıktan, readyState XMLHttpRequest nesnenin özelliği 2 (HEADERS_RECEIVED) değeri atanmalıdır.
  • HTTP yanıt içeriği yüklenmeye başladığında , XMLHttpRequest nesnesinin readyState özelliğine 3 (LOADING) değeri atanmalıdır.
  • HTTP yanıt içeriğinin yüklenmesi tamamlandıktan sonra, XMLHttpRequest nesnesinin readyState özelliğine 4 (BİTTİ) değeri atanmalıdır.

Dinleyici, yalnızca dinleyici tanımlandıktan sonra meydana gelen durum değişikliklerine yanıt verecektir. Durum 1 ve 2'yi algılamak için, açık yöntem çağrılmadan önce dinleyici tanımlanmalıdır. Gönderme yöntemi çağrılmadan önce açık yöntem çağrılmalıdır.

var request = new XMLHttpRequest();
request.onreadystatechange = function () {
    var DONE = this.DONE || 4;
    if (this.readyState === DONE){
        alert(this.readyState);
    }
};
request.open('GET', 'somepage.xml', true);
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');  // Tells server that this call is made for ajax purposes.
                                                                 // Most libraries like jQuery/Prototype/Dojo do this
request.send(null);  // No data needs to be sent along with the request.

HTTP yanıtı

XMLHttpRequest'in gönderme yöntemine yapılan başarılı ve tamamlanmış bir çağrıdan sonra , sunucu yanıtı iyi biçimlendirilmiş XML ise ve sunucu tarafından gönderilen İçerik Türü başlığı, kullanıcı aracısı tarafından XML için bir İnternet medya türü olarak anlaşılırsa , yanıtXML özelliği XMLHttpRequest nesnesinin bir DOM belge nesnesi içerecektir. Diğer bir özellik olan responseText , XML olarak anlaşılıp anlaşılmadığına bakılmaksızın, sunucunun yanıtını uygun bir kullanıcı aracısı tarafından düz metin olarak içerecektir.

Etki alanları arası istekler

World Wide Web'in ilk gelişmelerinde, bir web sitesinden daha az itibarlı bir başka siteyle bilgi alışverişinde bulunmak için JavaScript kullanarak kullanıcıların güvenliğini ihlal etmenin mümkün olduğu bulundu. Bu nedenle tüm modern tarayıcılar , siteler arası komut dosyası çalıştırma gibi bu tür birçok saldırıyı önleyen aynı kaynak ilkesini uygular . XMLHttpRequest verileri bu güvenlik ilkesine tabidir, ancak bazen web geliştiricileri, kısıtlamalarını kasıtlı olarak aşmak ister. Bu bazen, örneğin, tarafından oluşturulan bir sayfadan bir XMLHttpRequest yapmak için alt alan adlarının meşru kullanımından kaynaklanır , normalde başarısız olur. foo.example.combar.example.com

JSONP , Çapraz Kaynaklı Kaynak Paylaşımı (CORS) veya Flash veya Silverlight gibi eklentilere sahip alternatifler (her ikisi de artık kullanımdan kaldırılmıştır) dahil olmak üzere bu güvenlik özelliğini atlatmak için çeşitli alternatifler mevcuttur . Kaynaklar arası XMLHttpRequest, W3C'nin XMLHttpRequest Düzey 2 belirtiminde belirtilir. Internet Explorer, sürüm 10'a kadar CORS'u uygulamadı. Önceki iki sürüm (8 ve 9), XDomainRequest (XDR) API aracılığıyla benzer işlevler sunuyordu. CORS artık tüm modern tarayıcılar (masaüstü ve mobil) tarafından desteklenmektedir.

CORS protokolünün iki destek modeliyle birlikte çeşitli kısıtlamaları vardır. Basit bir model özel istek başlıklarını ve atlar ayar izin vermez çerezleri . Ayrıca, yalnızca HEAD, GET ve POST istek yöntemleri desteklenir ve POST yalnızca şu MIME türlerine izin verir : "text/plain", "application/x-www-urlencoded" ve " multipart/form-data ". Başlangıçta yalnızca "metin/düz" desteklendi. Diğer model, basit olmayan özelliklerden birinin ne zaman istendiğini algılar ve özelliği görüşmek için sunucuya uçuş öncesi bir istek gönderir .

alternatif getir

Eşzamansız XHR geri aramalarını kullanan program akışı, okunabilirlik ve bakım açısından zorluklara neden olabilir. ECMAScript 2015 (ES6), eşzamansız mantığı basitleştirmek için söz yapısını ekledi . Tarayıcılar, o zamandan beri , geri aramalar yerine vaatlerifetch() kullanarak XHR ile aynı işlevselliği elde etmek için alternatif arayüzü uyguladı .

Getirme ayrıca WHATWG tarafından standartlaştırılmıştır.

Ayrıca bakınız

Referanslar

Dış bağlantılar