Объект XMLHttpRequest хранит не только информацию о HTTP_запросе, но и ответ сервера. Если методу open() третьим аргументом передается значение false, ме_ тод send() выполнит запрос синхронно: он не вернет управление до тех пор, пока не будет получен ответ сервера.2
Метод send() не возвращает код состояния. После того как он вернет управление, можно проверить код состояния HTTP, возвращаемый сервером в свойстве sta_ tus объекта запроса. Возможные значения кода состояния определяются прото_ колом HTTP. Код состояния 200 означает успешное завершение запроса и дос_ тупность ответа. В то же время код состояния 404 означает ошибку «не найде_ но», которая возникает в случае, когда указанный URL_адрес не существует.
1 Подробное описание протокола HTTP выходит за рамки темы этой книги. За допол_ нительной информацией об этих и других заголовках, используемых при выпол_ нении HTTP_запросов, обращайтесь к техническому описанию протокола HTTP.
2 Объект XMLHttpRequest обладает поистине удивительными возможностями, но его прикладной программный интерфейс продуман недостаточно. Например, логи_ ческое значение, определяющее синхронное или асинхронное поведение, в дейст_ вительности должно было бы быть аргументом метода send().
20.1. Использование объекта XMLHttpRequest
Объект XMLHttpRequest возвращает ответ сервера в виде строки, доступной через свойство responseText объекта запроса. Если ответ представляет собой XML_доку_ мент, к нему можно обращаться как к DOM_объекту Document через свойство re_ sponseXML. Обратите внимание: чтобы объект XMLHttpRequest воспринял и преобра_ зовал ответ сервера в объект Document, сервер должен явно идентифицировать его как XML_документ, указав MIME_тип "text/xml".
Когда запрос выполняется синхронно, программный код, следующий за вызо_ вом метода send(), обычно выглядит как_то так:
if (request.status == 200) {
// Ответ сервера получен. Отобразить текст ответа. alert(request.responseText);
}
else {
// Что_то пошло не так. Отобразить код ошибки и сообщение. alert("Error " + request.status + ": " + request.statusText);
}
Помимо кода состояния и ответа сервера в виде текста или документа объект XMLHttpRequest предоставляет доступ к HTTP_заголовкам, полученным от серве_ ра. Метод getAllResponseHeaders() возвращает заголовки ответа в виде одного сплошного блока текста, а метод getResponseHeader() возвращает значение заго_ ловка по его имени. Например:
if (request.status == 200) { // Убедиться в отсутствии ошибок // Убедиться, что ответ _ это XML_документ
if (request.getResponseHeader("Content_Type") == "text/xml") { var doc = request.responseXML;
// Теперь обработать полученный документ
}
}
При использовании объекта XMLHttpRequest в синхронном режиме существует од_ на серьезная проблема: если веб_сервер не ответит на запрос, метод send() ока_ жется заблокированным на достаточно продолжительное время. Исполнение JavaScript_сценария прекратится, создавая ощущение, что веб_броузер «повис» (разумеется, это во многом зависит от типа платформы). Когда сервер прекраща_ ет процесс передачи обычной страницы, пользователь может просто щелкнуть на кнопке Остановить и попробовать перейти по другой ссылке или ввести другой URL_адрес. Однако на объект XMLHttpRequest кнопка Остановить никакого воздей_ ствия не оказывает. Метод send() не предоставляет возможности определить максимальное время ожидания, а однопоточная модель исполнения сценариев в JavaScript не позволяет прервать работу объекта XMLHttpRequest в синхронном режиме после того как запрос отправлен.
Решение этой проблемы заключается в использовании объекта XMLHttpRequest в асинхронном режиме.