XMLHttpRequest

XMLHttpRequest (XHR) je API dostupan za skriptne jezike kao što je JavaScript. Koristi se za slanje HTTP ili HTTPS zahteva direktno ka veb serveru i upućuje odgovore servera nazad ka skripti.[1] Podaci mogu biti primljeni sa servera kao JSON,[2] XML,[3] HTML, ili tekst.[4] Podaci dobijeni u odgovoru mogu se direktno preneti u DOM trenutno aktivnog dokumenta bez potrebe za učitavanjem nove internet stranice. Podaci dobijeni u odgovoru takodje mogu biti interpretirani od strane klijentski orijentisanih skriptnih jezika.

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 XMLHTTP omotač-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 (typeof XMLHttpRequest === "undefined") {
  XMLHttpRequest = function () {
    try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
    catch (e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
    catch (e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); }
    catch (e) {}
    // Microsoft.XMLHTTP points to Msxml2.XMLHTTP and is redundant
    throw new Error("This browser does not support XMLHttpRequest.");
  };
}

Drugi način za postavljanje XMLHttpRequest za sve pregledače

function getXMLHttpRequestObject() {
    var ref = null;
    if (window.XMLHttpRequest) {
        ref = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // Older IE.
        ref = new ActiveXObject("MSXML2.XMLHTTP.3.0");
    }
    return ref;
}

HTTP zahtev

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 open method. 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.

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

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]

HEAD (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 this
xmlhttp.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.

Pogledajte još:

Reference

  1. ^ „XMLHttpRequest object explained by the W3C Working Draft”. W3.org. Приступљено 14. 7. 2009. 
  2. ^ „Response entity body of XMLHttpRequest, W3C Editor's Draft”. W3.org. 6. 2. 2012. Приступљено 5. 2. 2012. 
  3. ^ „The responseXML attribute of the XMLHttpRequest object explained by the W3C Working Draft”. W3.org. Приступљено 14. 7. 2009. 
  4. ^ „The responseText attribute of the XMLHttpRequest object explained by the W3C Working Draft”. W3.org. Приступљено 14. 7. 2009. 
  5. ^ а б „Članak iz istorije vezan za poćetak XMLHttpRequest”. Alexhopmann.com. 31. 1. 2007. Архивирано из оригинала 23. 06. 2007. г. Приступљено 14. 7. 2009. 
  6. ^ „Specifikacija za IXMLHTTPRequest interfejs od Microsoft Developer Network”. Msdn.microsoft.com. Приступљено 14. 7. 2009. 
  7. ^ а б в Dutta, Sunava (23. 1. 2006). „Native XMLHTTPRequest object”. IEBlog. Microsoft. Приступљено 30. 11. 2006. 
  8. ^ „Specification of the nsIXMLHttpRequest interface from the Mozilla Developer Center”. Developer.mozilla.org. 16. 5. 2008. Архивирано из оригинала 17. 10. 2008. г. Приступљено 14. 7. 2009. 
  9. ^ „Specification of the nsIJSXMLHttpRequest interface from the Mozilla Developer Center”. Developer.mozilla.org. 3. 5. 2009. Архивирано из оригинала 17. 11. 2008. г. Приступљено 14. 7. 2009. 
  10. ^ „Specification of the XMLHttpRequest object from the Mozilla Developer Center”. Developer.mozilla.org. 3. 5. 2009. Приступљено 14. 7. 2009. 
  11. ^ а б „Version history for the Mozilla Application Suite”. Mozilla.org. Архивирано из оригинала 10. 04. 2009. г. Приступљено 14. 7. 2009. 
  12. ^ а б „Downloadable, archived releases for the Mozilla browser”. Archive.mozilla.org. Приступљено 14. 7. 2009. 
  13. ^ „Archived news from Mozillazine stating the release date of Safari 1.2”. Weblogs.mozillazine.org. Архивирано из оригинала 02. 06. 2009. г. Приступљено 14. 7. 2009. 
  14. ^ „Press release stating the release date of Opera 8.0 from the Opera website”. Opera.com. 19. 4. 2005. Архивирано из оригинала 20. 01. 2009. г. Приступљено 14. 7. 2009. 
  15. ^ Soft-Info.org. „Detailed browser information stating the release date of iCab 3.0b352 from”. Soft-Info.com. Архивирано из оригинала 25. 07. 2011. г. Приступљено 14. 7. 2009. 
  16. ^ „Specification of the XMLHttpRequest object from the Level 1 W3C Working Draft released on April 5th, 2006”. W3.org. Приступљено 14. 7. 2009. 
  17. ^ „XMLHttpRequest W3C Working Draft 19 November 2009”. W3.org. Приступљено 17. 12. 2009. 
  18. ^ „W3C Process Document, Section 7.4.2 Last Call Announcement”. W3.org. Приступљено 17. 12. 2009. 
  19. ^ Porteneuve 2007, стр. 183.
  20. ^ Chaffer & Swedberg 2007, стр. 107–156 harvnb грешка: више циљева (2×): CITEREFChafferSwedberg2007 (help)
  21. ^ „Specification of the XMLHttpRequest object from the Level 2 W3C Working Draft released on February 25th, 2008”. W3.org. Приступљено 14. 7. 2009. 
  22. ^ „XMLHttpRequest Level 2, W3C Working Draft (Latest Version)”. W3.org. Приступљено 19. 11. 2010. 
  23. ^ „XMLHttpRequest Editor's Draft 5 December 2011”. w3.org. Приступљено 5. 12. 2011. 
  24. ^ „Ajax Reference (XMLHttpRequest object)”. JavaScript Kit. 22. 7. 2008. Приступљено 14. 7. 2009. 
  25. ^ „Dependencies of the XMLHttpRequest object explained by the W3C Working Draft”. W3.org. Приступљено 14. 7. 2009. 
  26. ^ „XMLHttpRequest - Document Object Model (DOM)”. Mozilla. Приступљено 5. 4. 2013. 
  27. ^ „In-Order AJAX Handling”. Antradar Software. 10. 3. 2012. Приступљено 20. 4. 2013. 

Literatura

Specifikacija

Browsers - Pregledači

Ostalo