XMLHttpRequest ima bitnu ulogu u razvoju internet softvera korišćenjem Ajax tehnologija. Trenutno ga koriste mnoge internet stranice za implementaciju dinamičkih internet aplikacija. Neki od primera ovih aplikacija su džimejl, gugl mape, fejsbuk, i mnogi drugi.
XMLHttpRequest mora poštovati politiku, pravila brauzvera, zbog sigurnosnih razloga, zahtev će biti uspešan ako je potekao sa istog servera koji servira originalnu veb stranicu. Postoje alternativni načini da se ovo prevaziđe(izbegne).
Istorija i podrška
Koncept XMLHttpRequest objekta je originalno kreiran od programera iz Outlook Web Access (iz Microsoft) za Microsoft Exchange Server 2000.[5]Interfejs zvan IXMLHTTPRequest je razvijen i implementiran u drugoj verziji MSXML biblioteke koristeci ovaj koncept.[5][6] Druga verzija MSXML biblioteke je isporučena sa Internet Explorer 5.0 u Martu 1999 godine, ActiveX je omogućavao pristup IXMLHTTPRequest interfejsu koristeći XMLHTTPomotač-wrapper MSXML biblioteke.[7]
Mozila projekat razvio je i implementirao interfejs pod nazivom nslXMLHttpRequest u Gecko motornom rasporedu. Ovaj interfejs rađen je po uzoru na Microsoft-ov IXMLHTTPRequest koliko god je to bilo moguće..[8][9] Mozila je kreirala omotač za korišćenje ovog interfejsa preko JavaScript objekta koji se naziva XMLHttpRequest.[10]XMLHttpRequest objekat bio je dostupan kada je Gecko verzija 0.6 objavljena 6.decembra 2000. Godine[11][12] , ali nije bio potpuno funkcionalan. Tek verzija 1.0 Gekoo objavljena 5.juna 2002.[11][12]XMLHttpRequest objekat postao je de fakto standard kod drugih velikih veb klijenata realizovan u Safari 1.2, objavljen u februaru 2004.godine[13]Konqueror, Opera 8.0 objavljena u aprilu 2005[14] i iCab 3.0b352 objavljena u septembru 2005.godine.[15]
[W3C|World Wide Web Consortium objavio je nacrt specifikacije za XMLHttpRequest objekat 5. Aprila 2006. Izmenjen od strane Anne van Kesteran za Opera Software i Dean Jackson of W3C.[16] Njen cilj bio je "da se dokumentuje skup minimalnih iteroperabilnih funkcija zasnovan na postojećim implementacijama, što omogućava Veb programerima da koriste ove funkcije bez platforme-specifičnog koda." Poslednja revizija specifikacije XMLHttpRequest objekta bila je 19. Novembra 2009, kao poslednji radni nacrt.[17][18]
Microsoft je dodao XMLHttpRequest objekat identifikator svojim skriptama u Internet Explorer 7.0 objavljnom u oktobru 2006.[7]
Sa pojavom cross-browsera JavaScript biblioteka kao što je jQuery i Prototype JavaScript Framework, programeri mogu da pozovu XMLHttpRequest bez kodiranja direktno na API. Prototip je omogućio asinhroni objekat tražilac koji se naziva Ajax. Zahtev koji pokriva osnovnu implementaciju pregledača obezbeđujući pristup do njega.[19] jQuery objekti predstavljaju ili wrapuju elemente iz trenutne klijentske strane DOM. Svi oni imaju .load() Metod koji uzima URI parametar i pravi XMLHttpRequest ka URI-ju, onda postavimo na bilo koja mesta vraćeni HTML u HTML element koji predstavlja jQuery objekat.[20]
W3C je objavio još jedan od nacrta specifikacije za XMLHttpRequest objekat. „XMLHttpRequest Level 2“ 25. 2. 2008.godine.[21] Nivo 2 se sastoji od proširene funkcionalnosti za XMLHttpRequest objekat, uključujući, ali ne ograničavajući, napredak, podrška za cross-site request i rešavanje bajt sistema. Najnovija revizija XMLHttpRequest Level2 specifikacije je od 16.avgusta 2011, koja je i dalje u upotrebi.[22]
XMLHttpRequest[23] verzije 2 spojen je u glavnu XMLHttpRequest specifikaciju i ne postoji više verzija 1 i verzija 2.
Podrška u verzijama 5, 5.5 i 6 Internet Explorer-a
U verzijama 5 i 6 Internet Explorer-a nije definisan indetifikator za XMLHttpRequest objekat u okviru njihovog skript jezika s obzirom da XMLHttpRequest indetifikator nije bio standard u vreme njihovog predstavljanja.[7] Kompatibilnost unazad može biti postignuta korišćenjem detekcije objekata ukoliko XmlHttpRequest indetifikator ne postoji.[24]
Veb stranice koje koriste XMLHttpRequest mogu ublažiti trenutne manje razlike u impementaciji bilo obmotavanjem XMLHttpRequest objekta JavaScript omotačem, bilo korišćenjem postojećeg okvira(framework) koji to radi. U bilo kojem slučaju, omotač bi trebao da detektuje the abilities trenutne implementacije i radi u okviru njenih zahteva.
Microsoft će podžavati Windows XP a samim tim i Internet Explorer 6 do 8 April 2014. Primer obmotavanja u JavaScript-u prikazan je ispod.
/* Provide the XMLHttpRequest constructor for Internet Explorer 5.x-6.x: Other browsers (including Internet Explorer 7.x-9.x) do not redefine XMLHttpRequest if it already exists. This example is based on findings at: http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx*/if(typeofXMLHttpRequest==="undefined"){XMLHttpRequest=function(){try{returnnewActiveXObject("Msxml2.XMLHTTP.6.0");}catch(e){}try{returnnewActiveXObject("Msxml2.XMLHTTP.3.0");}catch(e){}try{returnnewActiveXObject("Microsoft.XMLHTTP");}catch(e){}// Microsoft.XMLHTTP points to Msxml2.XMLHTTP and is redundantthrownewError("This browser does not support XMLHttpRequest.");};}
Drugi način za postavljanje XMLHttpRequest za sve pregledače
Ova sekcija demonstrira kako funkcioniše zahtev korišćenjem XMLHttpRequest objekt u okviru korisničkih agenata baziranih na W3C nacrtu.
Metod open
HTTP i HTTPS zahtev XMLHttpRequest objekta mora biti inicijalizovan kroz openmethod. Ovaj metod mora biti pozvan pre slanja samog zahteva kako bi potvrdio i rešio zahtev. Ovaj metod ne garantuje postojanje URL adrese ili tačnost poslatih podataka. Ovaj metod moze imati najvise pet parametera, ali sam zahtev moze imati najvise dva za inicijalizaciju samog zahteva.
Prvi parametar metoda je text string koji označava koji HTTP zahtev se koristi. Zahtevi koji moraju biti podržani od strane usaglašenih user agent, definisani od strane W3C nacrta za XMLHttpRequest objekte, su:[25]
OPTIONS (Podržan od strane Internet Explorer 7 (i novije verzije))
Ipak, zahtevi nisu ograničeni samo na gore navedene. Po W3C nacrtu internet pregledači mogu da podržavaju dodatne zahteve.
Drugi parametar metoda je takodje text string, ovaj parametar označava URL HTTP zahteva. Preporuka W3C-a je da internet pregledači treba da prijave grešku i ne dozvole zahtev u slučaju da URL ima drugačiji port od ili ihost URI komponentu nego trenutni dokument.
Treći parametar je boolean vrednost koja označava da li će zahtev biti asinhron, i nije obavezan po W3C nacrtu. Moze se pretpostaviti da je podrazumevana vrednost ovog parametra tačno(true), za korisničke agente usaglašene sa W3C nacrtom, ako on nije naveden. Asinhroni zahtev(vrednost true) neće čekati odgovor servera, već će skripta nastaviti sa izvršavanjem. Sinhroni zahtev(vrednost false) će blokirati izvršavanje trenutne skripte sve dok zahtev ne bude završen.
Četvrti i peti parametak su korisnočko ime i šifra. Ovi parametri mogu biti poslati za autentikaciju i autorizaciju.
setRequestHeader metod
Nakon uspešne inicijalizacije zahteva, moze biti pozvan setRequestHeader metod XMLHttpRequest objekta za slanje HTTP hedera zajedno sa zahtevom.
setRequestHeader(Name, Value )
Prvi parametar je tipa string i predstavlja ime hedera. Drugi parametar je takodje tipa string i predstavlja vrednost. Ovaj metod mora biti pozvan za svaki heder koji se mora poslati sa zahtevom.
send metod
Za slanje HTTP zahteva mora biti pozvan send metod XmlHttpRequest objekta. Ovaj metod ima samo jedan parametar, sadržinu koja se šalje sa zahtevom.
send (Data )
Ovaj parametar može biti izostavljen ako se nikakva sadržina ne treba poslati. Po W3C nacrtu ovaj parametar može biti bilo kog tipa koji se može konvertovati u string, a da je podržan od strane skript jezika. Ako korisnički agent ne može da obradi ovaj parametar onda on treba biti ignorisan.
Ukoliko je parametar DOM objekat korisnički agent treba da osigura da je objekat konvertovan u dobro formiran XML.
onreadystatechange osluškivač događaja
Ako je open metod XMLHttpRequest objekta pozvan sa trecim parametrom true za asihroni zahtev, onreadystatechange osluškivač događaja će automatski biti pozvan za sve akcije koje menjaju readyState svojstvo XMLHttpRequest objekta.
Promene stanja funkcionišu na sledeći način:
Nakon što je uspešno pozvan open metod, readyState svojstvo XMLHttpRequest objekta trebalo bi da dobije vrednost 1.
Nakon sto je pozvan send metod i dobijen odgovor u vidu HTTP zaglavlja, readyState svojstvo XMLHttpRequest objekta trebalo bi da dobije vrednost 2.
Kada sadržina HTTP odgovora počne da se učitava, readyState svojstvo XMLHttpRequest objekta trebalo bi da dobije vrednost 3.
Nakon što je sadržina HTTP odgovora učitana, readyState svojstvo XMLHttpRequest objekta trebalo bi da dobije vrednost 4.
Osluškivač reaguje samo na promene stanja koje su se desile nakon što je osluškivač definisan. Kako bi detektovao stanja 1 i 2, osluškivač mora biti definisan pre nego sto je pozvan metod open. Metod open mora biti pozvan pre metoda send.
xmlhttp.onreadystatechange=function(){if(xmlhttp.readyState===4){alert(xmlhttp.readyState);}};xmlhttp.open('GET','somepage.xml',true);xmlhttp.setRequestHeader('X-Requested-With','XMLHttpRequest');// Tells server that this call is made for ajax purposes.// Most libraries like jQuery/Prototype/Dojo do thisxmlhttp.send(null);// No data need to send along with the request.
abort metod
Ovaj metod prekida zahtev ako readyState XMLHttpRequest objekta nije jos postao 4.[26]abort metod obezbeđuje da se prekine očekivanje odgovora u asinhronom zahtevu.
abort()
Neke AJAX biblioteke koriste abort metod za prekidanje potecijalnih duplikata ili loših zahteva.[27]
HTTP odgovor
Nakon uspešnog i završenog poziva send metoda, ako je server vratio validan XML i ako je Content-Type header vraćen od strane servera prepoznat kao Internet media type za XML od strane korisničkog agenta, responseXML svojstvo XMLHttpRequest objekta će sadžati DOM objekat. Drugo svojstvo, responseText će sadržati odgovor servera kao tekst.
Cross-domain zahtev
U početku razvoja World Wide Web, otkivena je da je moguće narušiti privatnost korisnika ukoliko se koristi JavaScript za razmenu informacija izmedju dve Veb stranice. Zbog toga svi moderni Veb pregledači implementiraju same origin policy kako bi sprečili većinu takvih napada, kao što je cross-site scripting. XMLHttpRequest podaci su deo ove sigurnosne politike, ali ponekad programeri žele da namerno zaobidju ograničenja. To se ponekad radi zbog omogućavanja poddomena. Na primer, slanje XmlHttpRequest zahteva sa stranice koja se nalazi na foo.example.com kako bi se dobile informacija sa bar.example.com ne bi uspelo ako se ne bi zaobišla neka ograničenja.
Postoji nekoliko alternativa za zaobilaženje ovih sigurnosnih svojstava, uključijući korišćenje JSONP, Cross-Origin Resource Sharing ili plaginova kao sto su Flash ili Silverlight. XMLHttpRequest Level 2 takodje uključuje svojstvo za komunikaciju sa drugim domenima.