XMLHttpRequest
HTTP |
---|
Методы запроса |
Поля заголовка |
Коды статуса ответа |
Методы безопасного контроля доступа |
Уязвимости безопасности |
XMLHttpRequest ( XHR ) — это API в форме JavaScript объекта которого , методы передают HTTP- запросы от веб-браузера к веб-серверу . [1] Эти методы позволяют браузерному приложению выполнять детальный вызов сервера и сохранять результаты в XMLHttpRequest. responseText
атрибут . [2] XMLHttpRequest — это компонент Ajax-программирования . До появления Ajax гиперссылки и отправка форм были основными механизмами взаимодействия с сервером, часто заменяя текущую страницу другой. [2]
История [ править ]
Концепция XMLHttpRequest была задумана в 2000 году разработчиками Microsoft Outlook . [3] Затем эта концепция была реализована в браузере Internet Explorer 5 (2001 г.). Однако исходный синтаксис не использовал XMLHttpRequest
идентификатор . Вместо этого разработчики использовали идентификаторы ActiveXObject("Msxml2.XMLHTTP")
и ActiveXObject("Microsoft.XMLHTTP")
. [4] Начиная с Internet Explorer 7 (2006 г.), все браузеры поддерживают XMLHttpRequest
идентификатор. [4]
The XMLHttpRequest
идентификатор теперь является де-факто стандартом во всех основных браузерах, включая Mozilla механизм компоновки Gecko (2002 г.), [5] Сафари 1.2 (2004 г.) и Опера 8.0 (2005 г.). [6]
Стандарты [ править ]
Консорциум Всемирной паутины (W3C) опубликовал рабочий проект спецификации объекта XMLHttpRequest 5 апреля 2006 года. [7] [а] 25 февраля 2008 г. W3C опубликовал рабочий проект спецификации уровня 2 . [8] На уровне 2 добавлены методы для отслеживания хода событий, разрешения межсайтовых запросов и обработки потоков байтов. В конце 2011 года спецификация уровня 2 была включена в исходную спецификацию. [9]
В конце 2012 года WHATWG взяла на себя разработку и поддерживает живой документ с помощью Web IDL . [10]
Использование [ править ]
Обычно отправка запроса с помощью XMLHttpRequest состоит из нескольких этапов программирования. [11]
- Создайте объект XMLHttpRequest, вызвав конструктор :
var request = new XMLHttpRequest();
- Вызовите метод «open», чтобы указать тип запроса, идентифицировать соответствующий ресурс и выбрать синхронную или асинхронную операцию:
request.open('GET', '/api/message', true /* asynchronous */);
- Установите прослушиватель событий, который будет уведомляться при изменении состояния запроса:
request.onreadystatechange = listener;
- Инициируйте запрос, вызвав метод send:
request.send();
- Реагировать на изменения состояния в прослушивателе событий. Если сервер отправляет данные ответа, по умолчанию они фиксируются в свойстве «responseText». Когда объект перестает обрабатывать ответ, он переходит в состояние 4, состояние «готово».
function listener() { // Check whether the request is done and successful. if (request.readyState == 4 && request.status == 200) console.log(request.responseText); // Display the text. }
Помимо этих общих шагов, XMLHttpRequest имеет множество опций для управления отправкой запроса и обработкой ответа. К запросу можно добавить пользовательские поля заголовка, чтобы указать, как сервер должен его выполнить. [12] и данные можно загрузить на сервер, предоставив их в вызове «отправить». [13] Ответ можно преобразовать из формата JSON в удобный для использования объект JavaScript или обрабатывать постепенно по мере его поступления, а не ждать всего текста. [14] Запрос может быть прерван преждевременно [15] или настроен на провал, если не завершен в течение определенного периода времени. [16]
Междоменные запросы [ править ]
На заре развития Всемирной паутины было обнаружено, что можно нарушить безопасность пользователей, используя JavaScript для обмена информацией с одного веб-сайта с другим, менее авторитетным. Поэтому все современные браузеры реализуют одну и ту же политику происхождения , которая предотвращает многие подобные атаки, такие как межсайтовый скриптинг . Данные XMLHttpRequest подпадают под действие этой политики безопасности, но иногда веб-разработчики хотят намеренно обойти ее ограничения. Иногда это происходит из-за законного использования поддоменов, например, при создании XMLHttpRequest со страницы, созданной foo.example.com
для получения информации от bar.example.com
обычно терпит неудачу.
Существуют различные альтернативы для обхода этой функции безопасности, в том числе использование JSONP , совместное использование ресурсов между источниками (CORS) или альтернативы с такими плагинами, как Flash или Silverlight (оба сейчас устарели). XMLHttpRequest из разных источников указан в спецификации W3C XMLHttpRequest Level 2. [17] Internet Explorer не реализовал CORS до версии 10. Две предыдущие версии (8 и 9) предлагали аналогичную функциональность через API XDomainRequest (XDR). CORS теперь поддерживается всеми современными браузерами (настольными и мобильными). [18]
Протокол CORS имеет несколько ограничений и две модели поддержки. Простая . модель не позволяет устанавливать собственные заголовки запросов и не использует cookie файлы HEAD, GET и POST только методы запроса Кроме того, поддерживаются , а POST допускает только следующие типы MIME : «text/plain», «application/x-www-urlencoded» и « multipart/form-data ». Изначально поддерживалось только «text/plain». [19] Другая модель определяет, когда одна из непростых запрашивается функций, и отправляет предполетный запрос. [20] на сервер для согласования этой функции.
Получить альтернативу [ править ]
Выполнение программы с использованием асинхронных обратных вызовов XHR может представлять трудности с читаемостью и обслуживанием. В ECMAScript 2015 (ES6) добавлена конструкция обещания для упрощения асинхронной логики. Браузеры с тех пор реализовали альтернативу fetch()
интерфейс для достижения той же функциональности, что и XHR, с использованием обещаний вместо обратных вызовов.
Fetch также стандартизирован WHATWG. [21]
Пример [ править ]
fetch('/api/message')
.then(response => {
if (response.status != 200) throw new Error('Request failed');
return response.text();
})
.then(text => {
console.log(text);
});
См. также [ править ]
Ссылки [ править ]
- ^ Махемофф, Майкл (2006). Шаблоны проектирования Ajax . О'Рейли. п. 92. ИСБН 978-0-596-10180-0 .
В Javascript отсутствует переносимый механизм для общего сетевого взаимодействия[.] ... Но благодаря объекту XMLHttpRequest... Код Javascript может выполнять HTTP-вызовы обратно на исходный сервер[.]
- ↑ Перейти обратно: Перейти обратно: а б Махемофф, Майкл (2006). Шаблоны проектирования Ajax . О'Рейли. п. 92. ИСБН 978-0-596-10180-0 .
- ^ «Статья по истории XMLHTTP от оригинального разработчика» . Alexhopmann.com. 31 января 2007 г. Архивировано из оригинала 30 января 2009 г. Проверено 14 июля 2009 г.
Реальность такова, что клиентская архитектура GMail, похоже, повторяет черновой дизайн реализации Outlook Web Access для IE5 и более поздних версий Exchange 2000, который появился еще в 2000 году.
- ↑ Перейти обратно: Перейти обратно: а б Махемофф, Майкл (2006). Шаблоны проектирования Ajax . О'Рейли. п. 93. ИСБН 978-0-596-10180-0 .
- ^ «Архив новостей от Mozillazine с указанием даты выпуска Safari 1.2» . Веблоги.mozillazine.org. Архивировано из оригинала 2 июня 2009 г. Проверено 14 июля 2009 г.
- ^ «Пресс-релиз с указанием даты выпуска Opera 8.0 на сайте Opera» . Opera.com. 19 апреля 2005 г. Проверено 14 июля 2009 г.
- ^ «Спецификация объекта XMLHttpRequest из рабочего проекта W3C уровня 1, выпущенного 5 апреля 2006 г.» . W3.org . Проверено 14 июля 2009 г.
- ^ «Спецификация объекта XMLHttpRequest из рабочего проекта W3C уровня 2, выпущенного 25 февраля 2008 г.» . W3.org . Проверено 14 июля 2009 г.
- ^ «Черновик редактора XMLHttpRequest от 5 декабря 2011 г.» . w3.org . Проверено 5 декабря 2011 г.
- ^ ван Кестерен, Энн (19 февраля 2024 г.). XMLHttpRequest Уровень жизни (отчет) . Проверено 9 апреля 2024 г.
- ^ Холденер, Энтони Т. III (2008). Аякс: Полное руководство . С. 70–71, 76.
- ^ ван Кестерен , 3.5.2.
- ^ ван Кестерен , 3.5.6.
- ^ ван Кестерен , 3.6.9.
- ^ ван Кестерен , 3.5.7.
- ^ ван Кестерен , 3.5.3.
- ^ «XMLHttpRequest Уровень 2» . Проверено 14 ноября 2013 г.
- ^ «Могу ли я использовать совместное использование ресурсов между источниками?» . Проверено 14 ноября 2013 г.
- ^ «XDomainRequest — ограничения, ограничения и обходные пути» . Проверено 14 ноября 2013 г.
- ^ «7.1.5 Запрос перекрестного происхождения с предполетной проверкой» . Проверено 25 апреля 2014 г.
- ^ «Выбрать стандарт» .
Примечания [ править ]
- ^ Стандарт редактировали из Энн ван Кестерен Opera Software и Дин Джексон из W3C.