XML DOM - obiekt XMLHttpRequest

Obiekt XMLHttpRequest

Obiekt XMLHttpRequest zapewnia pełny dostęp do protokołu HTTP, w tym możliwość wykonywania żądań POST i HEAD oraz zwykłych żądań GET. XMLHttpRequest może zwracać odpowiedzi serwera web w sposób synchroniczny lub asynchroniczny i może zwracać zawartość w formie tekstu lub dokumentu DOM.

Chociaż nazwany XMLHttpRequest, nie jest ograniczony do użycia z dokumentami XML: może odbierać dowolny typ dokumentu tekstowego.

obiekt XMLHttpRequest jest nazwany AJAX jest kluczową funkcją architektury aplikacji web.

obsługa przez przeglądarkę

XMLHttpRequest jest dobrze wspierany przez wszystkie nowoczesne przeglądarki. Jedyną zależność przeglądarki dotyczy tworzenia obiektu XMLHttpRequest. W IE 5 i IE 6 należy używać specyficznej dla IE konstruktury ActiveXObject(). Jak w Obiekt XMLHttpRequest Omówione w tym rozdziale.

Standardyzacja W3C

Obiekt XMLHttpRequest jeszcze nie został standaryzowany, ale W3C zaczął pracę nad standaryzacją, zawartość tego podręcznika opiera się na pracach projektowych.

Bieżąca implementacja XMLHttpRequest jest dość spójna. Ale ma subtelne różnice w stosunku do standardu. Na przykład, pewna implementacja może zwracać null, podczas gdy standard wymaga pustego stringa, lub implementacja może ustawiać readyState na 3, nie gwarantując, że wszystkie nagłówki odpowiedzi będą dostępne.

Właściwość

readyState

Stan żądania HTTP. Kiedy XMLHttpRequest jest pierwotnie tworzone, wartość tej właściwości zaczyna się od 0, aż do otrzymania pełnej odpowiedzi HTTP, wartość ta zwiększa się do 4.

Każdy z 5 stanów ma związany z nim nieoficjalną nazwę. Poniższa tabela pokazuje stany, nazwy i ich znaczenie:

Stan Nazwa Opis
0 Uninitialized Stan inicjalizacji. Obiekt XMLHttpRequest został utworzony lub został zresetowany przez metodę abort().
1 Open Metoda open() została wywołana, ale metoda send() nie została wywołana.Żądanie jeszcze nie zostało wysłane.
2 Sent Metoda Send() została wywołana, HTTP żądanie zostało wysłane do serwera Web. Nie otrzymano odpowiedzi.
3 Receiving Wszystkie nagłówki odpowiedzi zostały otrzymane. Ciało odpowiedzi zaczęło być odbierane, ale nie jest jeszcze ukończone.
4 Loaded HTTP odpowiedź została całkowicie otrzymana.

Wartość readyState nie maleje, chyba że podczas przetwarzania żądania wywołano abort() lub open() metodę. Za każdym razem, gdy wartość tej właściwości zwiększa się, wywoływany jest handler zdarzenia onreadystatechange.

responseText

Do tej pory otrzymany przez serwer ciało odpowiedzi (bez nagłówków), lub pusty string, jeśli jeszcze nie otrzymano danych.

Jeśli readyState jest mniejszy niż 3, ta właściwość jest pustym stringiem. Kiedy readyState wynosi 3, ta właściwość zwraca już otrzymaną część odpowiedzi. Jeśli readyState wynosi 4, ta właściwość przechowuje pełne ciało odpowiedzi.

Jeśli odpowiedź zawiera nagłówek określający kodowanie znaków dla ciała odpowiedzi, użyj tego kodowania. W przeciwnym razie, zakładaj, że używa się Unicode UTF-8.

responseXML

Odpowiedź na żądanie, przetworzona jako XML i jako Obiekt Documentzwracany.

status

zwracany przez serwer Kod stanu HTTP, np. 200 oznacza sukces, a 404 oznacza błąd "Nie znaleziono". Odczyt tej właściwości gdy stan readyState jest mniejszy niż 3 powoduje wyjątek.

statusText

Ta właściwość określa kod stanu HTTP żądania za pomocą nazwy, a nie liczby. Oznacza to, że gdy stan wynosi 200, to jest to "OK", a gdy stan wynosi 404, to jest to błąd "Nie znaleziono". Jak właściwość status, odczyt tej właściwości gdy stan readyState jest mniejszy niż 3 powoduje wyjątek.

