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][21]

W3C je objavio još jedan od nacrta specifikacije za XMLHttpRequest objekat. „XMLHttpRequest Level 2“ 25. 2. 2008.godine.[22] 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.[23]

XMLHttpRequest[24] 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.[25]

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:[26]

HEAD (Podržan od strane Internet Explorer 7 (i novije verzije))

  • PUT
  • DELETE
  • 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 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.[27]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.[28]

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. Приступљено 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. Приступљено 14. 7. 2009.. 
  9. ^ „Specification of the nsIJSXMLHttpRequest interface from the Mozilla Developer Center“. Developer.mozilla.org. 3. 5. 2009. Приступљено 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 Приступљено 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 Приступљено 14. 7. 2009.. 
  14. ^ „Press release stating the release date of Opera 8.0 from the Opera website“. Opera.com. 19. 4. 2005. Приступљено 14. 7. 2009.. 
  15. ^ Soft-Info.org. „Detailed browser information stating the release date of iCab 3.0b352 from“. Soft-Info.com Приступљено 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, Christophe (2007). „9“. In Daniel H Steinberg. Raleigh, North Carolina: Pragmatic Bookshelf. стр. 183. ISBN 1-934356-01-8. 
  20. ^ Chaffer, Jonathan; Karl Swedberg (2007). Learning jQuery. Birmingham: Packt Publishing. стр. 107-. ISBN 978-1-84719-250-9. 
  21. ^ Chaffer, Jonathan; Karl Swedberg (2007). jQuery Reference Guide. Birmingham: Packt Publishing. стр. 156-. ISBN 978-1-84719-381-0. 
  22. ^ „Specification of the XMLHttpRequest object from the Level 2 W3C Working Draft released on February 25th, 2008“. W3.org Приступљено 14. 7. 2009.. 
  23. ^ „XMLHttpRequest Level 2, W3C Working Draft (Latest Version)“. W3.org Приступљено 19. 11. 2010.. 
  24. ^ „XMLHttpRequest Editor's Draft 5 December 2011“. w3.org Приступљено 5. 12. 2011.. 
  25. ^ „Ajax Reference (XMLHttpRequest object)“. JavaScript Kit. 22. 7. 2008. Приступљено 14. 7. 2009.. 
  26. ^ „Dependencies of the XMLHttpRequest object explained by the W3C Working Draft“. W3.org Приступљено 14. 7. 2009.. 
  27. ^ „XMLHttpRequest - Document Object Model (DOM)“. Mozilla Приступљено 5. 4. 2013.. 
  28. ^ „In-Order AJAX Handling“. Antradar Software. 10. 3. 2012. Приступљено 20. 4. 2013.. 

Literatura[уреди]

  • Chaffer, Jonathan; Karl Swedberg (2007). jQuery Reference Guide. Birmingham: Packt Publishing. стр. 156-. ISBN 978-1-84719-381-0. 
  • Porteneuve, Christophe (2007). „9“. In Daniel H Steinberg. Raleigh, North Carolina: Pragmatic Bookshelf. стр. 183. ISBN 1-934356-01-8. 
  • Chaffer, Jonathan; Karl Swedberg (2007). Learning jQuery. Birmingham: Packt Publishing. стр. 107-. ISBN 978-1-84719-250-9. 
Викикњиге
Викикњиге имају више информација о:


Specifikacija[уреди]

Browsers - Pregledači[уреди]

Ostalo[уреди]