XMLHttpRequest
XMLHttpRequest, XHR - obiekt jezykow skryptowych (np. JavaScript, JScript lub VBScript) przegladarek internetowych umozliwiajacy przesylanie zadan do serwera WWW za pomoca protokolu HTTP.
Cecha charakterystyczna XMLHttpRequest jest mozliwosc wykonywania zadan juz po zaladowaniu sie strony internetowej w trakcie interakcji z uzytkownikiem. Otrzymane odpowiedzi serwera sa wowczas wykorzystywane do modyfikacji zaladowanego dokumentu. Mozliwosc asynchronicznego wykonywania zadan sprawia, ze sa one wykonywane w tle i nie przerywaja interakcji uzytkownika ze strona, dynamicznie ja zmieniajac. Tresc odpowiedzi serwera najczesciej przekazywana jest w formatach XML, JSON lub czystym tekstem.
XMLHttpRequest stal sie podstawa techniki projektowania stron AJAX. Przyklady aplikacji opartych na XHR to Google Gmail, Google Maps i Google Suggest oraz Windows Live Local.
Metody
[edytuj | edytuj kod]| Metoda | Opis |
|---|---|
abort()
|
Anuluje aktualne zadanie. |
getAllResponseHeaders()
|
Zwraca kompletny zestaw naglowkow HTTP jako lancuch znakow. |
getResponseHeader( headerName )
|
Zwraca wartosc konkretnego naglowka HTTP. |
open( metoda, URL )open( metoda, URL, async )open( metoda, URL, async, userName )open( metoda, URL, async, userName, password )
|
Okresla metode, URL i inne opcjonalne argumenty zadania.
Argument metoda moze miec wartosc ,,GET", ,,POST", ,,HEAD", ,,PUT", ,,DELETE" lub inne metody HTTP wypisane w specyfikacji W3C.[1] Argument URL moze byc zarowno relatywnym, jak i bezwzglednym adresem. Argument ,,async" okresla, czy zadanie powinno byc przetwarzane asynchronicznie lub nie - dla 1 (,,true") skrypt bedzie dalej przetwarzany po wykonaniu metody send(), a dla 0 (,,false") skrypt bedzie przetwarzany dopiero po otrzymaniu odpowiedzi. |
send( zawartosc )
|
Wysyla zadanie. |
setRequestHeader( nazwaNaglowka, zawartoscNaglowka )
|
Dodaje pare naglowek/zawartosc do zadan HTTP. |
Wlasnosci
[edytuj | edytuj kod]| Wlasnosc | Opis |
|---|---|
onreadystatechange
|
Okresla referencje do funkcji wykonywanej przy kazdej zmianie wlasnosci readyState. |
readyState
|
Zawiera stan obiektu jak nastepuje:
|
responseText
|
Zawiera odpowiedz (lancuch znakow). |
responseXML
|
Zawiera odpowiedz jako XML. Ta wlasnosc zwraca obiekt dokumentu XML, ktory moze byc parsowany, uzywajac klas i interfejsow W3C DOM. |
status
|
Zawiera kod odpowiedzi HTTP jako numer (np. 404 dla ,,Not Found" lub 200 dla ,,OK"). |
statusText
|
Zawiera status jako ciag znakow (np. ,,Not Found" lub ,,OK"). |
Historia i wsparcie przegladarek
[edytuj | edytuj kod]XMLHttpRequest bylo pierwotnie stworzone przez Microsoft jako czesc uslugi OWA (Outlook Web Access) 2000, w postaci obiektu ActiveX o nazwie XMLHTTP. Jego implementacja jest dostepna w Internet Explorerze, poczynajac od wersji 5.0[2], poprzez JScript, VBScript i inne jezyki skryptowe obslugiwane przez IE.
Pierwsza natywna implementacja XMLHttpRequest zostala wlaczona przez Mozille do Mozilla Application Suite 1.0 w 2002 roku. Ta implementacja byla potem obslugiwana przez Apple w Safari 1.2, Konqueror, Opera Software od Opery 8.0 i iCab od wersji 3.0b352. Rowniez sam Microsoft w przegladarce Internet Explorer 7 dodal natywna obsluge.
Konsorcjum World Wide Web opublikowala szkic (Working Draft) specyfikacji obiektu XMLHttpRequest 5 kwietnia 2006 roku[1]. Prace nad nia ciagle trwaja, jej celem jest udokumentowanie minimalnego zestawu wspolnych cech istniejacych implementacji, co ulatwi tworzenie kodu bez oddzielnych blokow tekstu dla roznych platform. Szkicowa specyfikacja bazuje na implementacjach popularnych przegladarek dla zapewnienia przenosnosci kodu.
Strony wykorzystujace XMLHttpRequest lub XMLHTTP wykorzystuja obiekt XMLHttpRequest bezposrednio w JavaScripcie lub z poziomu gotowych bibliotek konstrukcyjnych (frameworkow).
Istnieja rowniez inne metody, ktore daja te same efekty:
- Niewidzialny IFrame (korzystajac z wlasnosci obiektow javascriptu location.href oraz innerHTML)
- Netscape LiveConnect
- Inne obiekty Microsoft ActiveX
- Microsoft XML Data Islands
- Adobe Flash Player
- Applety Java
Znane problemy
[edytuj | edytuj kod]Pamiec podreczna Microsoft Internet Explorera
[edytuj | edytuj kod]IE implementuje pamiec podreczna dla zapytan typu GET. Autorzy, ktorzy nie znaja zachowan IE, oczekuja, ze zapytania GET beda odswiezane za kazdym razem tak samo jak po odswiezeniu strony. W niektorych sytuacjach moze to spowodowac bledy na stronie. Najprostszym rozwiazaniem jest stosowanie zapytan typu POST.
Mozemy rowniez ustawic naglowek ,,Expires" na date w przeszlosci, dzieki czemu unikniemy zapisania strony w pamieci podrecznej. Przyklad zastosowania w PHP:
header( "Last-Modified: " . gmdate( "D, d M Y H:i:s" ) . " GMT" );
header( "Cache-Control: no-cache, must-revalidate" );
header( "Pragma: no-cache" );
header( "Expires: -1", false );
To samo mozna osiagnac, uzywajac Java Servlet:
response.addHeader( "Cache-Control", "must-revalidate" );
response.addHeader( "Cache-Control", "no-cache" );
response.addHeader( "Cache-Control", "no-store" );
response.setDateHeader("Expires", 0);
Alternatywnie mozna rowniez okreslic w obiekcie XMLHttpRequest, aby pobieral zawartosc pomimo zapisanej wersji w pamieci podrecznej, tak jak pokazano w ponizszym przykladzie:
req.setRequestHeader( "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" );
req.send( null );
Kolejnym rozwiazaniem jest uzywanie losowego ciagu znakow na koncu zapytania:
Zapewni to pobranie aktualnej zawartosci.
Nalezy pamietac, ze te techniki powinny byc wykorzystywane tylko, jezeli wystepuja problemy. Zamiast wysylac niepoprawne naglowki lepiej jest informowac uzytkownika, ze nowe dane moga byc aktualnie dostepne.
Ponowne uzywanie obiektow XMLHttpRequest w IE
[edytuj | edytuj kod]Obsluga przegladarek
[edytuj | edytuj kod]- Microsoft jako pierwszy wlaczyl obiekt XMLHTTP w swojej kontrolce ActiveX MSXML.
- Internet Explorer 7 obsluguje obiekt XMLHttpRequest, zachowujac kompatybilnosc z poprzednia implementacja[2].
- Deweloperzy Mozilli stworzyli wlasny XMLHttp, ale juz jako natywny obiekt przegladarki nazywajacy sie XMLHttpRequest.
- Opera i Safari maja zaimplementowana podobna funkcjonalnosc, ale bardziej podobna do XMLHttpRequest Mozilli.
- Czesc bibliotek konstrukcyjnych (frameworkow) obsluguje tylko jedna z implementacji, a inne obie.
Biblioteki szkieletowe (frameworki)
[edytuj | edytuj kod]Powstalo wiele bibliotek szkieletowych, ktore obsluguja wszystkie implementacje XMLHttpRequest. Patrz tez: AJAX.
Zobacz tez
[edytuj | edytuj kod]Przypisy
[edytuj | edytuj kod]Linki zewnetrzne
[edytuj | edytuj kod]Dokumentacje implementacji
[edytuj | edytuj kod]- Obiekt XMLHttpRequest - propozycja standardu W3C Working Draft
- Apple Safari 1.2
- Microsoft IXMLHTTPRequest
- obiekt XMLHttpRequest - Mozilla Developer Center
Angielskojezyczne poradniki
[edytuj | edytuj kod]Bezpieczenstwo
[edytuj | edytuj kod]- ,,Attacking AJAX Applications". isecpartners.com. [zarchiwizowane z tego adresu (2006-10-23)]., prezentacja z konferencji Black Hat(inne jezyki). Opisuje kilka tematow dotyczacych XMLHttpRequest oraz przyszlosc AJAX-a dzialajacego na roznych domenach.
| Struktura stron WWW | |
|---|---|
| Generowanie dynamicznych stron WWW | |
| Po stronie uzytkownika | |
| Przesylanie danych | |
| Pojecia |