Введение

Web API для передачи данных между веб-браузером и веб-сервером.

XMLHttpRequest (XHR) — это API в виде объекта JavaScript, методы которого отправляют HTTP-запросы из веб-браузера на веб-сервер. Эти методы позволяют веб-приложению выполнять точечные запросы к серверу и сохранять результаты в атрибуте responseText объекта XMLHttpRequest. XMLHttpRequest является компонентом технологии Ajax. До появления Ajax основными механизмами взаимодействия с сервером были гиперссылки и отправка форм, которые часто приводили к полной перезагрузке страницы. Эта концепция впервые была реализована в браузере Internet Explorer 5 (2001). Однако в исходном синтаксисе не использовался идентификатор XMLHttpRequest. Вместо этого разработчики использовали идентификаторы ActiveXObject("Msxml2.XMLHTTP") и ActiveXObject("Microsoft.XMLHTTP"). Начиная с Internet Explorer 7 (2006), все браузеры поддерживают идентификатор XMLHttpRequest, а также Safari 1.2 (2004) и Opera 8.0 (2005).

Стандарты

Консорциум Всемирной паутины (W3C) опубликовал рабочий проект спецификации для объекта XMLHttpRequest 5 апреля 2006 года. 25 февраля 2008 года W3C опубликовал рабочий проект спецификации уровня 2. Уровень 2 добавил методы для отслеживания прогресса событий, разрешения межсайтовых запросов и обработки байтовых потоков. В конце 2011 года спецификация уровня 2 была включена в исходную спецификацию. В конце 2012 года WHATWG взял на себя дальнейшую разработку и поддерживает актуальный документ, используя Web IDL.

Запросы с разными доменами

В начале развития Всемирной паутины было обнаружено, что можно скомпрометировать безопасность пользователей, используя JavaScript для обмена информацией между веб-сайтами, в том числе с менее надежными ресурсами. Поэтому все современные браузеры реализуют политику одного источника (same origin policy), которая предотвращает многие подобные атаки, такие как межсайтовый скриптинг (cross-site scripting). Данные XMLHttpRequest подчиняются этой политике безопасности, но иногда веб-разработчикам необходимо намеренно обойти её ограничения. Это может быть обусловлено, например, законным использованием субдоменов: запрос XMLHttpRequest со страницы, созданной на foo.example.com, к ресурсу bar.example.com обычно будет отклонен. Существуют различные способы обхода этой функции безопасности, включая использование JSONP, механизма Cross-Origin Resource Sharing (CORS) или устаревших плагинов, таких как Flash или Silverlight. Cross-origin XMLHttpRequest специфицирован в спецификации XMLHttpRequest Level 2 от W3C. Internet Explorer не поддерживал CORS до версии 10. Две предыдущие версии (8 и 9) предлагали схожую функциональность через API XDomainRequest (XDR). CORS теперь поддерживается всеми современными браузерами (настольными и мобильными). Протокол CORS имеет ряд ограничений и две модели поддержки. В простой модели запрещено устанавливать пользовательские заголовки запросов и передавать cookies. Кроме того, поддерживаются только методы запросов HEAD, GET и POST, при этом POST допускает только следующие типы MIME: "text/plain", "application/x-www-form-urlencoded" и "multipart/form-data". Изначально поддерживался только "text/plain". Другая модель определяет, когда запрашивается одна из расширенных функций, и отправляет предварительный запрос (preflight request) на сервер для согласования её использования.

Достать альтернативный

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