XMLHttpRequest

редактировать
Веб-API для передачи данных между веб-браузером и веб-сервером

XMLHttpRequest (XHR ) представляет собой API в форме объекта, методы которого передают данные между веб-браузером и веб-сервером. Объект предоставляется средой браузера JavaScript. В частности, получение данных из XHR с целью постоянного изменения загруженной веб-страницы является основной концепцией дизайна Ajax. Несмотря на название, XHR может использоваться с протоколами, отличными от HTTP, и данные могут быть в форме не только XML, но также JSON, HTML или простой текст.

WHATWG поддерживает стандарт XHR как живой документ. Текущая работа W3C по созданию стабильной спецификации основана на снимках стандарта WHATWG.

Содержание
  • 1 История
  • 2 Стандарты
  • 3 HTTP-запрос
    • 3.1 Открытый метод
    • 3.2 Метод setRequestHeader
    • 3.3 Метод отправки
    • 3.4 Приемник событий onreadystatechange
    • 3.5 HTTP-ответ
  • 4 Междоменные запросы
  • 5 Альтернатива выборки
  • 6 См. Также
  • 7 Ссылки
  • 8 Внешние ссылки
История

Концепция, лежащая в основе объект XMLHttpRequest был первоначально создан разработчиками Outlook Web Access (Microsoft) для Microsoft Exchange Server 2000. Интерфейс под названием IXMLHTTPRequest был разработан и реализован во второй версии библиотеки MSXML с использованием этой концепции. Вторая версия библиотеки MSXML была отправлена ​​с Internet Explorer 5.0 в марте 1999 года, что позволяло доступ через ActiveX к интерфейсу IXMLHTTPRequest с использованием XMLHTTP оболочка библиотеки MSXML.

Internet Explorer версий 5 и 6 не определял идентификатор объекта XMLHttpRequest в своих языках сценариев, поскольку сам идентификатор XMLHttpRequest не был стандартом на момент их выпуска. Обратная совместимость может быть достигнута путем обнаружения объекта, если идентификатор XMLHttpRequest не существует. Microsoft добавила идентификатор объекта XMLHttpRequest к своим языкам сценариев в Internet Explorer 7.0, выпущенном в октябре 2006 года.

Проект Mozilla разработал и реализовал интерфейс под названием nsIXMLHttpRequest в Гекко механизм компоновки. Этот интерфейс был смоделирован так, чтобы работать как можно ближе к интерфейсу Microsoft IXMLHTTPRequest. Mozilla создала оболочку для использования этого интерфейса через объект JavaScript, который они назвали XMLHttpRequest . Объект XMLHttpRequest был доступен еще в версии Gecko 0.6, выпущенной 6 декабря 2000 года, но он не был полностью функциональным до версии 1.0 Gecko, выпущенной 5 июня 2002 года. Объект XMLHttpRequest стал де-факто стандартом . в других основных веб-клиентах, реализованных в Safari 1.2, выпущенном в феврале 2004 г., Konqueror, Opera 8.0, выпущенном в апреле 2005 г., и iCab 3.0b352 выпущен в сентябре 2005 года.

С появлением кроссбраузерных библиотек JavaScript, таких как jQuery, разработчики могут вызывать функциональность XMLHttpRequest косвенно.

Стандарты

Консорциум World Wide Web опубликовал рабочий проект спецификации для объекта XMLHttpRequest 5 апреля 2006 г., автор Энн ван Кестерен из Opera Software и Дин Джексон из W3C. Его цель - «документировать минимальный набор функционально совместимых функций на основе существующих реализаций, позволяющий веб-разработчикам использовать эти функции без кода, специфичного для платформы».

25 февраля 2008 года W3C также опубликовал еще один рабочий проект спецификации для объекта XMLHttpRequest, «XMLHttpRequest Level 2». Уровень 2 включает расширенные функциональные возможности объекта XMLHttpRequest, включая: но не ограничиваясь, событиями выполнения, поддержкой межсайтовых запросов и обработкой байтовых потоков. В конце 2011 года спецификация уровня 2 была оставлена ​​и поглощена исходной спецификацией.

В конце 2012 года WHATWG взяла на себя разработку и поддерживает уровень жизни, используя Интернет-IDL. Текущие проекты W3C основаны на снимках стандарта WHATWG.

HTTP-запрос

В следующих разделах показано, как запрос, использующий объект XMLHttpRequest, функционирует в соответствующем пользовательском агенте на основе рабочего проекта W3C. Поскольку стандарт W3C для объекта XMLHttpRequest все еще находится в стадии разработки, пользовательские агенты могут не соблюдать все функции определения W3C, и любое из следующего может быть изменено. При написании сценариев с объектом XMLHttpRequest для нескольких пользовательских агентов следует соблюдать крайнюю осторожность. В этой статье мы попытаемся перечислить несоответствия между основными пользовательскими агентами.

