Общее представление об AJAX. Часть 6

Извлечение HTTP-заголовков

Метод getAllResponseHeaders() объекта XMLHttpRequest возвращает все HTTP-заголовки, полученные от сервера, тогда как метод getResponseHeader() - только один конкретный заголовок. В слуедующем фрагменте кода демонстрируется, каким образом извлекается информация о типе используемого Web-сервера:

var XMLHttp = getXMLHttp();
XMLHttp.open("GET", "sometext.txt", true);
XMLHttp.onreadystatechange = handlerFunction;
XMLHttp.send(null);

function handlerFunction() {
  if (XMLHttp.readyState == 4) {
    var servertype = XMLHttp.getResponseHeader("Server");
    window.alert("Web server used: " + servertype);
  }
}

function getXMLHttp() {
  var XMLHttp = null;
  if (window.XMLHttpRequest) {
    try {
      XMLHttp = new XMLHttpRequest();
    } catch (e) { }
  } else if (window.ActiveXObject) {
    try {
      XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) { }
    }
  }
  return XMLHttp;
}

Получение XML-данных от сервера

Свойство responseText отлично подходит для обработки ограниченного количества неструктурированных данных. Однако более более изящный подход к обработке сложных, структурированных данных в приложении AJAX предоставляет свойство responseXML. При обращении к этому свойству будет получен ответ на запрос HTTP в виде объекта XML DOM языка JavaScript, но при условии, что сервер возвращает действительные данные XML. в противном случае будет получено пустое значение null.

Доступ к подобным данным объекта XML осуществляется таким же образом, как и к элементам DOM из кода JavaScript. Для данного примера кода используется следующий XML-файл books.xml:

<books>
  <book pubdate="2006">
    <title>JavaScript Phrasebook</title>
    <publisher>Sams Publishing</publisher>
  </book>
  <book pubdate="2006">
    <title>MySQL Phrasebook</title>
    <publisher>Sams Publishing</publisher>
  </book>
  <book pubdate="2005">
    <title>PHP Phrasebook</title>
    <publisher>Sams Publishing</publisher>
  </book>
</books>

Для того, чтобы браузеры могли прочитать этот XML-файл (особо строгими правилами в этом отношении отличается Internet Explorer), клиенту должен быть отправлен правильный тип MIME, а именно: text/xml. Этот тип указывается в свойстве mime.types файла конфигурации Apache.

С другой стороны, сценарий на сервере может сам предоставить файл с правильным типом MIME:

<?php
header('Content-type: text/xml');
readfile('books.xml');
?>

В следующем фрагменте кода осуществляется доступ к данным из XML-файла с использованием структуры DOM:

var XMLHttp = getXMLHttp();
XMLHttp.open("GET", "books.xml", true);
XMLHttp.onreadystatechange = handlerFunction;
XMLHttp.send(null);

function handlerFunction() {
  if (XMLHttp.readyState == 4) {
    var xml = XMLHttp.responseXML;
    var book = xml.getElementsByTagName("book");
    for (var i=0; i<book.length; i++) {
      var pubdate = book[i].getAttribute("pubdate");
      var title, publisher;
      for (var j=0; j<book[i].childNodes.length; j++) {
        if (book[i].childNodes[j].nodeName == "title") {
          title = book[i].childNodes[j].firstChild.nodeValue;
        } else if (book[i].childNodes[j].nodeName == "publisher") {
          publisher = book[i].childNodes[j].firstChild.nodeValue;
        }
      }
      window.alert(title + " by " + publisher + " (" + pubdate + ")");
    }
  }
}

function getXMLHttp() {
  var XMLHttp = null;
  if (window.XMLHttpRequest) {
    try {
      XMLHttp = new XMLHttpRequest();
    } catch (e) { }
  } else if (window.ActiveXObject) {
    try {
      XMLHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        XMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) { }
    }
  }
  return XMLHttp;
}

Ссылки по теме:

Оставьте свой отзыв