Funkcja obsługi zdarzenia

onreadystatechange

Funkcja obsługi zdarzenia wywoływana przy każdym zmianie wartości atrybutu readyState. Może być wywoływana wiele razy, gdy stan readyState wynosi 3.

Metoda

abort()

Anulowanie bieżącej odpowiedzi, zamknięcie połączenia i zakończenie wszystkich niezakończonych działań sieciowych.

Ta metoda resetuje obiekt XMLHttpRequest do stanu readyState 0 i anuluje wszystkie niezakończone działania sieciowe. Na przykład, jeśli żądanie zajęło zbyt dużo czasu, a odpowiedź nie jest już niezbędna, można wywołać tę metodę.

getAllResponseHeaders()

Zwracanie nagłówków odpowiedzi HTTP jako nieprzetworzonego ciągu znaków.

Jeśli stan readyState jest mniejszy niż 3, ta metoda zwraca null. W przeciwnym razie, zwraca wszystkie nagłówki odpowiedzi HTTP wysłane przez serwer. Nagłówki są zwracane jako pojedynczy ciąg znaków, wiersz na nagłówek. Każdy wiersz jest oddzielony znakiem nowej linii "\r\n".

getResponseHeader()

Zwrócenie wartości określonego nagłówka odpowiedzi HTTP. Parametrem jest nazwa nagłówka odpowiedzi HTTP, który ma być zwrócony. Można użyć dowolnej wielkości liter do określenia nazwy nagłówka, porównanie z nazwą nagłówka odpowiedzi jest niezależne od wielkości liter.

Zwrócona wartość tej metody to wartość określonego nagłówka odpowiedzi HTTP, jeśli nie otrzymano tego nagłówka lub stan readyState jest mniejszy niż 3, to pusty ciąg znaków. Jeśli otrzymano wiele nagłówków o określonej nazwie, wartości tych nagłówków są łączone i zwracane, oddzielone przecinkami i spacjami.

open()

Inicjalizacja parametrów żądania HTTP, takich jak URL i metoda HTTP, ale bez wysyłania żądania.

send()

Wysyłanie HTTP żądania, używając parametrów przekazanych do metody open() oraz opcjonalnego ciała żądania przekazanego do tej metody.

setRequestHeader()

Ustawienie lub dodanie HTTP żądania do otwartego, ale nie wysłanego żądania.

XMLHttpRequest.open()

Inicjalizacja parametrów żądania HTTP

Gramatyka

open(method, url, async, username, password)

Parametr method określa metodę HTTP używaną do żądania. Wartości obejmują GET, POST i HEAD.

Parametr url jest głównym elementem żądania. Większość przeglądarek implementuje strategię bezpieczeństwa samego źródła i wymaga, aby ten URL miał ten sam nazwę hosta i port co tekst zawierający skrypt.

Parametr async wskazuje, że żądanie powinno być wykonywane asynchronicznie. Jeśli ten parametr wynosi false, żądanie jest同步ne, a wywołania send() będą blokować, aż pełna odpowiedź zostanie otrzymana. Jeśli ten parametr wynosi true lub jest pominięty, żądanie jest asynchroniczne i zazwyczaj wymaga handlera zdarzenia onreadystatechange.

Parametry username i password są opcjonalne i dostarczają uprawnienia autoryzacyjne potrzebne do url. Jeśli są określone, zastępują cokolwiek określonego w url.

Wyjaśnienie

Ta metoda inicjalizuje parametry żądania do użycia przez metodę send() w przyszłości. Ustawia readyState na 1, usuwa wszystkie wcześniej określone nagłówki żądania oraz wszystkie wcześniej otrzymane nagłówki odpowiedzi, a także ustawia parametry responseText, responseXML, status oraz statusText na ich wartości domyślne. Wywołanie tej metody jest bezpieczne, gdy readyState wynosi 0 (kiedy obiekt XMLHttpRequest jest tworzony lub wywołana metoda abort()) oraz gdy readyState wynosi 4 (po otrzymaniu odpowiedzi). W przypadku wywołania tej metody dla jakiegokolwiek innego stanu, zachowanie metody open() jest określone.

Poza zapisaniem parametrów żądania dla metody send() oraz przywróceniem XMLHttpRequest do stanu umożliwiającego jego ponowne użycie, metoda open() nie ma innych zachowań. Należy zwrócić uwagę, że w momencie wywołania tej metody, implementacja zazwyczaj nie otwiera połączenia sieciowego do serwera webowego.