Открытый метод

Запросы HTTP и HTTPS объекта XMLHttpRequest должны быть инициализированы через open метод. Этот метод должен быть вызван до фактической отправки запроса для проверки и разрешения метода запроса, URL и URI информация пользователя, которая будет использоваться для запрос. Этот метод не гарантирует, что URL-адрес существует или информация о пользователе верна. Этот метод может принимать до пяти параметров , но требует только два для инициализации запроса.

open (Method, URL, Asynchronous, UserName, Password)

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

  • GET (поддерживается Internet Explorer 7 (и более поздние версии), Mozilla 1+ )
  • POST (поддерживается IE7 (и более поздними версиями), Mozilla 1 (и более поздними версиями))
  • HEAD (поддерживается IE7 (и более поздними версиями))
  • PUT
  • DELETE
  • OPTIONS (поддерживается IE7 (и более поздними версиями))

Однако методы запроса не ограничены перечисленными выше. В черновике W3C указано, что браузер может поддерживать дополнительные методы запроса по своему усмотрению.

Второй параметр метода - еще одна текстовая строка, указывающая на URL HTTP-запроса. W3C рекомендует, чтобы браузеры выдавали ошибку и не разрешали запрос URL с другим портом или ihost URI компонент из текущего документа.

Третий параметр, логическое значение, указывающее, или нет, запрос будет асинхронным, не является обязательным параметром в проекте W3C. Пользовательский агент, соответствующий W3C, должен принять значение этого параметра по умолчанию, если оно не предоставлено. Асинхронный запрос («истина») не будет ждать ответа сервера перед продолжением выполнения текущего скрипта. Вместо этого он вызовет прослушиватель событий onreadystatechange объекта XMLHttpRequest на различных этапах запроса. Однако синхронный запрос («ложь») будет блокировать выполнение текущего скрипта до тех пор, пока запрос не будет завершен, таким образом не вызывая прослушиватель событий onreadystatechange . Обратите внимание, что начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), Blink 39.0 (Chrome) и Edge 13, синхронные запросы в основном потоке устарели из-за их негативного влияния на взаимодействие с пользователем, поскольку они вызывают зависание пользовательского интерфейса, пока поток выполняет запрос.

Четвертый и пятый параметры - это имя пользователя и пароль соответственно. Эти параметры или просто имя пользователя могут быть предоставлены для аутентификации и авторизации, если сервер требует этого запроса.

var xmlhttp; если (window.XMLHttpRequest) {xmlhttp = новый XMLHttpRequest (); xmlhttp.open ("ПОЛУЧИТЬ", путь к файлу, ложь); xmlhttp.send (ноль); }

Метод setRequestHeader

После успешной инициализации запроса может быть вызван метод setRequestHeader объекта XMLHttpRequest для отправки заголовков HTTP с запросом.

setRequestHeader (Name, Value)

Первым параметром этого метода является имя текстовой строки заголовка. Второй параметр - это значение текстовой строки. Этот метод необходимо вызывать для каждого заголовка, который должен быть отправлен с запросом. Любые прикрепленные сюда заголовки будут удалены при следующем вызове метода open в пользовательском агенте, соответствующем W3C.

Метод отправки

Чтобы отправить HTTP-запрос, необходимо вызвать метод send XMLHttpRequest. Этот метод принимает один параметр, содержащий контент, который должен быть отправлен с запросом.

send (Data)

Этот параметр можно не указывать, если не нужно отправлять контент. В проекте W3C указано, что этот параметр может быть любого типа, доступного для языка сценариев, если он может быть преобразован в текстовую строку, за исключением объекта DOM document . Если пользовательский агент не может сериализовать параметр, его следует игнорировать. Однако Firefox 3.0.x и предыдущие версии выдают исключение, если sendвызывается без аргумента.

Если параметр является объектом документа DOM, пользовательский агент должен гарантировать, что документ повернут в правильно сформированный XML с использованием кодировки, указанной свойством inputEncoding объекта документа. Если заголовок запроса Content-Type еще не был добавлен через setRequestHeader, он должен автоматически добавляться соответствующим пользовательским агентом как «application / xml; charset = charset», где charset - это кодировка, используемая для кодирования документ.

Если пользовательский агент настроен на использование прокси-сервера, то объект XMLHttpRequest изменит запрос соответствующим образом, чтобы подключиться к прокси вместо исходного сервера, и отправить Заголовки Proxy-Authorizationкак настроены.

Приемник событий onreadystatechange

