четверг, 4 июля 2013 г.

XMLHttpRequest Подсказка

XMLHttpRequest доступен начиная с IE 7, но недоступен в IE6.

Допустимо повторное использование имеющегося экземпляра XMLHttpRequest, но  в этом случае будет прервано выполнение запроса на сервер, уже отправленного объектом.

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.google.com', false); // false для синхронного запроса и true для асинхронного запроса
xhr.setRequestHeader('Content-Type', 'text/plain'); // для типа запроса POST устанавливаем этот заголовок application/x-www-form-urlencoded
xhr.onreadystatechange = function(){
    if (xhr.readyState === 4) {
        if (xhr.status === 200) {
            alert(xhr.responseText):
        } else {
            document.body.innerHTML = 'ERROR';
        }
    }
}
xhr.send(null); // или xhr.send('name=Boris&surname=Viktorov');

Если вызвать метод setRequestHeader() несколько раз с одним и тем же заголовком, то новое значение не заменит прежнее.
Вместо этого в HTTP-запрос на сервер будет вставлено несколько заголовков или один заголовок с несколькими значениями.
Нельзя определять собственные заголовки 'Content-Length', 'Date', 'Referer' и 'User-Agent', поскольку объект XMLHttpRequest добавляет их автоматичски и не позволяюет подделывать их.
Аналогично объект XMLHttpRequest автоматически обрабатывает cookie и срок поддержки открытого соединения с сервером, определяет кодировку символов как UTF-8 и выполняет кодирование сообщений.
Поэтому методу setRequestHeader не передаются следующие заголовки:
Accept-Charset
Accept-Encoding
Connection
Cookie
Cookie2
Content-Transfer-Encoding
Date
Expect
Host
Keep-Alive
Referer
TE
Trailer
Transfer-Encoding
Upgrade
User-Agent
Via

Можно определить заголовок Authorization, но обычно в этом нет необъодимости.

При выполнении запроса к ресурсу защищенному паролем передайте имя пользователя и пароль методу open() в четвертом и пятом аргументах, а объект XMLHttpRequest автоматичски установит соотвествующие заголовки.

Порядок написания xhr запроса всегда должен быть следующий (иначе будет вызвана ошибка):
в первую очередь в методе open() пишутся метод запроса (GET) и URL-адрес (http://www.google.com/),
затем устанваливаются заголовки запроса (setRequestHeader())
и после этого пишется тело запроса ('name=Boris&surname=Viktorov')
Ничего не отправляется на сервер пока не будет вызван метод send()

Сервер в ответ возвращает свойства status (200) и statustext ('OK'),
заголовки ответа можно получить с помощью методов getResponseHeader() и getAllresponseHeaders().
Обработка cookie выполняется объектом XMLHttpRequest автоматически: он исключает заголовки Cookie из множества возвращаемого методом getAllResponseHeaders() и возвращает null, если передатьаргумент 'Set-Cookie' или 'Set-Cookie2' методу getResponseHeader().

Тело ответа сервера в текстовом виде доступно через свойство responseText или в виде объекта Document через свойство responseXML.

Вызов метода xhr.abort() прервет выполнение запроса на сервер и вызовет срабатывание события abort.
с помощью функции setTimeout() и метода xhr.abort() можно вызывать прерывание ожидания ответа от сервера по истечению таймаута.

Политика общего происхождения запрещает просмативать содержимое и выполнять JavaScript в iFrame, загруженное с других доменов.
То же касается и получения содержимого responseText с других доменов, отличных от того, с которого загружен HTML-код страницы.
Но спецификация XHR2 позволяет выполнять кроссдоменные запросы к другим сайтам сервер которых в ответ переждает заголовок CORS.
XHR2 поддерживают Firefox, Chrome, Safari, IE8. Если браузер поддерживает CORS (Cross-Origin Resource Sharing) и доступ к сайту на сервере разрешен через заголовок CORS, то никаких проблем не будет.
Однако в междоменных запросов не будут передаваться логин, пароль пользователя и cookie.

Комментариев нет:

Отправить комментарий