Объект XMLHTTPRequest - низкоуровневая основа большинства AJAX-приложений. Знание его методов, свойств и особенностей не только помогает писать приложения на низком уровне с минимумом javascript-кода, но и позволяет понять, что происходит внутри фреймворков, которые, увы, часто несовершенны или тянут много лишнего.

Основные методы для посылки запросов XMLHttpRequest.

>> open(Method, Url, async)
>> send(data)
>> onreadystatechange

Правильная последовательность open/onreadystatechange/send:

Код:
req.open("GET", url, true)
req.onreadystatechange = handler
req.send(null)

Методы для манипуляции заголовками:

>> setRequestHeader()
>> getResponseHeader()
>> getAllResponseHeaders()

Обрыв соединения осуществляет метод

>> abort()

Ответ сервера находится в

>> responseText
>> responseXML
>> status
>> statusText

Причем responseXML заполняется только в случае, когда Content-Type с сервера имеет значение text/xml (кроме overrideMimeType-метода, но он есть только в Firefox).

Краткая сводка плюсов и минусов

>> Возможна синхронная передача (хотя и подвешивает браузер)
>> Полный контроль над заголовками
>> Можно отсылать документы из браузера в виде файлов, составляя POST-запрос вручную
>> В явном виде выдает ошибки коммуникации

>> Ограничение безопасности при помощи same origin policy
>> Невозможна отправка файлов, выбранных в форме
>> Утечки памяти при неправильном применении в старых IE

Пример небольшой функции getUrl, которая делает запросы:

Код:
function getXmlHttp()
{
    try 
    {
        return new ActiveXObject("Msxml2.XMLHTTP");
    } 
    catch (e) 
    {
         try
         {
             return new ActiveXObject("Microsoft.XMLHTTP");
         } 
         catch (ee) 
         {
         }
    }
    if (typeof XMLHttpRequest!='undefined') 
    {
        return new XMLHttpRequest();
    }
} 
// Получить данные с url и вызывать cb - коллбэк c ответом сервера 
function getUrl(http://javascript.ru/forum/url, cb) 
{ 
    // IE кэширует XMLHttpRequest запросы, так что добавляем случайный параметр к URL
    // (хотя можно обойтись правильными заголовками на сервере)
    xmlhttp.open("GET", url+'?r='+Math.random());
    xmlhttp.onreadystatechange = function() 
    {
        if (xmlhttp.readyState == 4) 
        {
             cb(
                 xmlhttp.status, 
                 xmlhttp.getAllResponseHeaders(), 
                 xmlhttp.responseText
                );
        }
    }
    xmlhttp.send(null);
}

Теги: AJAX