Если метод open объекта XMLHttpRequest был вызван с третьим параметром, установленным в true для асинхронного запроса, onreadystatechange прослушиватель событий будет автоматически вызываться для каждого из следующих действий, которые изменяют свойство readyState объекта XMLHttpRequest.

Изменения состояния работают следующим образом:

  • Описание состояния
0 Запрос не инициализирован. 1 Запрос был настроен. 2 Запрос отправлен. 3 Запрос обрабатывается. 4 Запрос выполнен.
  • После успешного вызова метода open свойству readyState объекта XMLHttpRequest должно быть присвоено значение 1 (OPENED).
  • После send был вызван и заголовки HTTP-ответа были получены, свойству readyState объекта XMLHttpRequest должно быть присвоено значение 2 (HEADERS_RECEIVED).
  • Как только содержимое ответа HTTP начинает загружаться, свойству readyState объекта XMLHttpRequest должно быть присвоено значение 3 (ЗАГРУЗКА).
  • После завершения загрузки содержимого ответа HTTP, readyState объекта XMLHttpRequest должно быть присвоено значение 4 (DONE).

Слушатель будет реагировать только на изменения состояния, которые происходят после того, как он определен. Для обнаружения состояний 1 и 2 слушатель должен быть определен до вызова метода open. Открытый метод должен быть вызван до вызова метода отправки.

var request = new XMLHttpRequest (); request.onreadystatechange = function () {var DONE = this.DONE || 4; если (this.readyState === ВЫПОЛНЕНО) {предупреждение (this.readyState); }}; request.open ('GET', 'somepage.xml', истина); request.setRequestHeader ('X-Requested-With', 'XMLHttpRequest'); // Сообщает серверу, что этот вызов сделан для целей ajax. // Большинство библиотек, таких как jQuery / Prototype / Dojo, делают это request.send (null); // Никакие данные не нужно отправлять вместе с запросом.

HTTP-ответ

После успешного и завершенного вызова метода send XMLHttpRequest, если ответ сервера был правильно сформированным XML и Content-Type заголовок, отправленный сервером, понимается пользовательским агентом как Интернет-тип мультимедиа для XML, свойство responseXML объекта XMLHttpRequest будет содержать DOM объект документа. Другое свойство, responseText, будет содержать ответ сервера в виде обычного текста от соответствующего пользовательского агента, независимо от того, воспринимался он как XML или нет.

Междоменные запросы

На раннем этапе развития Всемирной паутины было обнаружено, что можно нарушить безопасность пользователей с помощью JavaScript для обмена информацией с один веб-сайт с другим, менее уважаемым. Поэтому все современные браузеры реализуют политику одного и того же происхождения, которая предотвращает многие такие атаки, такие как межсайтовый скриптинг. Данные XMLHttpRequest подлежат этой политике безопасности, но иногда веб-разработчики хотят намеренно обойти ее ограничения. Иногда это происходит из-за законного использования субдоменов, например, создание XMLHttpRequest со страницы, созданной foo.example.comдля информации с bar.example.com, обычно потерпеть поражение.

Существуют различные альтернативы для обхода этой функции безопасности, в том числе использование JSONP, Cross-Origin Resource Sharing (CORS) или альтернатив с плагинами, такими как Flash или Silverlight. XMLHttpRequest с перекрестным происхождением указан в спецификации W3C XMLHttpRequest Level 2. Internet Explorer не реализовывал CORS до версии 10. Две предыдущие версии (8 и 9) предлагали аналогичные функции через API XDomainRequest (XDR). CORS теперь поддерживается всеми современными браузерами (настольными и мобильными).

Протокол CORS имеет несколько ограничений с двумя моделями поддержки. Простая модель не позволяет устанавливать собственные заголовки запросов и пропускает файлы cookie. Кроме того, поддерживаются только методы запроса HEAD, GET и POST , а POST допускает только следующие типы MIME : «text / plain», «application / x-www-urlencoded» и "multipart / form-data ". Изначально поддерживался только "текст / обычный". Другая модель определяет, когда запрашивается одна из непростых функций, и отправляет предполетный запрос на сервер для согласования функции.

Альтернатива выборки

Программный поток с использованием асинхронных обратных вызовов XHR может представлять трудности с удобочитаемостью и обслуживанием. В ECMAScript 2015 (ES6) добавлена ​​конструкция prom для упрощения асинхронной логики. С тех пор браузеры реализовали альтернативный интерфейс fetch ()для достижения той же функциональности, что и XHR, с использованием обещаний вместо обратных вызовов.

Выборка также стандартизирована WHATWG.

См. Также
Ссылки
Внешние ссылки
В Викиучебнике есть книга по теме: XMLHttpRequest
Последняя правка сделана 2021-06-22 06:40:20
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте