Dark Mode

Przejdz do zawartosci

XMLHttpRequest

Z Wikipedii, wolnej encyklopedii

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:
  • 0 = zapytania niezainicjowane
  • 1 = cel otwarty
  • 2 = zapytanie wyslane
  • 3 = odbieranie odpowiedzi
  • 4 = zadanie zakonczone
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:

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( "Expires: Mon, 26 Jul 1997 05:00:00 GMT" ); // sprawia, ze IE nie zapisze tej strony
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.setHeader( "Pragma", "no-cache" );
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.open( "GET", "xmlprovider.php" );
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:

req.open( "GET", "xmlprovider.php?sid=" + Math.random());

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]

Angielskojezyczne poradniki

[edytuj | edytuj kod]

Bezpieczenstwo

[edytuj | edytuj kod]