3. AJAX (INT)

Transkrypt

3. AJAX (INT)
3. (INT) Asynchroniczna komunikacja z serwerem HTTP w technologii AJAX
Co to jest AJAX?
AJAX (czyli Asynchronous JavaScript and XML), mimo że czasem zwany „nową technologią”,
jest jedynie nowym sposobem użycia od lat istniejących metod (działających po stronie
klienta a nie serwera) do tworzenia interaktywnych aplikacji sieciowych. Główną ideą AJAX’a
jest umożliwienie dynamicznego pobierania i umieszczania w treści strony informacji bez
konieczności przeładowywania całej strony.
Podstawowe elementy AJAX
Na technologię tę składa się parę elementów:
• XMLHttpRequest (w skrócie XHR) – obiekt języków skryptowych umożliwiający
asynchroniczne przesyłanie danych przez sieć; dzięki asynchroniczności, w trakcie
pobierania danych, użytkownik może wykonywać inne czynności, można także
pobierać dane jednocześnie z wielu miejsc.
• JavaScript – mimo użycia w nazwie, może to być dowolny język skryptowy
funkcjonujący po stronie użytkownika (np. JScript czy VBScript), który obsługuje
obiektowy model dokumentu (DOM); przetwarzanie danych po stronie użytkownika
jest kluczowe, ponieważ odebrane dane muszą zostać wstawione na stronę.
• XML – język znaczników, poprzez który miałyby być opisane odbierane informacje. W
praktyce jednak dane często przekazywane są w innym formacie, przy czym
odbierane są wtedy jako tekst. Mogą to być zarówno gotowe fragmenty HTML, jak i
fragmenty kodu JavaScript (zob. JSON), może to być też format specyficzny dla
danego zastosowania.
Teoretycznie są to wszystkie wymagane elementy, jednak w praktyce bardzo często używane
są jeszcze odpowiednie skrypty funkcjonujące po stronie serwera i współpracujące z bazą
danych. Oczywiście nie są one konieczne, jeśli wszystkie potrzebne dane zostały już
wcześniej wygenerowane (np. zawartość poszczególnych stron prostego serwisu).
Trochę historii
W 1999 roku, Microsoft stworzył i zaimplementował w Internet Explorerze 5, obiekt ActiveX
o nazwie XMLHTTP, który stał się prekursorem dla zaadoptowanego później przez Mozillę,
Safari, Operę i inne przeglądarki obiektu JavaScript – XMLHttpRequest (pojawił się on
również w Internet Explorerze od wersji 7, wciąż pozostawiając wsparcie dla stworzonego
wcześniej obiektu ActiveX). Technika wykonywania w tle asynchronicznych żądań HTTP do
serwera była raczej mało rozpowszechniona dopóki nie zaczęła pojawiać się na dużą skalę w
aplikacjach sieciowych takich jak Outlook Web Access (2000) czy Oddpost (2002). Jednak
prawdziwą popularność przyniosło użycie AJAX’a przez Google w Gmail’u (2004) i Google
Maps (2005). W kwietniu 2006, konsorcjum W3C wydało pierwszy szkic specyfikacji dla
obiektu XMLHttpRequest.
Dlaczego warto używać AJAX?
Na stronach stworzonych bez użycia AJAX’a, każda akcja podejmowana przez użytkownika
wymaga przeładowania całej strony. Ma to oczywiście uzasadnienie jeśli otwierana strona
znacznie różni się od tej na której użytkownik aktualnie się znajduje, jednak bardzo często
wiele elementów na stronie pozostaje stałych, a zmienia się jedynie jej fragment – a w
związku z tym, ciągłe przeładowywanie strony jest zbędne, powoduje mało komfortowe dla
użytkownika znikanie i pojawianie się na nowo tych samych treści i generuje niepotrzebny
ruch w sieci. AJAX rozwiązuje wszystkie te problemy, a dodatkowo dzięki asynchroniczności
pozostawia użytkownikowi możliwość dalszego korzystania ze strony w czasie gdy dane są
pobierane z serwera.
Zasada działania
Ogólną zasadę działania, najlepiej obrazuje schemat na kolejnej stronie. Działanie AJAX’a
rozpoczyna się w momencie, gdy użytkownik wyzwoli odpowiednie zdarzenie powodujące
konieczność pobrania danych z serwera. W tym momencie, po stronie klienta, na poziomie
JavaScript (lub innego języka skryptowego), tworzony jest obiekt XMLHttpRequest.
• następnie przy pomocy metody open() tego obiektu, określany jest URL
pobieranych danych, metoda żądania (GET lub POST) oraz sposób obsługi żądania
(asynchroniczny bądź nie – zgodnie z ideą AJAX’a powinien być oczywiście
asynchroniczny).
• jeśli
wybrano
metodę
POST,
dodatkowo
przy
pomocy
metody
setRequestHeader() ustawia się nagłówki dla żądania.
• jeśli żądanie ma być obsłużone asynchronicznie, należy do atrybutu
onreadystatechange przypisać funkcję (lub referencję do niej), która obsłuży
wynik zapytania.
• wysłanie żądania następuje przy pomocy metody send().
Dane zwracane przez serwer obsługiwane są przez wskazaną wcześniej funkcję – do
sprawdzania stanu żądania służy jego atrybut readyState przyjmujący jedną z 5 wartości:
• 0 = zapytania niezainicjowane
• 1 = połączenie z serwerem ustabilizowane
• 2 = zapytanie wysłane
• 3 = odbieranie odpowiedzi
• 4 = żądanie zakończone
Najistotniejszą jest oczywiście ostatnia z nich, która informuje o tym, że można rozpocząć
przetwarzanie odpowiedzi. Zanim to jednak nastąpi, mamy dodatkowo możliwość
sprawdzenia kodu odpowiedzi HTTP, aby upewnić się, że żądanie zostało poprawnie
obsłużone (o czym informuje kod 200) – możemy go odczytać z atrybutu status obiektu
XHR. Odebrane dane zawierają atrybuty responseText / responseXML (odpowiednio
jako tekst lub jako XML) i w zależności od tego jak chcemy je przetwarzać, korzystamy z
odpowiedniego z nich.
Wady
•
•
•
•
•
•
duże ograniczenie możliwości korzystania z historii odwiedzanych stron (a tym samym
poruszanie się do przodu i wstecz w przeglądarce). Implementacja odpowiedniego
mechanizmu spoczywa na twórcy strony. To samo tyczy się również np. tworzenia
zakładek do danego stanu aplikacji.
ograniczenie dostępu dla użytkowników celowo blokujących skrypty, czy korzystających z
urządzeń, w których obsługa skryptów może być mocno ograniczona (czytniki ekranowe,
telefony komórkowe, palmtopy…); obejściem problemu jest udostępnienie
alternatywnego, bardziej tradycyjnego rozwiązania przynajmniej dla podstawowych
funkcji serwisu internetowego (np. portale posiadające obsługę kont pocztowych
udostępniają czasem starsze wersje interfejsu)
utrudnione automatyczne pobieranie stron (z punktu widzenia właścicieli serwisu nie
zawsze jest to wada)
utrudnione indeksowanie przez wyszukiwarki (należy zadbać o dostarczanie linków
wyświetlających całą treść strony lub stworzyć mapę witryny)
utrudniona analiza ruchu na stronie (głównie przy starszych skryptach, nowsze potrafią
już uwzględnić właściwy pomiar oglądalności stron)
utrudnione debugowanie
Więcej informacji (lub jak kto woli – źródła na podstawie których powstało opracowanie)
•
•
•
•
•
•
•
http://en.wikipedia.org/wiki/Ajax_%28programming%29 (trochę teorii, głównie dla
tych co by chcieli poczytać odrobinę obszerniej o historii AJAX’a) [EN]
http://www.w3schools.com/ajax/ (biblia ;D ) [EN]
http://www.xul.fr/en-xml-ajax.html (dość obszerny i całkiem fajny tutorial) [EN]
http://www.staff.amu.edu.pl/~ttomek/pzr/cwiczenia14.html (kolejny przyzwoicie
napisany tutorial) [PL]
http://pl.wikipedia.org/wiki/Kod_odpowiedzi_HTTP (tu szukać tabelek z kodami
odpowiedzi HTTP, czyli co znaczy 200, 404, 503 itp.) [PL]
http://pl.wikipedia.org/wiki/XMLHttpRequest (szczegółowy opis metod i atrybutów
tytułowego obiektu XHR) [PL]
http://pl.wikipedia.org/wiki/AJAX (hasło tak sobie opracowane – to co najlepsze to
macie już tutaj; wrzucam link dla porządku) [PL]