Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

История [ править ]

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

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

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

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

Стандарты [ править ]

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

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

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

HTTP-запрос [ править ]

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

Открытым способом [ править ]

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

open (метод, URL, асинхронный, имя пользователя, пароль)

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

  • GET (поддерживается Internet Explorer 7 (и более поздними версиями ) , Mozilla 1+ )
  • POST (поддерживается IE7 (и новее), Mozilla 1 (и новее))
  • HEAD (поддерживается IE7 (и более поздними версиями))
  • СТАВИТЬ
  • УДАЛИТЬ
  • ОПЦИИ (поддерживается IE7 (и более поздними версиями))

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

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

Третий параметр, логическое значение, указывающее, будет ли запрос асинхронным, не является обязательным параметром в проекте 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 ;если  ( окно . XMLHttpRequest )  {  xmlhttp  =  новый  XMLHttpRequest ();  xmlhttp . open ( "ПОЛУЧИТЬ" ,  путь к файлу ,  ложь );  xmlhttp . отправить ( ноль ); }

SetRequestHeader метод [ править ]

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

setRequestHeader (имя, значение)

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

Посыла метод [ править ]

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

отправить (данные)

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

Если параметр является объектом документа 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 Запрос выполнен.
  • После того , как открыт метод был вызван успешно, то readyState свойство XMLHttpRequest объекта должно быть присвоено значение 1 (ОТКРЫТ).
  • После вызова метода send и получения заголовков HTTP-ответа свойству readyState объекта XMLHttpRequest должно быть присвоено значение 2 (HEADERS_RECEIVED).
  • Как только содержимое HTTP-ответа начинает загружаться, свойству readyState объекта XMLHttpRequest должно быть присвоено значение 3 (ЗАГРУЗКА).
  • После завершения загрузки содержимого HTTP-ответа свойству readyState объекта XMLHttpRequest должно быть присвоено значение 4 (DONE).

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

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

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. [23] Internet Explorer не реализовывал CORS до версии 10. Две предыдущие версии (8 и 9) предлагали аналогичные функции через API XDomainRequest (XDR). CORS теперь поддерживается всеми современными браузерами (настольными и мобильными). [24]

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

Получить альтернативу [ править ]

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

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

См. Также [ править ]

  • WebSocket
  • Передача репрезентативного состояния (REST)

Ссылки [ править ]

  1. ^ «Атрибут responseXML объекта XMLHttpRequest, описанный в рабочем проекте W3C» . W3.org . Проверено 14 июля 2009 .
  2. ^ "Тело объекта ответа XMLHttpRequest, проект редактора W3C" . W3.org. 2012-02-06 . Проверено 5 февраля 2012 .
  3. ^ «Атрибут responseText объекта XMLHttpRequest, описанный в рабочем проекте W3C» . W3.org . Проверено 14 июля 2009 .
  4. ^ a b «Статья по истории XMLHTTP от оригинального разработчика» . Alexhopmann.com. 2007-01-31. Архивировано из оригинала на 2009-01-30 . Проверено 14 июля 2009 .
  5. ^ «Спецификация интерфейса IXMLHTTPRequest из Microsoft Developer Network» . Msdn.microsoft.com . Проверено 14 июля 2009 .
  6. ^ a b c Дутта, Сунава (23 января 2006 г.). «Собственный объект XMLHTTPRequest» . IEBlog . Microsoft . Проверено 30 ноября 2006 .
  7. ^ «Справочник Ajax (объект XMLHttpRequest)» . Комплект JavaScript. 2008-07-22 . Проверено 14 июля 2009 .
  8. ^ «Спецификация интерфейса nsIXMLHttpRequest из Центра разработчиков Mozilla» . Developer.mozilla.org. 2008-05-16 . Проверено 14 июля 2009 .
  9. ^ «Спецификация интерфейса nsIJSXMLHttpRequest из Центра разработчиков Mozilla» . Developer.mozilla.org. 2009-05-03 . Проверено 14 июля 2009 .
  10. ^ «Спецификация объекта XMLHttpRequest из Центра разработчиков Mozilla» . Developer.mozilla.org. 2009-05-03 . Проверено 14 июля 2009 .
  11. ^ a b «История версий Mozilla Application Suite» . Mozilla.org . Проверено 14 июля 2009 .
  12. ^ a b «Загружаемые архивные версии для браузера Mozilla» . Archive.mozilla.org . Проверено 14 июля 2009 .
  13. ^ «Архивные новости от Mozillazine с указанием даты выпуска Safari 1.2» . Weblogs.mozillazine.org . Проверено 14 июля 2009 .
  14. ^ «Пресс-релиз с указанием даты выпуска Opera 8.0 с веб-сайта Opera» . Opera.com. 2005-04-19 . Проверено 14 июля 2009 .
  15. ^ Soft-Info.org. «Подробная информация о браузере с указанием даты выпуска iCab 3.0b352 от» . Soft-Info.com . Проверено 14 июля 2009 .
  16. ^ «Спецификация объекта XMLHttpRequest из рабочего проекта W3C уровня 1, выпущенного 5 апреля 2006 г.» . W3.org . Проверено 14 июля 2009 .
  17. ^ «Спецификация объекта XMLHttpRequest из рабочего проекта уровня 2 W3C, выпущенного 25 февраля 2008 г.» . W3.org . Проверено 14 июля 2009 .
  18. ^ «Проект редактора XMLHttpRequest от 5 декабря 2011 г.» . w3.org . Проверено 5 декабря 2011 года .
  19. ^ "Стандарт XMLHttpRequest" . xhr.spec.whatwg.org .
  20. ^ «Зависимости объекта XMLHttpRequest, объясненные в рабочем проекте W3C» . W3.org . Проверено 14 июля 2009 .
  21. ^ «Метод« open »объекта XMLHttpRequest, описанный в рабочем проекте W3C» . W3.org . Проверено 13 октября 2009 .
  22. ^ Разработка через тестирование JavaScript, Christian Johansen, ADDISON-WESLEY, 2010, p. 270
  23. ^ "XMLHttpRequest Level 2" . Проверено 14 ноября 2013 .
  24. ^ "Могу ли я использовать совместное использование ресурсов из разных источников?" . Проверено 14 ноября 2013 .
  25. ^ «XDomainRequest - Ограничения, ограничения и обходные пути» . Проверено 14 ноября 2013 .
  26. ^ «7.1.5 Запрос на кросс-источник с предполетной проверкой» . Проверено 25 апреля 2014 .
  27. ^ https://fetch.spec.whatwg.org/

Внешние ссылки [ править ]

  • XMLHttpRequest Уровень жизни от WHATWG
  • XMLHttpRequest Level 1 черновик W3C