XMLHttpRequest.send()

Wysyłanie HTTP żądania

Gramatyka

send(body)

Jeśli metoda HTTP określona przez wywołanie open() to POST lub PUT, parametr body określa ciało żądania jako ciąg znaków lub Obiekt DocumentJeśli parametr ciała żądania nie jest wymagany, ten parametr wynosi null. Dla wszystkich innych metod, parametr ten jest niedostępny i powinien wynosić null (niektóre implementacje nie pozwalają na pominięcie tego parametru).

Wyjaśnienie

Ta metoda powoduje wysłanie HTTP żądania. Jeśli wcześniej nie zostało wywołane open(), lub bardziej precyzyjnie, jeśli stan readyState nie wynosi 1, send() wywołuje wyjątek. W przeciwnym razie, wysyła żądanie HTTP, które składa się z następujących części:

  • Metoda HTTP, URL oraz uprawnienia uwierzytelniające, które zostały określone poprzednio przez wywołanie open() (jeśli istnieją).
  • Nagłówek żądania, który został określony poprzednio przez wywołanie setRequestHeader() (jeśli istnieje).
  • Przekazywane do tej metody body Parametry

Po opublikowaniu żądania, send() ustawia stan readyState na 2 i wywołuje handler na zdarzenie onreadystatechange.

Jeśli parametr async wywołania open() wynosi false, ta metoda zablokuje i nie zwróci wyniku, aż stan readyState wyniesie 4 i odpowiedź serwera zostanie całkowicie otrzymana. W przeciwnym razie, jeśli parametr async wynosi true, lub jest pomijany, send() natychmiast zwróci, i jak zostanie wyjaśnione później, odpowiedź serwera będzie przetwarzana w wątku w tle.

Jeśli odpowiedź serwera zawiera HTTP przekierowanie, metoda send() lub wątek w tle automatycznie przestrzega przekierowania. Gdy wszystkie nagłówki odpowiedzi HTTP zostaną otrzymane, send() lub wątek w tle ustawia stan readyState na 3 i wywołuje handler na zdarzenie onreadystatechange. Jeśli odpowiedź jest długa, send() lub wątek w tle może wywołać handler na zdarzenie onreadystatechange w stanie 3: to może być używane jako wskaźnik postępu pobierania. Ostatecznie, gdy odpowiedź zostanie ukończona, send() lub wątek w tle ustawia stan readyState na 4 i wywołuje handler na zdarzenie po raz ostatni.

XMLHttpRequest.setRequestHeader()

Gramatyka

setRequestHeader(name, value)

Parametr name to nazwa nagłówka do ustawienia. Ten parametr nie powinien zawierać białych znaków, kropki lub wierszy pustych.

Parametr value to wartość nagłówka. Ten parametr nie powinien zawierać wierszy pustych.

Wyjaśnienie

Metoda setRequestHeader() określa nagłówek żądania HTTP, który powinien być zawarty w żądaniu publikowanym za pomocą następującego wywołania send(). Metoda ta może być wywoływana tylko gdy stan readyState wynosi 1, na przykład, po wywołaniu open(), ale przed wywołaniem send().

Jeśli nagłówek o określonej nazwie został już ustawiony, nowa wartość tego nagłówka to: poprzednia wartość, dodać przecinek, spację oraz wartość określoną w tej wywołanej funkcji.

Jeśli wywołanie open() określa kwalifikację autoryzacyjną, XMLHttpRequest automatycznie wysyła odpowiedni nagłówek żądania Authorization. Możesz jednak użyć setRequestHeader() do dodania tego nagłówka. Podobnie, jeśli serwer internetowy już zachował i przekazał ci cookie związane z URL przekazanym do open(), odpowiednie nagłówki Cookie lub Cookie2 są automatycznie zawarte w żądaniu. Możesz dodać te cookie do nagłówków, wywołując setRequestHeader(). XMLHttpRequest może również dostarczyć wartość domyślną dla nagłówka User-Agent. Jeśli to zrobi, wartość, którą określisz dla tego nagłówka, zostanie dodana do tej wartości domyślnej.

Niektóre nagłówki żądania są automatycznie ustawiane przez XMLHttpRequest zamiast przez ten metodę, aby pasowały do protokołu HTTP. W tym zakresie znajdują się nagłówki związane z proxy:

  • Host
  • Connection
  • Keep-Alive
  • Accept-charset
  • Accept-Encoding
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • Range