Commit data error xmlhttp undefined что это

XMLHttpRequest помогите Отправляю вот такой ассинхронный запрос на сервер var login_vost2 = document.getElementById(‘inp10’).value; var question_vost2 = document.getElementById(‘select_vost_d’).value; var reply_vost2 = document.getElementById(‘inp11’).value; var xmlhttp; if ( window.XMLHttpRequest ) else < // Для старых браузеров IE6, IE5 xmlhttp = new ActiveXObject […]

Содержание

  1. XMLHttpRequest помогите
  2. XML HTTPRequest: описание, применение, частые проблемы
  3. Объект XMLHttpRequest
  4. Кроссбраузерное создание объекта запроса
  5. Использование XMLHTTPRequest
  6. Синхронный XMLHttpRequest
  7. Асинхронный XMLHttpRequest
  8. Не используйте синхронные запросы
  9. Методы объекта XMLHttpRequest
  10. abort()
  11. setRequestHeader(name, value)
  12. getAllResponseHeaders()
  13. getResponseHeader(headerName)
  14. Свойства объекта XMLHttpRequest
  15. onreadystatechange
  16. readyState
  17. responseText
  18. responseXML
  19. status
  20. statusText
  21. GET и POST-запросы. Кодировка.
  22. Запрос Xmlhttp вызывает ошибку отказа в доступе
  23. 9 ответов
  24. Объект XMLHttpRequest
  25. Кроссбраузерное создание объекта запроса
  26. Использование XMLHTTPRequest
  27. Синхронный XMLHttpRequest
  28. Асинхронный XMLHttpRequest
  29. Не используйте синхронные запросы
  30. Методы объекта XMLHttpRequest
  31. abort()
  32. setRequestHeader(name, value)
  33. getAllResponseHeaders()
  34. getResponseHeader(headerName)
  35. Свойства объекта XMLHttpRequest
  36. onreadystatechange
  37. readyState
  38. responseText
  39. responseXML
  40. status
  41. statusText
  42. GET и POST-запросы. Кодировка.
  43. Запросы multipart/form-data
  44. Кодировка (языковая)
  45. Частые проблемы
  46. Кеширование
  47. Разбор примера работы с кешем
  48. Повторное использование объекта XmlHttpRequest
  49. Повторный XmlHttp-запрос после abort() зависает
  50. XmlHttpRequest виснет в IE7 (много табов)
  51. Утечки памяти
  52. Firefox ставит responseXML вида
  53. Ограничения безопасности. Кросс-доменный XMLHttpRequest

XMLHttpRequest помогите

Отправляю вот такой ассинхронный запрос на сервер

var login_vost2 = document.getElementById(‘inp10’).value;
var question_vost2 = document.getElementById(‘select_vost_d’).value;
var reply_vost2 = document.getElementById(‘inp11’).value;

var xmlhttp;
if ( window.XMLHttpRequest ) <
// Для современных браузеров IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
> else <
// Для старых браузеров IE6, IE5
xmlhttp = new ActiveXObject ( «Microsoft.XMLHTTP» );
>

xmlhttp.open ( «POST», «reg_ajax.php», true );
xmlhttp.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);
xmlhttp.setRequestHeader(‘Connection’, ‘close’);
xmlhttp.send («login_vost2=»+login_vost2+»&question_vost2=»+question_vost2+»&reply_vost2=»+reply_vost2);

Если запрос отправляет на сервер цифры или латинские буквы, то сервер видит эти переменные, в вот если русские буквы, то не видит. На сервере я кодировку полученных переменных меняю при помощи фунции iconv(); Это JS код глючит, что не так?

Когд не глючит. Глючит программист. 🙂 Вы посмотрите сами на то, что написали.. .

С одной стороны, Вы пишете:

То есть содержимое запроса якобы идет urlencoded.

С другой стороны, у Вас нигде нет url-кодирования. Данные из формы вставляются в запрос как есть, «сырыми». Для цифр и латинских букв это не имеет значения (символы из первой половины таблицы ASCII при url-кодировании не меняются) , а вот для русских букв это важно.

Читайте документацию по функциям JavaScript escape, encodeURI и encodeURIComponent.

Ну и над кодировками помедитируйте.. . XMLHttpRequest по умолчанию предполагает, что имеет дело с UTF-8. Если у Вас другая кодировка, могут понадобится некоторые действия, чтобы уведомить об этом сервер.. .

Кроме того, в запросе не помешал бы заголовок «Content-Length:».

Источник

XML HTTPRequest: описание, применение, частые проблемы

Здесь Вы найдете полное описание объекта XMLHTTPRequest, способы использования, форматы данных и разбор частых проблем.

Объект XMLHttpRequest

Объект XMLHttpRequest (или, сокращенно, XHR) дает возможность браузеру делать HTTP-запросы к серверу без перезагрузки страницы.

Несмотря на слово XML в названии, XMLHttpRequest может работать с данными в любом текстовом формате, и даже c бинарными данными. Использовать его очень просто.

Кроссбраузерное создание объекта запроса

В зависимости от браузера, код для создания объекта может быть разный.
Кроссбраузерная функция создания XMLHttpRequest:

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

Использование XMLHTTPRequest

Различают два использования XmlHttpRequest. Первое — самое простое, синхронное.

Синхронный XMLHttpRequest

В этом примере через XMLHTTPRequest с сервера запрашивается страница http://example.org/, и текст ответа сервера показывается через alert().

Здесь сначала создается запрос, задается открытие (open) синхронного соединение с адресом /xhr/test.html и запрос отсылается с null,
т.е без данных.

При синхронном запросе браузер «подвисает» и ждет на строчке 3, пока сервер не ответит на запрос. Когда ответ получен — выполняется строка 4, код ответа сравнивается с 200 (ОК), и при помощи alert
печатается текст ответа сервера. Все максимально просто.

Свойство responseText получит такой же текст страницы, как браузер, если бы Вы в перешли на /xhr/test.html. Для сервера
GET-запрос через XmlHttpRequest ничем не отличается от обычного перехода на страницу.

Асинхронный XMLHttpRequest

Этот пример делает то же самое, но асинхронно, т.е браузер не ждет выполнения запроса для продолжения скрипта. Вместо этого к свойству onreadystatechange подвешивается
функция, которую запрос вызовет сам, когда получит ответ с сервера.

Асинхронность включается третьим параметром функции open. В отличие от синхронного запроса, функция send() не останавливает
выполнение скрипта, а просто отправляет запрос.

Запрос xmlhttp регулярно отчитывается о своем состоянии через вызов функции xmlhttp.onreadystatechange. Состояние под номером 4 означает конец выполнения, поэтому функция-обработчик
при каждом вызове проверяет — не настало ли это состояние.

Вообще, список состояний readyState такой:

Состояния 0-2 вообще не используются.

Вызов функции с состоянием Interactive в теории должен происходить каждый раз при получении очередной порции данных от сервера.
Это могло бы быть удобным для обработки ответа по частям, но Internet Explorer не дает доступа к уже полученной части ответа.

Firefox дает такой доступ, но для обработки запроса по частям состояние Interactive все равно неудобно из-за сложностей обнаружения ошибок соединения.
Поэтому Interactive тоже не используется.

На практике используется только последнее, Complete.

Если хотите углубиться в тонкости багов браузеров c readyState, отличными от 4, то многие из них рассмотрены в статье на
Quirksmode (англ.) .

Не используйте синхронные запросы

Синхронные запросы применяются только в крайнем случае, когда кровь из носу необходимо дождаться ответа сервера до продолжения скрипта. В 999 случаях из 1000
можно использовать асинхронные запросы. При этом общий алгоритм такой:

  1. Делаем асинхронный запрос
  2. Рисуем анимированную картинку или просто запись типа «Loading…»
  3. В onreadystatechange при достижении состояния 4 убираем Loading и, в зависимости от status вызываем обработку ответа или ошибки.

Кроме того, иногда полезно ставить ограничение на время запроса. Например, хочется генерировать ошибку, если запрос висит более 10 секунд.

Для этого сразу после send() через setTimeout ставится вызов обработчика ошибки, который очищается при получении ответа и обрывает запрос с генерацией ошибки,
если истекли 10 секунд.

Таймаут на синхронный запрос ставить нельзя, браузер может висеть долго-долго.. А вот на асинхронный — пожалуйста.

Этот пример демонстрирует такой таймаут.

Методы объекта XMLHttpRequest

  • open( method, URL )
  • open( method, URL, async )
  • open( method, URL, async, userName )
  • open( method, URL, async, userName, password )

Первый параметр method — HTTP-метод. Как правило, используется GET либо POST, хотя доступны и более экзотические, вроде TRACE/DELETE/PUT и т.п.

URL — адрес запроса. Можно использовать не только HTTP/HTTPS, но и другие протоколы, например FTP и FILE://. При этом есть ограничения безопасности, так называемая
«same origin policy»: запрос со страницы можно отправлять только на тот домен и порт, с которого она пришла.

Ниже это ограничение и способы обхода будут рассмотрены подробнее.

async = true задает асинхронные запросы, эта тема была поднята выше.

userName, password — данные для HTTP-авторизации.

Отсылает запрос. Аргумент — тело запроса. Например, GET-запроса тела нет, поэтому используется send(null) , а для POST-запросов тело содержит параметры запроса.

abort()

Вызов этого метода xmlhttp.abort() обрывает текущий запрос.

Здесь есть одно НО для браузера Internet Explorer. Успешный вызов abort() на самом деле может не обрывать соединение,
а оставлять его в подвешенном состоянии на некоторый таймаут (20-30 секунд). Отловить такие повисшие соединения можно через прокси для отладки, например, Fiddler.

У браузера есть лимит: не более 2 одновременных соединений с одним доменом-портом. Т.е, если два соединения уже висят (и отвиснут по таймауту), то третье открыто не
будет, пока одно из них не умрет. Надеюсь, Вы с такой проблемой не столкнетесь. Ее можно обойти использованием кросс-доменных XmlHttpRequest.

Устанавливает заголовок name запроса со значением value. Если заголовок с таким name уже есть — он заменяется.

Возвращает строку со всеми HTTP-заголовками ответа сервера.

Возвращает значение заголовка ответа сервера с именем headerName.

Свойства объекта XMLHttpRequest

onreadystatechange

Ссылается на функцию-обработчик состояний запроса. В некоторых браузерах функция имеет аргумент — событие. Не используйте его, он совершенно лишний.

readyState

Номер состояния запроса от 0 до 4. Используйте только 4 («completed»).

responseText

Текст ответа сервера. Полный текст есть только при readyState=4, ряд браузеров дают доступ к полученной части ответа сервера при readyState=3.

responseXML

Ответ сервера в виде XML, при readyState=4.

Это свойство хранит объект типа XML document, с которым можно обращаться так же, как с обычным document. Например,

Чтобы браузер распарсил ответ сервера в свойство responseXML, в ответе должен быть заголовок Content-Type: text/xml.

Иначе свойство responseXML будет равно null.

status

Для HTTP-запросов — статусный код ответа сервера: 200 — OK, 404 — Not Found, и т.п. Браузер Internet Explorer может также присвоить status код ошибки WinInet,
например 12029 для ошибки «cannot connect».

Запросы по протоколам FTP, FILE:// не возвращают статуса, поэтому нормальным для них является status=0.

statusText

Текстовая расшифровка status, например «Not Found» или «OK».

GET и POST-запросы. Кодировка.

Во время обычного submit’а формы браузер сам кодирует значения полей и составляет тело GET/POST-запроса для посылки на сервер. При работе через XmlHttpRequest, это нужно делать самим, в javascript-коде. Большинство проблем и вопросов здесь связано с непониманием, где и какое кодирование нужно осуществлять.

Вначале рассмотрим общее кодирование запросов, ниже — правильную работу с русским языком для windows-1251.

Существуют два вида кодирования HTTP-запроса. Основной — urlencoded, он же — стандартное кодирование URL. Пробел представляется как %20, русские буквы и большинство спецсимволов кодируются, английские буквы и дефис оставляются как есть.

Способ, которым следует кодировать данные формы при submit’е, задается в ее HTML-таге:

Источник

Запрос Xmlhttp вызывает ошибку отказа в доступе

Следующий макрос Excel, который отправляет xmlhttp-запрос на эту веб-страницу для получения некоторых значений на втором этапе, некоторое время назад нормально работал в VBA:

Теперь вместо этого при вызове метода:

Объекта msxml2.xmlhttp вызывает следующую ошибку:

Я искал в Интернете, но все подобные темы никогда не отвечали. Может ли кто-нибудь объяснить мне, что означает эта ошибка, и есть ли способ ее исправить или даже просто обойти?

Примечание: случайная строка в конце переменной «Ссылка» была добавлена ​​для принудительной перезагрузки страницы, поскольку скрипт извлекает значения в реальном времени и поэтому должен загружаться каждый раз.

Дополнительная информация: при поиске решения я заметил, что случайная часть ссылки всегда дает одно и то же значение, даже когда я завершаю выполнение и снова перезапускаю:

Почему это происходит? Разве rnd() не должно давать новое случайное значение от 0 до 1 при каждом вызове?

9 ответов

Стандартный запрос, запускаемый с локального компьютера, запрещает доступ к сайтам, которым не доверяет IE. MSXML2.ServerXMLHTTP.6.0 – это серверный объект, который не выполняет эти проверки.

Я обнаружил, что в моем случае изменение http на https устранило проблему отказа в доступе. я могу только предположить, что веб-сайт каким-то образом внес изменения и никому не сказал

Источник

Объект XMLHttpRequest

Объект XMLHttpRequest (или, сокращенно, XHR) дает возможность браузеру делать HTTP-запросы к серверу без перезагрузки страницы.

Несмотря на слово XML в названии, XMLHttpRequest может работать с данными в любом текстовом формате, и даже c бинарными данными. Использовать его очень просто.

Кроссбраузерное создание объекта запроса

В зависимости от браузера, код для создания объекта может быть разный.
Кроссбраузерная функция создания XMLHttpRequest:

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

Использование XMLHTTPRequest

Различают два использования XmlHttpRequest. Первое — самое простое, синхронное.

Синхронный XMLHttpRequest

В этом примере через XMLHTTPRequest с сервера запрашивается страница http://example.org/, и текст ответа сервера показывается через alert().

Здесь сначала создается запрос, задается открытие (open) синхронного соединение с адресом /xhr/test.html и запрос отсылается с null, т.е без данных: send(null).

При синхронном запросе браузер «подвисает» и ждет на строчке 3, пока сервер не ответит на запрос. Когда ответ получен — выполняется строка 4, код ответа сравнивается с 200 (ОК), и при помощи alert печатается текст ответа сервера. Все максимально просто.

Свойство responseText получит такой же текст страницы, как браузер, если бы Вы в перешли на /xhr/test.html. Для сервера GET-запрос через XmlHttpRequest ничем не отличается от обычного перехода на страницу.

Асинхронный XMLHttpRequest

Этот пример делает то же самое, но асинхронно, т.е браузер не ждет выполнения запроса для продолжения скрипта. Вместо этого к свойству onreadystatechange подвешивается функция, которую запрос вызовет сам, когда получит ответ с сервера.

Асинхронность включается третьим параметром функции open. В отличие от синхронного запроса, функция send() не останавливает выполнение скрипта, а просто отправляет запрос.

Запрос xmlhttp регулярно отчитывается о своем состоянии через вызов функции xmlhttp.onreadystatechange. Состояние под номером 4 означает конец выполнения, поэтому функция-обработчик при каждом вызове проверяет — не настало ли это состояние.

Вообще, список состояний readyState такой:

  • 0 — Unitialized (Неинициализировано)
  • 1 — Loading (Загрузка)
  • 2 — Loaded (Загружено)
  • 3 — Interactive (Интерактивное)
  • 4 — Complete (Выполнено)

Состояния 0-2 вообще не используются.

Вызов функции с состоянием Interactive в теории должен происходить каждый раз при получении очередной порции данных от сервера. Это могло бы быть удобным для обработки ответа по частям, но Internet Explorer не дает доступа к уже полученной части ответа.
Firefox дает такой доступ, но для обработки запроса по частям состояние Interactive все равно неудобно из-за сложностей обнаружения ошибок соединения. Поэтому Interactive тоже не используется.

На практике используется только последнее, Complete.

Если хотите углубиться в тонкости багов браузеров c readyState, отличными от 4, то многие из них рассмотрены в статье на Quirksmode (англ.).

Не используйте синхронные запросы

Синхронные запросы применяются только в крайнем случае, когда кровь из носу необходимо дождаться ответа сервера до продолжения скрипта. В 999 случаях из 1000 можно использовать асинхронные запросы. При этом общий алгоритм такой:

  1. Делаем асинхронный запрос
  2. Рисуем анимированную картинку или просто запись типа «Loading. «
  3. В onreadystatechange при достижении состояния 4 убираем Loading и, в зависимости от status вызываем обработку ответа или ошибки.

Кроме того, иногда полезно ставить ограничение на время запроса. Например, хочется генерировать ошибку, если запрос висит более 10 секунд.

Для этого сразу после send() через setTimeout ставится вызов обработчика ошибки, который очищается при получении ответа и обрывает запрос с генерацией ошибки, если истекли 10 секунд.

Таймаут на синхронный запрос ставить нельзя, браузер может висеть долго-долго.. А вот на асинхронный — пожалуйста.

Этот пример демонстрирует такой таймаут.

Методы объекта XMLHttpRequest

  • open( method, URL )
  • open( method, URL, async )
  • open( method, URL, async, userName )
  • open( method, URL, async, userName, password )

Первый параметр method — HTTP-метод. Как правило, используется GET либо POST, хотя доступны и более экзотические, вроде TRACE/DELETE/PUT и т.п.

URL — адрес запроса. Можно использовать не только HTTP/HTTPS, но и другие протоколы, например FTP и FILE://. При этом есть ограничения безопасности, так называемая «same origin policy»: запрос со страницы можно отправлять только на тот домен и порт, с которого она пришла.

Ниже это ограничение и способы обхода будут рассмотрены подробнее.

async = true задает асинхронные запросы, эта тема была поднята выше.

userName, password — данные для HTTP-авторизации.

Отсылает запрос. Аргумент — тело запроса. Например, GET-запроса тела нет, поэтому используется send(null) , а для POST-запросов тело содержит параметры запроса.

abort()

Вызов этого метода xmlhttp.abort() обрывает текущий запрос.

Здесь есть одно НО для браузера Internet Explorer. Успешный вызов abort() на самом деле может не обрывать соединение, а оставлять его в подвешенном состоянии на некоторый таймаут (20-30 секунд). Отловить такие повисшие соединения можно через прокси для отладки, например, Fiddler.

У браузера есть лимит: не более 2 одновременных соединений с одним доменом-портом. Т.е, если два соединения уже висят (и отвиснут по таймауту), то третье открыто не будет, пока одно из них не умрет. Надеюсь, Вы с такой проблемой не столкнетесь. Ее можно обойти использованием кросс-доменных XmlHttpRequest.

Устанавливает заголовок name запроса со значением value. Если заголовок с таким name уже есть — он заменяется. Например,

Возвращает строку со всеми HTTP-заголовками ответа сервера.

Возвращает значение заголовка ответа сервера с именем headerName.

Свойства объекта XMLHttpRequest

onreadystatechange

Ссылается на функцию-обработчик состояний запроса. В некоторых браузерах функция имеет аргумент — событие. Не используйте его, он совершенно лишний.

readyState

Номер состояния запроса от 0 до 4. Используйте только 4 («completed»).

responseText

Текст ответа сервера. Полный текст есть только при readyState=4, ряд браузеров дают доступ к полученной части ответа сервера при readyState=3.

responseXML

Ответ сервера в виде XML, при readyState=4.

Это свойство хранит объект типа XML document, с которым можно обращаться так же, как с обычным document. Например,

Чтобы браузер распарсил ответ сервера в свойство responseXML, в ответе должен быть заголовок Content-Type: text/xml.
Иначе свойство responseXML будет равно null.

status

Для HTTP-запросов — статусный код ответа сервера: 200 — OK, 404 — Not Found, и т.п. Браузер Internet Explorer может также присвоить status код ошибки WinInet, например 12029 для ошибки «cannot connect».

Запросы по протоколам FTP, FILE:// не возвращают статуса, поэтому нормальным для них является status=0.

statusText

Текстовая расшифровка status, например «Not Found» или «OK».

GET и POST-запросы. Кодировка.

Во время обычного submit’а формы браузер сам кодирует значения полей и составляет тело GET/POST-запроса для посылки на сервер. При работе через XmlHttpRequest, это нужно делать самим, в javascript-коде. Большинство проблем и вопросов здесь связано с непониманием, где и какое кодирование нужно осуществлять.

Вначале рассмотрим общее кодирование запросов, ниже — правильную работу с русским языком для windows-1251.

Существуют два вида кодирования HTTP-запроса. Основной — urlencoded, он же — стандартное кодирование URL. Пробел представляется как %20, русские буквы и большинство спецсимволов кодируются, английские буквы и дефис оставляются как есть.

Способ, которым следует кодировать данные формы при submit’е, задается в ее HTML-таге:

Если форма submit’ится обычным образом, то браузер сам кодирует (urlencode) название и значение каждого поля данных ( input и т.п.) и отсылает форму на сервер в закодированном виде.

Формируя XmlHttpRequest, мы должны формировать запрос «руками», кодируя поля функцией encodeURIComponent .

Конечно, пропускать через encodeURIComponent стоит только те переменные, в которых могут быть спецсимволы или не английские буквы, т.е которые и будут как раз закодированы.

Например, для посылки GET-запроса с произвольными параметрами name и surname, их необходимо закодировать вот так:

В методе POST параметры передаются не в URL, а в теле, посылаемом через send() . Поэтому params нужно указывать не в адресе, а при вызове send()

Кроме того, при POST обязателен заголовок Content-Type, содержащий кодировку. Это указание для сервера — как обрабатывать (раскодировать) пришедший запрос.

Заголовки Content-Length, Connection в POST-запросах, хотя их и содержат некоторые «руководства», обычно не нужны. Используйте их, только если Вы действительно знаете, что делаете.

Запросы multipart/form-data

Второй способ кодирования — это отсутствие кодирования. Например, кодировать не нужно для пересылки файлов. Он указывается в форме (только для POST) так:

В этом случае при отправке данных на сервер ничего не кодируется. А сервер, со своей стороны, посмотрев на Content-Type(=multipart/form-data), поймет, что пришло.

Возможности XmlHttpRequest позволяют создать запрос с любым телом. Например, можно вручную сделать POST-запрос, загружающий на сервер файл. Функционал создания таких запросов есть, в частности, во фреймворке dojo. Но можно реализовать его и самому, прочитав о нужном формате тела POST и заголовках.

Кодировка (языковая)

Если Вы используете только UTF-8 — пропустите эту секцию.

Все идущие на сервер параметры GET/POST, кроме случая multipart/form-data, кодируются в UTF-8. Не в кодировке страницы, а именно в UTF-8. Поэтому, например, в PHP их нужно при необходимости перекодировать функцией iconv.

С другой стороны, ответ с сервера браузер воспринимает именно в той кодировке, которая указана в заголовке ответа Content-Type. Т.е, опять же, в PHP, чтобы браузер воспринял ответ в windows-1251 и нормально отобразил данные на странице в windows-1251, нужно послать заголовок с кодировкой в php-коде, например так:

Или же, такой заголовок должен добавить сервер. Например, в apache автоматически добавляется кодировка опцией:

Частые проблемы

Кеширование

Многие браузеры поддерживают кеширование ответов на XmlHttpRequest запросы. При этом реализации кеширования немного разные.

Например, при повторном XmlHttpRequest на тот же URL, Firefox посылает запрос с заголовком «If-Modified-Since» со значением, указанным в заголовке «Last-Modified» предыдущего ответа.

А Internet Explorer делает так, только когда кешированный ответ устарел, т.е после времени из заголовка «Expires» предыдущего ответа. Поэтому, кстати, многие думают, что Internet Explorer вообще не очищает кеш ответов.

Самое простое решение проблемы — просто убрать кеширование. Например, при помощи заголовков, или добавлением случайного параметра в URL типа:

Есть, однако, ряд случаев, когда кеширование XMLHttpRequest браузером полезно, улучшает время ответа и экономит трафик, просто нужно уметь его использовать.

Пример демонстрирует универсальный код работы с кешем для Internet Explorer и Firefox. Этот пример обеспечивает посылку «If-Modified-Sinse»-заголовка IE при обращениях к закешированному запросу.

Разбор примера работы с кешем

Внешний тест (1) опирается на то, что в Internet Explorer, если запрос возвращается из кеша без перепроверки, заголовок Date — пустая строка. Поэтому при этом нужно сделать дополнительный запрос, который как раз и будет реальным запросом к серверу.

Когда делаем дополнительный запрос, что ссылку на кешированый запрос сохраняем, т.к если код ответа дополнительного запроса — «304 Not Modified», то его тело будет пустой строкой, и нужно будет вернуться к кешированному объекту.

Для оптимизации, можно не создавать новый объект XmlHttpRequest, а сохранить данные из существующего и использовать заново его же.

Пример выше опирается на то, что сервер всегда выдает заголовок «Date», что верно для большинства конфигураций. В нем делается синхронный запрос. В асинхронном случае, проверку на Date и т.д нужно делать после получения ответа в функции-обработчике onreadystate.

Повторное использование объекта XmlHttpRequest

В Internet Explorer, если open() вызван после установки onreadystatechange, может быть проблема с повторным использованием этого XmlHttpRequest.

Чтобы использовать заново XmlHttpRequest, сначала вызывайте метод open(), а затем — присваивайте onreadystatechange. Это нужно из-за того, что IE самостоятельно очищает объект XmlHttpRequest в методе open(), если его статус «completed».

Вызывать abort() для перенаправления запроса на другой URL не нужно, даже если текущий запрос еще не завершился.

Повторный XmlHttp-запрос после abort() зависает

С этой проблемой я сталкивался только в IE под Windows. Ее причины — в том, что abort() не обрывает TCP-соединение, а оставляет его висеть до наступления таймаута (см. метод abort()). Если же к домену есть два TCP-соединения (даже ждущие таймаута), то третье будет висеть, пока какое-то из них не помрет.

XmlHttpRequest виснет в IE7 (много табов)

Проблема иногда возникает при отладке приложений с длинными XmlHttpRequest, которые висят и ждут события с сервера.

Она связана с ограничением в 2 одновременных соединения к одному домену. Точнее, с тем фактом, что это ограничение в IE7 действует не на один таб, а на все . Так что, если есть два таба с непрерывным соединением, то при открытии третьего таба — XmlHttpRequest с него к тому же домену просто зависнет и будет ждать окончания одного из двух предыдущих запросов.

Утечки памяти

В Internet Explorer объект XmlHttpRequest принадлежит миру DOM/COM, а Javascript-функция — миру Javascript. Присваивание xmlhttp.onreadystatechange = function() < . >задает неявную круговую связь: xmlhttp ссылается на функцию через onreadystatechange, а функция, через свою область видимости — видит (ссылается на) xmlhttp.

Невозможность обнаружить и оборвать такую связь во многих (до IE 6,7 редакции июня 2007?) версиях Internet Explorer приводит к тому, что XmlHttpRequest вместе с ответом сервера, функция-обработчик и всё замыкание прочно оседают в памяти до перезагрузки браузера.

Чтобы этого избежать, ряд фреймворков (YUI, dojo. ) вообще не ставят onreadystatechange, а вместо этого через setTimeout проверяют его readyState каждые 10 миллисекунд. Это разрывает круговую связку xmlhttp onreadystatechange, и утечка памяти не грозит даже в самых глючных браузерах.

Firefox ставит responseXML вида

Да, у браузеров типа Mozilla это такой способ сказать, что документ невалидный.

Ограничения безопасности. Кросс-доменный XMLHttpRequest

Для ограничения XmlHttpRequest используется философия «Same Origin Policy». Она очень проста — каждый сайт в своей песочнице. Запрос можно делать только на адреса с тем же протоколом, доменом, портом, что и текущая страница.

Т.е, со страницы на адресе http://site.com нельзя сделать XmlHttpRequest на адрес https://site.com, http://site.com:81 или http://othersite.com

Это создает проблему, если хочется взять контент с другого сайта. Как правило, в этом случае вместо XmlHttpRequest используются другие средства, например, загрузка через динамически создаваемый тег

Источник

amaryllis

0 / 0 / 0

Регистрация: 01.10.2014

Сообщений: 35

1

23.06.2015, 10:41. Показов 1457. Ответов 12

Метки нет (Все метки)


Добрый день!
Такая ситуация: уже довольно долгое время ежедневно скачиваю с сайта санкт-петербургской биржи отчеты (списки индексов и бюллетени с итогами торгов). Все загружалось вполне успешно, а вчера внезапно совсем перестало работать (код прилагаю). Собственно, перестали загружаться файлы, когда я пытаюсь вбить адрес в браузер вручную, файл загружается мигом, а через функцию для скачивания не работает. Стопорится на месте

PureBasic
1
2
3
    
XMLHTTP.send
 If XMLHTTP.statustext = "OK" Then

, т.к. запрос возвращает статус Unknown. Собственно, вопрос, почему так стало происходить и как исправить проблему? Данные очень нужны.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' загрузка индексов
 
        Dim VladIndexes, StockIndexes, OTCIndexes, PathVladIndexes, PathStockIndexes, PathOTCIndexes, CurrentFilePath As String
 
       <...>
 
        ' файл с владимирскими индексами и путь для сохранения
        VladIndexes = "http://spimex.com/indexes/service_functions.php?request=csv&index=spi"
        PathVladIndexes = "<...>indexesVladIndexes.csv"
        
        ' файл с биржевыми индексами  и путь для сохранения
        StockIndexes = "http://spimex.com/indexes/service_functions.php?request=csv&index=eri"
        PathStockIndexes = "<...>indexesStockIndexes.csv"
        
        'файл с внебиржевыми индексами  и путь для сохранения
        OTCIndexes = "http://spimex.com/indexes/service_functions.php?request=csv&index=ori"
        PathOTCIndexes = "<...>NNK_BaseAUXindexesOTCIndexes.csv"
          
        ' запуск функции скачивания файлов
        M_MAIN_FUNCTIONS.DownloadFile VladIndexes, PathVladIndexes
        M_MAIN_FUNCTIONS.DownloadFile StockIndexes, PathStockIndexes
        M_MAIN_FUNCTIONS.DownloadFile OTCIndexes, PathOTCIndexes
   
 <...>

PureBasic
1
2
3
4
5
6
7
8
9
' загрузка бюллетеней
 
' генерация имени файла бюллетеня на дату sDate
 FileNameDownload = "http://spimex.com/upload/reports/oil_xls/oil_xls_" & Format(sDate, "yyyy") & Format(sDate, "mm") & Format(sDate, "dd") & "162000.xls"
 
' путь для сохранения
FilePathSave = "<..>Биржаoil_xls_" & Format(sDate, "yyyy") & Format(sDate, "mm") & Format(sDate, "dd") & "162000.xls"
                
Call M_MAIN_FUNCTIONS.DownloadFile(FileNameDownload, FilePathSave)

Функцию, каюсь, подсмотрела у кого-то в сети.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Function DownloadFile(ByVal URL$, ByVal LocalPath$) As Boolean
 
   Dim XMLHTTP, ADOStream
    On Error Resume Next: Kill LocalPath$
 
    Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
    XMLHTTP.Open "GET", Replace(URL$, "", "/"), "False"
    XMLHTTP.send
    If XMLHTTP.statustext = "OK" Then
        Set ADOStream = CreateObject("ADODB.Stream")
        ADOStream.Type = 1: ADOStream.Open
        ADOStream.Write XMLHTTP.responseBody
 
        ADOStream.SaveToFile LocalPath$, 2
        ADOStream.Close: Set ADOStream = Nothing
        DownloadFile = True
    Else
 
   End If
    Set XMLHTTP = Nothing
End Function

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

23.06.2015, 10:41

12

Эксперт NIX

2658 / 777 / 173

Регистрация: 14.01.2013

Сообщений: 3,585

24.06.2015, 22:37

2

Попробуйте другую функцию. На форуме, в расширенном поиске вбейте фразу «скачать файл» и выберите раздел VBA. Там масса примеров.



0



2 / 2 / 2

Регистрация: 27.06.2015

Сообщений: 38

28.06.2015, 19:24

3

Все не так просто — плюнуть в XMLHTTP сцылкой. Так все бы делали. Рекомендую взять нормальную качалку (IDM) и генерить для нее список.



0



Эксперт NIX

2658 / 777 / 173

Регистрация: 14.01.2013

Сообщений: 3,585

29.06.2015, 08:33

4

Цитата
Сообщение от MinaAM
Посмотреть сообщение

Рекомендую взять нормальную качалку (IDM) и генерить для нее список.

Можно консолный wget заюзать. Будет дёшево и сердито



0



2 / 2 / 2

Регистрация: 27.06.2015

Сообщений: 38

29.06.2015, 08:38

5

Ну, смысл, чтобы качалка работала с подсовываемыми ей списками.
Я wget руками не трогал, но то, что он консольный — есно удобнее прям из кода запускать.



0



Эксперт NIX

2658 / 777 / 173

Регистрация: 14.01.2013

Сообщений: 3,585

29.06.2015, 10:31

6

Цитата
Сообщение от MinaAM
Посмотреть сообщение

Я wget руками не трогал, но то, что он консольный — есно удобнее прям из кода запускать.

Даже больше скажу, в поставленной задаче можно ексель не трогать, вообще. Батником всё решить. Ну и с батником рядом положить wget с причиндалами.



0



2 / 2 / 2

Регистрация: 27.06.2015

Сообщений: 38

29.06.2015, 10:41

7

Kubuntovod, не, я, конечно, согласен, что батники — наше все :)

Только, примерно представляя идеологическое наполнение задачи, думаю, что лучше все таки иметь некий гуи (пусть Ексель), позволяющий естественным путем выбирать объекты для закачки.



0



Эксперт NIX

2658 / 777 / 173

Регистрация: 14.01.2013

Сообщений: 3,585

29.06.2015, 10:44

8

MinaAM, а мне представляется, что на этапе закачки гуй не нужен. Особливо, если вся эта затея привязывается к текущей дате. А потом можно и ексель запущать



0



2 / 2 / 2

Регистрация: 27.06.2015

Сообщений: 38

29.06.2015, 10:59

9

Kubuntovod, на этапе закачки — есно, нет. А вот после — снова понадобится :) Что ж, так его и тыркать туда-сюда?

У меня примерно такя же беда в аксе реализована. Иногда не все документы нужны, некоторые нужны не на каждую предоставляемую дату, а, к примеру, отчет выходящий только по средам. Ну и пр..

У меня на XMLHTTP реализовано, но сикось-накось. А ты, случаем, не знаешь какой нибудь библиотеки для закачки, которую можно было бы под VBA использовать?
.



0



Эксперт NIX

2658 / 777 / 173

Регистрация: 14.01.2013

Сообщений: 3,585

29.06.2015, 11:06

10

Цитата
Сообщение от MinaAM
Посмотреть сообщение

А ты, случаем, не знаешь какой нибудь библиотеки для закачки, которую можно было бы под VBA использовать?

Так wget, чем не библа? Генерим ему файло со ссылками и вперёд. Или требуется интерактив? Статус закачек и т.д.?



0



2 / 2 / 2

Регистрация: 27.06.2015

Сообщений: 38

29.06.2015, 11:18

11

Kubuntovod,
У меня в закачке стоят достаточно объемные файлы — до сотен МБ. Я через XMLHTTP пытаюсь (когда ресурс позволяет это) по заголовкам сервера и датам создания выяснить — изменился ли файл и только тогда его качать. Ну и разные там прочию, только мне нужные плюшки. Но для меня — XMLHTTP — уж слишком низкого уровня интерфейс. Мне что-нибудь бы попроще…

А wget я посмотрю более внимательно. Снкс.
.



0



Эксперт NIX

2658 / 777 / 173

Регистрация: 14.01.2013

Сообщений: 3,585

29.06.2015, 11:23

12

Цитата
Сообщение от MinaAM
Посмотреть сообщение

У меня в закачке стоят достаточно объемные файлы — до сотен МБ

Это wget-у не помеха. У него и докачка есть.

Цитата
Сообщение от MinaAM
Посмотреть сообщение

Я через XMLHTTP пытаюсь (когда ресурс позволяет это) по заголовкам сервера и датам создания выяснить — изменился ли файл и только тогда его качать.

«wget —spider ссылка» не будет качать, а выдаст только инфу про файло.

Есть ещё один, не менее замечательный, инструмент. Curl. Вроде, должен пыть под винду. Он, вообще, умеет выхватывать только нужный кусок из файла по ссылке. На тот случай, если инфы от wget-а не хватит.



1



2 / 2 / 2

Регистрация: 27.06.2015

Сообщений: 38

29.06.2015, 12:52

13

Цитата
Сообщение от Kubuntovod
Посмотреть сообщение

Это wget-у не помеха. У него и докачка есть.

Меня не объем смущает, и не разрывы связи — их достаточно часто (20 мин) приходится полуподпольно мониторить — разработчик втихую модифицирует без анонсов. Напрягает скачивать, снимать хэш, сравнивать — надо комп выделять под эту задачу :)

Цитата
Сообщение от Kubuntovod
Посмотреть сообщение

«wget —spider ссылка» не будет качать, а выдаст только инфу про файло.

Отлично! Спасибо за подсказку. Попробую плюс поставить, если силы хватит :)

Цитата
Сообщение от Kubuntovod
Посмотреть сообщение

Есть ещё один, не менее замечательный, инструмент. Curl.

Я знаю. Порылся в нем — с разбегу не вскочить. Оставил до лучших времен.



0



I am new to javascript and especially to ajax..And just trying to figure it out..

i wrote this code from one tutorial and can’t find what i did wrong. Here you can see it live

The error i am getting from Firebug: «TypeError: xmlhttp is undefined
[Break On This Error]

if (xmlhttp.readyState == 4){«

my code is

// JavaScript Document

var xmlhttp;
var url;

function ajaxFunction(){

if  (window.ActiveXObject){//if the window is InternetExplorer

    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

    }else if(window.XMLHttpRequest){// if Window is Firefox etc..

        xmmlhttp= new XMLHttpRequest();

        }else{

            alert ("Get a New Browser")

            }

}//end of ajaxFunction()


function getInfo(){

    ajaxFunction();

    var entryInfo= document.getElementById("entry").value;

            function stateChanged(){
                if (xmlhttp.readyState == 4){

                    document.getElementById("results").innerHTML = xmlhttp.responseText;

                    }//if (xmlhttp.readyState == 4)

                }//end of function stateChanged()


url = "info.php?user="+entryInfo;
xmlhttp.onreadystateshange=stateChanged();
xmlhttp.open("GET",url,true);
xmlhttp.send(null);


    }// end of function getInfo

asked Nov 27, 2012 at 13:56

Alex's user avatar

1

You have a typo here:

   xmmlhttp= new XMLHttpRequest();
     ^

Change to

 xmlhttp= new XMLHttpRequest();

Also as Michael pointed out, you have parenthesis when assigning your onreadystatechange function:

xmlhttp.onreadystateshange=stateChanged();
                                       ^ remove the ()

If you don’t remove the parenthesis, the stateChange() function will be called, and the return value will be given to xmlhttp.onreadystateshange which you don’t want.

answered Nov 27, 2012 at 13:58

MrCode's user avatar

MrCodeMrCode

62.9k10 gold badges90 silver badges111 bronze badges

0

there is a mistype in property name:
xmlhttp.onreadystateshange=stateChanged;

It has to be 'onreadystatechange'.

Vader's user avatar

Vader

6,0328 gold badges31 silver badges43 bronze badges

answered Feb 7, 2014 at 15:35

IgorKul's user avatar

XMLHttpRequest (XMLHTTP, XHR) — API, доступное в скриптовых языках браузеров, таких как JavaScript. Использует запросы HTTP или HTTPS напрямую к веб-серверу и загружает данные ответа сервера напрямую в вызывающий скрипт.[1] Информация может передаваться в любом текстовом формате, например, в XML, HTML или JSON. Позволяет осуществлять HTTP-запросы к серверу без перезагрузки страницы.

XMLHTTP является важной составляющей технологии AJAX (Asynchronous JavaScript And XML), используется многими сайтами для создания динамичных, быстро реагирующих на запросы пользователя приложений. Например XMLHTTP используется такими сайтами, как Bing Maps, Gmail, Google Maps, Google Suggest, Facebook.

XMLHTTP работает только с файлами, находящимися на том же домене, что и использующая XMLHTTP страница, но существует возможность обойти ограничение. Как и в случае JavaScript, это сделано в целях безопасности (cross-site scripting).

Хотя в названии присутствует аббревиатура XML, технология не накладывает ограничений на формат передаваемых данных. Данные можно пересылать как в виде XML, так и в JSON, HTML или просто неструктурированным текстом. Разработчик может самостоятельно создать формат для передачи данных. Однако нужно учитывать, что при пересылке используется текстовый протокол HTTP и потому при использовании метода GET данные должны передаваться в виде текста (то есть бинарные данные следует кодировать, к примеру в base64). При использовании метода POST в кодировании нет необходимости.

История[]

Впервые был разработан компанией Microsoft, появившись в компоненте Outlook Web Access программного продукта Microsoft Exchange Server 2000. Он был назван IXMLHTTPRequest. Позднее, наработки были включены в состав MSXML 2.0 в виде объекта ActiveX, доступного через JScript, VBScript или другие скриптовые языки, поддерживающиеся браузером. MSXML 2.0 был включён в состав браузера Internet Explorer 5.

Программисты проекта Mozilla затем разработали совместимую версию, называющуюся nsIXMLHttpRequest в Mozilla 0.6. Доступ к компоненту был реализован через JavaScript-объект, названный XMLHttpRequest. Однако, полной функциональности удалось добиться только в Mozilla 1.0. В дальнейшем поддержка XMLHttpRequest появилась в браузерах Safari 1.2, Opera 8.01 и в других.

Последняя официальная спецификация — версия 1.0 (XMLHttpRequest от 19 декабря 2012 года), которая имеет статус текущего стандарта (Living Standard) и версия 2.0 (XMLHttpRequest Level 2 от 17 января 2012 года), имеющая статус рабочего варианта. Во второй версии вводятся обработчики событий прогресса, поддержка кросс-доменных запросов и работа с бинарными данными.[2]

 

 

Метод Описание
abort() Отменяет текущий запрос, удаляет все заголовки, ставит текст ответа сервера в null.
getAllResponseHeaders() Возвращает полный список HTTP-заголовков в виде строки. Заголовки разделяются знаками переноса (CR+LF).
Если флаг ошибки равен true, возвращает пустую строку.
Если статус 0 или 1, вызывает ошибку INVALID_STATE_ERR.
getResponseHeader(headerName) Возвращает значение указанного заголовка.
Если флаг ошибки равен true, возвращает null.
Если заголовок не найден, возвращает null.
Если статус 0 или 1, вызывает ошибку INVALID_STATE_ERR.
open(method, URL, async, userName, password) Определяет метод, URL и другие опциональные параметры запроса;
параметр async определяет, происходит ли работа в асинхронном режиме.
Последние два параметра необязательны.
send(content) Отправляет запрос на сервер.
setRequestHeader(label, value) Добавляет HTTP-заголовок к запросу.
overrideMimeType(mimeType) Позволяет указать mime-type документа, если сервер его не передал или передал неправильно.
Внимание: метод отсутствует в Internet Explorer!

Свойства класса XMLHttpRequest[]

 

 

Свойство Тип Описание
onreadystatechange EventListener Обработчик события, которое происходит при каждой смене состояния объекта. Имя должно быть записано в нижнем регистре.
readyState unsigned short Текущее состояние объекта (0 — не инициализирован, 1 — открыт, 2 — отправка данных, 3 — получение данных и 4 — данные загружены)
responseText DOMString Текст ответа на запрос.
Если состояние не 3 или 4, возвращает пустую строку.
responseXML Document Текст ответа на запрос в виде XML, который затем может быть обработан посредством DOM.
Если состояние не 4, возвращает null.
status unsigned short HTTP-статус в виде числа (404 — «Not Found», 200 — «OK» и т. д.)
statusText DOMString Статус в виде строки («Not Found», «OK» и т. д.).
Если статус не распознан, браузер пользователя должен вызвать ошибку INVALID_STATE_ERR.

Ошибки, вызываемые классом XMLHttpRequest[]

 

 

Название Код Описание
SECURITY_ERR 18 Вызывается при попытке совершить запрос, запрещённый настройками безопасности в браузере пользователя.
NETWORK_ERR 101 Вызывается при ошибке сети (во время синхронного запроса).
ABORT_ERR 102 Вызывается при прерывании пользователем запроса (во время синхронного запроса).

Пример использования[]

План работы с объектом XMLHttpRequest можно представить следующим образом:

  1. Создание экземпляра объекта XMLHttpRequest
  2. Открытие соединения
  3. Установка обработчика события (нужно делать после открытия и до отправки в IE)
  4. Отправка запроса.

Создание экземпляра объекта XMLHttpRequest.
На этой стадии необходима отдельная реализация для разных браузеров. Конструкция создания объекта отличается: в IE 5 — IE 6 она реализована через ActiveXObject, а в остальных браузерах (IE 7 и выше, Mozilla, Opera, Chrome, Netscape и Safari) — как встроенный объект типа XMLHttpRequest.

Вызов для ранних версий Internet Explorer выглядит так[3]:

var req = new ActiveXObject("Microsoft.XMLHTTP");

В остальных браузерах:

var req = new XMLHttpRequest();

То есть, для обеспечения кросс-браузерности кода, нужно лишь проверять наличие объектов window.XMLHttpRequest и window.ActiveXObject, и, в зависимости от того, какой есть, тот и применять.

В качестве универсального решения предлагается использование такой функции:

function createRequestObject() {
  if (typeof XMLHttpRequest === 'undefined') {
    XMLHttpRequest = function() {
      try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
        catch(e) {}
      try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
        catch(e) {}
      try { return new ActiveXObject("Msxml2.XMLHTTP"); }
        catch(e) {}
      try { return new ActiveXObject("Microsoft.XMLHTTP"); }
        catch(e) {}
      throw new Error("This browser does not support XMLHttpRequest.");
    };
  }
  return new XMLHttpRequest();
}

Установка обработчика событий, открытие соединения и отправка запросов

Эти вызовы выглядят так:

req.open(<"GET"|"POST"|...>, <url>[, <asyncFlag>[, <user>, <password>]]);
req.onreadystatechange = processReqChange;

Где:

  • <«GET»|«POST»|…> — метод запроса. Допускаются: DELETE, GET, HEAD, OPTIONS, POST, PUT.
  • <url> — адрес запроса.
  • <asyncFlag> — флаг, определяющий, использовать ли асинхронный запрос. По умолчанию, установлен в true.
  • <user>, <password> — логин и пароль, соответственно. Указываются при необходимости.

После определения всех параметров запроса его остается только отправить. Делается это методом send(). При отправке GET-запроса для версии без ActiveX необходимо указать параметр null, в остальных случаях можно не указывать никаких параметров. Не будет ошибкой, если для GET всегда будет указан параметр null:

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

var req;

function loadXMLDoc(url)
{
    req = null;
    if (window.XMLHttpRequest) {
        try {
            req = new XMLHttpRequest();
        } catch (e){}
    } else if (window.ActiveXObject) {
        try {
            req = new ActiveXObject('Msxml2.XMLHTTP');
        } catch (e){
            try {
                req = new ActiveXObject('Microsoft.XMLHTTP');
            } catch (e){}
        }
    }

    if (req) {       
        req.open("GET", url, true);
        req.onreadystatechange = processReqChange;
        req.send(null);
    }
}

function processReqChange()
{
  try { // Важно!
    // только при состоянии "complete"
    if (req.readyState == 4) {
        // для статуса "OK"
        if (req.status == 200) {
            // обработка ответа
        } else {
            alert("Не удалось получить данные:n" +
                req.statusText);
        }
    }
  }
  catch( e ) {
      // alert('Ошибка: ' + e.description);
      // В связи с багом XMLHttpRequest в Firefox приходится отлавливать ошибку
      // Bugzilla Bug 238559 XMLHttpRequest needs a way to report networking errors
      // https://bugzilla.mozilla.org/show_bug.cgi?id=238559
  }
}

Известные проблемы[]

Шаблон:В планах

См. также[]

  • AJAX
  • HTTP
  • REST

Ссылки[]

  1. XMLHttpRequest object explained by the W3C Working Draft. W3.org. Проверено 14 июля 2009. Архивировано из первоисточника 5 февраля 2012.
  2. Новые возможности XMLHttpRequest2
  3. Native XMLHTTPRequest object

История[]

  • История XMLHTTP глазами одного из разработчиков Шаблон:Ref-en

Реализация в браузерах[]

  • Apple Safari и KDE Konqueror
  • Microsoft IXMLHTTPRequest
  • Mozilla nsIXMLHttpRequest
  • Mozilla XMLHttpRequest object HowTo
  • Mozilla XML Extras
  • Opera для компьютеров и для мобильных телефонов

Учебные руководства[]

  • XMLHTTPRequest: описание, применение, частые проблемы
  • Сверхдинамичные веб-интерфейсы

Стандарты[]

  • Создана рабочая группа по стандартизации XMLHTTPRequest во всех браузерах

Литература[]

  • Шаблон:±. AJAX в действии: технология — Asynchronous JavaScript and XML = Ajax in Action. — Шаблон:Указание места в библиоссылке: «Вильямс», 2006. — С. 640. — ISBN 1-932394-61-3.
  • Шаблон:±. AJAX и PHP: разработка динамических веб-приложений. — Шаблон:Указание места в библиоссылке: Символ Плюс, 2006. — С. 336. — ISBN 5-93286-077-4.

Шаблон:Microsoft APIs
Шаблон:Стандарты W3C
Шаблон:Windows API

Я пытаюсь получить содержимое HTTP-документа с помощью MS XMLHTTP COM. Я скопировал следующий пример кода, но даже это не работает и не работает с ошибка EOLEException «Доступ запрещен» при вызове метода отправки.

uses
  MSXML, ComObj, ActiveX;

procedure TForm1.Button1Click(Sender: TObject);
var
  httpDoc: XMLHTTP;  // IXMLHTTPRequest
begin
    httpDoc := CreateOleObject('MSXML2.XMLHTTP') as XMLHTTP;
  try
    httpDoc.open('GET', 'http://www.google.com/index.html', False, EmptyParam, EmptyParam);
    httpDoc.send('');  // <-- EOLEException 'Access is denied'
    if (httpDoc.readyState = 4) and (httpDoc.status = 200) then
      ShowMessage(httpDoc.responseText);
  finally
    httpDoc := nil;
  end;
end;

Я действительно не знаю, что я делаю не так :(

1 ответов


Google выполняет перенаправление на основе местоположения, а иногда и перенаправление на другой домен. XMLHTTP не нравится. Кроме того, кажется XMLHTTP не разрешает доступ к удаленным серверам при запуске из локального скрипта (например, из VB, Delphi и т. д.) вне браузера. См.эта дискуссия, эта дискуссия и документация.


Полезная информация

№101-09-2009 23:40:26

Ispanec
Участник
 
Группа: Members
Зарегистрирован: 01-09-2009
Сообщений: 4
UA: Firefox 3.5

XMLHttpRequest и веб сервис проблема!!!

Здравстуйте несколько дней не могу решить проблему.
Есть веб сервис метод которого я хочу вызвать из  сайта. Вот код.
function GetValue()
    {
        req = new XMLHttpRequest();
        req.onprogress = onProgress;
        req.open(«POST»,»http://kiparis.crimea.ua:81/ws/testKiparis.1cws»,false);
        req.setRequestHeader(«Content-Type», «text/xml»);

                var str = ‘<?xml version=»1.0″ encoding=»UTF-8″?>’ +
        ‘<soap:Envelope xmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/»> <soap:Header/>’ +
        ‘<soap:Body> <m:Get xmlns:m=»http://www.service-kiparis.feo»/> </soap:Body>’ +
        ‘</soap:Envelope>’;

        req.send(str);
        alert(req.responseText);
    }

Если исопльзую Internet Explorer 7 то всё прекрасно работает и возвращаются данные, если жи Fire Fox 3.5 то в firebug отслеживаю следующую ошибку uncaught exception: [Exception… «Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]» nsresult: «0x80004005 (NS_ERROR_FAILURE)» location: «JS frame :: file:///C:/Documents%20and%20Settings/Admin/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/%D1%81%D0%B0%D0%B9%D1%82/wer.html :: GetValue :: line 48» data: no] помогите опжалуйста разобраться! я уже использовал и JQuery и разные другие инстументы в IE7 всё нормально в FF3.5 и Opera  проблемы, не знаю что делать!

Отсутствует

№201-09-2009 23:48:19

Lynn
Кофеман
 
Группа: Members
Откуда: Россия
Зарегистрирован: 16-02-2005
Сообщений: 1721
UA: Shiretoko 3.5
Веб-сайт

Re: XMLHttpRequest и веб сервис проблема!!!

https://developer.mozilla.org/En/Same_origin_policy_for_JavaScript


Isn’t it ironic… don’t you think? — Alanis Morissette

Отсутствует

№303-09-2009 11:15:02

formatC’vt
Участник
 
Группа: Members
Откуда: М.О., г. Ивантеевка
Зарегистрирован: 09-01-2005
Сообщений: 94
UA: Firefox 3.5
Веб-сайт

Re: XMLHttpRequest и веб сервис проблема!!!

Не хватает прав для вызова функции (это ведь файл с диска, а не установленное расширение). Добавьте в код:

К сожалению Вы не привели код функции onProgress, по этому приведу свой пример.

результат выполнения этого запроса у меня получился следующий:


«Software is like SEX — it’s better when it’s FREE» (C) Linus Torvalds

Отсутствует

№404-09-2009 09:29:47

Ispanec
Участник
 
Группа: Members
Зарегистрирован: 01-09-2009
Сообщений: 4
UA: IE 7.0

Re: XMLHttpRequest и веб сервис проблема!!!

Большое спасибо вам!!!!!!!!!!!!! уже неделю не знал что сделать

Добавлено 04-09-2009 09:34:44

formatC’vt пишет

Не хватает прав для вызова функции (это ведь файл с диска, а не установленное расширение). Добавьте в код:

К сожалению Вы не привели код функции onProgress, по этому приведу свой пример.

результат выполнения этого запроса у меня получился следующий:

вы случайно не знаете как добавить такую возможность и в Opera потому что там похожая проблема??

Добавлено 04-09-2009 09:50:02

Ispanec пишет

Большое спасибо вам!!!!!!!!!!!!! уже неделю не знал что сделать

Добавлено 04-09-2009 09:34:44

formatC’vt пишет

Не хватает прав для вызова функции (это ведь файл с диска, а не установленное расширение). Добавьте в код:

К сожалению Вы не привели код функции onProgress, по этому приведу свой пример.

результат выполнения этого запроса у меня получился следующий:

вы случайно не знаете как добавить такую возможность и в Opera потому что там похожая проблема??

или где можно почитать про это мне надо чтобы вызовы веб — севисвсов происходили в любом браузере по крайней мере во многих. Пока только IE и FF

Отсутствует

№524-08-2011 10:49:15

aikin
Участник
 
Группа: Members
Зарегистрирован: 24-08-2011
Сообщений: 3
UA: Firefox 6.0

Re: XMLHttpRequest и веб сервис проблема!!!

Уважаемые специалисты помоги пожалуйста голова уже кругом

в IE6 все без проблем
в FF 6.0   ничего не получается

в FF status=0, responseText=»», responseXML=null
в чем проблема никак не могу понять, так нет бы нигде не работала так работает же в IE
ну или хотябы responseText возвращала уже потом парсить нет нив какую, прошу помощи

может быть это где то какието разрешения необходимо устанавливать, почему FF не видит ответа от сервера а IE видит

Отредактировано aikin (24-08-2011 11:14:56)

Отсутствует

№624-08-2011 11:56:23

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 7.0

Re: XMLHttpRequest и веб сервис проблема!!!

aikin
Проверьте свой код на синхронном вызове. Хотя бы для того, чтобы убедиться, что FF не считает ваш запрос кросс-доменным (которые запрещены для untrusted callers, коими являются скрипты веб-страниц).

Отсутствует

№724-08-2011 12:06:48

aikin
Участник
 
Группа: Members
Зарегистрирован: 24-08-2011
Сообщений: 3
UA: Firefox 6.0

Re: XMLHttpRequest и веб сервис проблема!!!

hydrolizer
сделал синхронным, на send вообще скидывает сабака  Error(req.send)  Component returned failure code: 0Х80004005 (NS_ERROR_FAILURE)
а можно ли как то это обойти, всмысле запрет на кросс-доменные запросы?

причем в IE и синхронно работает ну что за…

если я правильно понял то ограничение на кросс-доменность распространяется на весь метод XMLHttpRequest вне зависимости от броузера, если в ие отрабатывает наверно не считает крос доменным

Отредактировано aikin (24-08-2011 12:26:45)

Отсутствует

№824-08-2011 13:26:43

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 7.0

Re: XMLHttpRequest и веб сервис проблема!!!

aikin
Думаю, домен, к которому идет обращение (localhost) находится в trusted zone IE (что, в общем-то, неудивительно) — поэтому запрос в IE проходит. Как быть в данном случае с FF — см. в этой теме выше про UniversalXPConnect UniversalBrowserAccess.

Отсутствует

№924-08-2011 13:56:51

aikin
Участник
 
Группа: Members
Зарегистрирован: 24-08-2011
Сообщений: 3
UA: Firefox 6.0

Re: XMLHttpRequest и веб сервис проблема!!!

hydrolizer пишет

UniversalXPConnect UniversalBrowserAccess

так я и нашел боле мене подходящую веточку форума, и эту штуку пробовал в коде она комментирована после того как не дала результатов кроме дополнительных вопросов при выполнении кода (разрешить изменение привилегии) такая же ошибка

Отсутствует

XMLHttpRequest это API, который предоставляет клиенту функциональность для обмена данными между клиентом и сервером. Данный API предоставляет простой способ получения данных по ссылке без перезагрузки страницы. Это позволяет обновлять только часть веб-страницы не прерывая пользователя. XMLHttpRequest используется в AJAX запросах и особенно в single-page приложениях.

XMLHttpRequest изначально был разработан Microsoft и позже заимствован Mozilla, Apple, и Google. Сейчас он стандартизирован WHATWG. Несмотря на своё название, XMLHttpRequest может быть использован для получения любых типов данных, не только XML, и поддерживает протоколы помимо HTTP (включая file и ftp).

Чтобы начать работать с XMLHttpRequest, выполните этот код:

var myRequest = new XMLHttpRequest();

более детальное описание создание объекта, можно увидеть в разделе Using XMLHttpRequest.

Список методов объекта

XMLHttpRequest(JSObject objParameters);
void abort();
DOMString getAllResponseHeaders();
DOMString? getResponseHeader(DOMString header);
void open(DOMString method, DOMString url, optional boolean async, optional DOMString? user, optional DOMString? password);
void overrideMimeType(DOMString mime);
void send(); void send(ArrayBufferView data); void send(Blob data); void send(Document data); void send(DOMString? data); void send(FormData data);
void setRequestHeader(DOMString header, DOMString value);
Нестандартные методы
[noscript] void init(in nsIPrincipal principal, in nsIScriptContext scriptContext, in nsPIDOMWindow ownerWindow);
[noscript] void openRequest(in AUTF8String method, in AUTF8String url, in boolean async, in AString user, in AString password);
void sendAsBinary(in DOMString body); Устарело

Поля объекта

Attribute Type Description

onreadystatechange

Function?

Callback — функция, которая вызывается всякий раз, когда поле
readyState меняет своё значение. Callback выполняется в
потоке работы приложения.

Внимание: Он не должен использоваться в синхронных
запросах, и не должен выполняться из нативного кода (? must not be
used from native code).

readyState unsigned short

Состояние запроса:

Значение Состояние Описание
0 UNSENT Клиент создан. Метод open() ещё не вызван.
1 OPENED Вызван метод open(). В этом состоянии можно
добавить заголовки через метод setRequestHeader();
вызов метода send() отправит запрос.
2 HEADERS_RECEIVED Вызван метод send(), получены заголовки и код
ответа (200, 404, 501 и проч.).
3 LOADING Загрузка; если значение responseType равно «text»
или пустой строке, то responseText содержит
частичные данные.
4 DONE Операция завершена. Все данные получены.
response varies

Тело сущности запроса. Согласно полю
responseType, может быть
ArrayBuffer, Blob, Document, JavaScript объектом (для «json»),
или строкой. Равно null если запрос не завершён или
окончен с ошибкой.

responseText Только для чтения DOMString Ответ на запрос в виде строки или null в случае если запрос
не успешен или ответ ещё не получен.
responseType XMLHttpRequestResponseType

Может использоваться для определения типа ответа.

Value Data type of response property
"" (пустая строка) String (строка, дефолтное значение)
"arraybuffer" ArrayBuffer
"blob" Blob
"document" Document
"json" JavaScript объект, полученный путём парсинга JSON строки,
полученной с сервера.
"text" String (строка)
"moz-blob" Firefox — велосипед, который позволяет работать с
частично-полученными данными Blob при
помощи событий прогресса (progressing events). Эта штука
позволяет работать с ответом от сервера, до того как он получен
полностью.
"moz-chunked-text"

Похоже на поле "text", но только находится в
потоке(streaming). Это значит, что значение доступно только в
промежуток времени между событиями прогресса ("progress"
event), и содержит данные которые пришли из последнего события
прогресса.

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

Работает только в Firefox.

"moz-chunked-arraybuffer"

Похоже на поле "arraybuffer", но только находится
в потоке(streaming). Это значит, что значение доступно только
в промежуток времени между событиями прогресса ("progress"
event), и содержит данные которые пришли из последнего события
прогресса.

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

Работает только в Firefox.

Note: Starting with Gecko 11.0
(Firefox 11.0 / Thunderbird 11.0 / SeaMonkey 2.8), as well as WebKit build 528,
these browsers no longer let you use the
responseType attribute when performing synchronous
requests. Attempting to do so throws an
NS_ERROR_DOM_INVALID_ACCESS_ERR exception. This change
has been proposed to the W3C for standardization.

responseXML Только для чтения Document?

Ответ является объектом DOM
Document, или
null в случае если запрос окончился ошибкой, или ответ не получен
полностью, или если ответ невозможно распарсить как
XML или HTML. Ответ парсится как если бы это был
text/xml stream. Когда значение
responseType равно "document" и запрос
выполнен асинхронно, ответ парсится как text/html stream.

Примечание: Если сервер не работает с заголовком (не
присылает в ответе) «Content-type: text/xml", то можно
использовать метод
overrideMimeType() для того чтобы парсить получаемый ответ как XML.

status Только для чтения unsigned short Статус ответа на запрос. Равен кодам HTTP (200 — успешно, 404 не
найдено, 301 — перенесено навсегда).
statusText Только для чтения DOMString Строка статуса ответа. В отличи от поля status, эта строка
включает в себя текст — («200 OK«, например).
timeout unsigned long

Время в миллисекундах, после которого запрос будет отменён. Значение 0
(по умолчанию) значит что таймаута не будет. Никогда.

Примечание: Вы можете не использовать поле timeout
для синхронных запросов из owning window.

ontimeout Function

Колбэк-функция которая будет вызвана в случае таймаута.

upload XMLHttpRequestUpload Загрузка (upload process) может отслеживаться обработчиком события.
withCredentials boolean

Определяет что cross-site запрос, согласно
Access-Control должен использовать авторизацию (креды для
логина и пароля) через куки, или заголовок с авторизационными данными.
По умолчанию false.

Примечание: Не влияет на same-site запросы.

Примечание: Начиная с Gecko 11.0
(Firefox 11.0 / Thunderbird 11.0 / SeaMonkey 2.8), Gecko больше не позволяет
использовать поле withCredentials при выполнении
синхронных запросов. Попытка выполнить это выбрасывает
NS_ERROR_DOM_INVALID_ACCESS_ERR исключение.

Нестандартные свойства

Attribute Type Description
channel Только для чтения nsIChannel The channel used by the object when performing the request. This is
null if the channel hasn’t been created yet. In the case of
a multi-part request, this is the initial channel, not the different
parts in the multi-part request.
Requires elevated privileges to access.
mozAnon Только для чтения boolean

Если значение равно true, запрос отправляется без куки и заголовков
авторизации.

mozSystem Только для чтения boolean

Если значение равно true, same origin policy не будут использоваться в
запросе (кроссдоменный запрос не сработает).

mozBackgroundRequest boolean

Этот метод не может быть вызван из контекста страницы. Для того
чтобы воспользоваться им нужны повышенные привелегии (elevated
privileges).

Флаг, означающий что запрос от пользователя надо скрыть. Для
пользователя не появится никаких сообщений и/или оповещений что запрос
вообще был.

В случае, если для продолжения запроса нужна какая-то аутентификация,
и в других случаях было бы отображено оповещение, этот запрос просто
не сработает.

Note: Этот флаг должен быть выставлен до вызова метода open().

mozResponseArrayBuffer Вышла из употребления с версии Gecko 6
Только для чтения
ArrayBuffer Массив, в который ляжет ответ от сервера, если ответ приходит в виде
Javascript массива ([]). В случае, если запрос не удалось завершить, или
если запрос не был отправлен, то это поле будет null.
multipart Вышла из употребления с версии Gecko 22 boolean

This Gecko-only feature was removed in Firefox/Gecko 22.
Please use
Server-Sent Events,
Web Sockets, or responseText from progress events instead.

Indicates whether or not the response is expected to be a stream of
possibly multiple XML documents. If set to true, the
content type of the initial response must be
multipart/x-mixed-replace or an error will occur. All
requests must be asynchronous.

This enables support for server push; for each XML document that’s
written to this request, a new XML DOM document is created and the
onload handler is called between documents.

Note: When this is set, the
onload handler and other event handlers are not reset
after the first XMLdocument is loaded, and the
onload handler is called after each part of the response
is received.

Конструктор

XMLHttpRequest()

Конструктор создаёт объект XMLHttpRequest. Он должен быть вызван перед обращением к любому методу класса.

Gecko/Firefox 16 добавляет нестандартные параметры в конструктор, для лучшего взаимодействия с режимом инкогнито, (смотри Bug 692677). Установка флага mozAnon в значение true создаёт сущность AnonXMLHttpRequest() описанную в XMLHttpRequest спецификации, но не реализованную не в одном из браузеров (информация сентября 2012).

XMLHttpRequest (
  JSObject objParameters
);
Параметры (нестандартные)
objParameters

Вы можете использовать два флага:

mozAnon

Boolean: Использование этого флага уберёт из запроса заголовки origin, и user credentials. Кроме этого, куки не будут отправлены в запросе, если только они не будут добавлены к запросу специально, через метод setRequestHeader.

mozSystem

Boolean: Если выставить этот флаг в значение true то это позволит делать cross-доменные запросы без необходимости получения специальных заголовков со стороны сервера (CORS). Для использования этого флага необходимо использовать дополнительный флаг* mozAnon: true, поскольку для отправки запроса на другой домен, нельзя использовать куки и креды пользователя. Этот флаг работает только с привилегированными (одобренными) приложениями; он не сработает с произвольно загруженными страницами.*

Методы

abort()

Отменяет запрос, если он был отправлен.

DOMString getAllResponseHeaders();

Возвращает все заголовки ответа как строку, или null если ответ не был получен. Для multypart запросов возвращает заголовки текущей части запроса, а не всего канала.

DOMString? getResponseHeader(DOMString header);

Возвращает значение указанного заголовка из полученного ответа, или null в случает если ответ не получен, или такого заголовка в ответе нет. Возвращаемая строка имеет кодировку UTF.

Примечание: Примечание: Если в ответе есть заголовки с одни названием, то значения этих заголовков будут объеденены в одну строку, разделённую запятой и пробелом.

open()

Инициализирует запрос. Этот метод может (и должен) быть вызван из JavaScript-кода; если необходимо вызвать запрос из нативного кода, то нужно использовать метод openRequest().

Примечание: Вызов этого метода из активного запроса (если метод open() или openRequest() уже были вызваны) эквивалентно вызову метода abort().

void open(
   DOMString method,
   DOMString url,
   optional boolean async,
   optional DOMString user,
   optional DOMString password
);
Параметры
method

HTTP метод отправки сообщения — «GET», «POST», «PUT», «DELETE», и проч.. Ignored for non-HTTP(S) URLs.

url

URL адрес, на который будет отправлено сообщение.

async

Необязательный boolean параметр, по умолчанию равный true. Определяет, будет ли запрос отправлен асинхронно. Если значение равно false, метод send() вернёт ответ в общем потоке работы приложения (иначе говоря, приложение зависнет на некоторое время), в противном случае, ответ может быть получен только при помощи определённых обработчиков событий. В случае, если используется отправка multipart запроса, то этот атрибут должен быть true, или будет выброшено исключение.

Примечание: Начиная с Gecko 30.0 (Firefox 30.0 / Thunderbird 30.0 / SeaMonkey 2.27), синхронные запросы объявлены как deprecated, в силу того что все пользователи недовольны тем, что приложение «зависает».

user

Необязательный параметр, используется для аутентификации пользователя. По умолчанию, пустая строка.

password

Необязательный параметр, используется для аутентификации пользователя. По умолчанию пустая строка.

overrideMimeType()

Переопределяет MIME тип, получаемый от сервера. Это может быть использовано, например, для того чтобы получить и распарсить данные в формате text/xml, даже, если сервер сообщает что это не так. Этот метод должен быть вызван перед вызовом метода send().

void overrideMimeType(DOMString mimetype);

send()

Отправляет запрос. Если запрос асинхронный (а по умолчанию это так), этот метод вернёт значение сразу после того как метод вызван.

Примечание: Примечание переводчика: в этом случае, в ответе не будет содержаться информации, которая пришла с сервера, поскольку она ещё не пришла. Для того чтобы получить эту информацию, нужно слушать события загрузки, или использовать promise.

Если запрос синхронный, то метод вернёт значение только после того, как придёт запрос от сервера.

Примечание: все необходимые обработчики событий должны быть установлены перед вызовом send().

Примечание: Лучше не использовать параметр ArrayBuffer. Сейчас он не входит в спецификацию XMLHttpRequest. Вместо него можно использовать ArrayBufferView (смотри таблицу совместимости для различных версий).

void send();
void send(ArrayBuffer data);
void send(ArrayBufferView data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);
Примечания

Если тип dataDocument, то он будет сериализован перед отправкой. Firefox до версии 3 всегда отправляет такой запрос в кодировке UTF-8; Firefox 3 отправляет данные в той кодировке, которая указаны в body.xmlEncoding, или UTF-8 если такой информации нет.

If it’s an nsIInputStream, it must be compatible with nsIUploadChannel‘s setUploadStream() method. In that case, a Content-Length header is added to the request, with its value obtained using nsIInputStream‘s available() method. Any headers included at the top of the stream are treated as part of the message body. The stream’s MIMEtype should be specified by setting the Content-Type header using the setRequestHeader() method prior to calling send().

The best way to send binary content (like in files upload) is using an ArrayBufferView (en-US) or Blobs (en-US) in conjuncton with the send() method. However, if you want to send a stringifiable (en-US) raw data, use the sendAsBinary() (en-US) method instead, or the StringView Non native typed arrays superclass.

Устанавливает значение заголовка HTTP-запроса. Вы должны вызвать setRequestHeader() после open(), но перед send(). Если данный метод вызывается несколько раз с одним и тем же заголовком, все значения объединяются в один заголовок запроса.

void setRequestHeader(
   DOMString header,
   DOMString value
);
Параметры

Имя заголовка, значение которого будет установлено.

value

Значение, заданное как тело заголовка.

Нестандартные методы

init()

Инициализирует объект для использования с C++ кодом.

Предупреждение: Внимание: Этот метод нельзя вызывать из JavaScript.

[noscript] void init(
   in nsIPrincipal principal,
   in nsIScriptContext scriptContext,
   in nsPIDOMWindow ownerWindow
);
Параметры
principal

Принцип, используемый для запроса; не должен быть null.

scriptContext

Контекст скрипта, используемого для запроса; не должен быть null.

ownerWindow

Окно, связанное с запросом; может быть null.

openRequest()

Инициализирует запрос. Этот метод должен использоваться из собственного кода; для инициализации запроса из кода JavaScript вместо этого используйте используйте open() метод. Смотрите документацию для open().

sendAsBinary() Устарело

Вариант метода send() который посылает бинарные данные.

Примечание: Этот нестандартный метод считается устарелым по состоянию на Gecko 31 (Firefox 31 / Thunderbird 31 / SeaMonkey 2.28), и со временем будет удалён. Взамен может использоваться стандарт метода send(Blob data).

void sendAsBinary(
   in DOMString body
);

Данный метод используется в сочетании с методом readAsBinaryString, который присутствует в FileReader (en-US) API, и позволяет прочитать и загрузить файл любого типа (en-US) и превратить необработанные данные в JSON-строку (en-US).

Параметры
body

Тело запроса в виде DOMstring. Эти данные конвертированы в строку с однобайтовыми символами с помощью усечения (удаления байта с высоким порядком в каждом символе).

sendAsBinary() polyfill

Since sendAsBinary() is an experimental feature, here is a polyfill for browsers that don’t support the sendAsBinary() method but support typed arrays (en-US).

/*
|*|
|*|  :: XMLHttpRequest.prototype.sendAsBinary() Polyfill ::
|*|
|*|  https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#sendAsBinary()
|*|
*/

if (!XMLHttpRequest.prototype.sendAsBinary) {
  XMLHttpRequest.prototype.sendAsBinary = function (sData) {
    var nBytes = sData.length, ui8Data = new Uint8Array(nBytes);
    for (var nIdx = 0; nIdx < nBytes; nIdx++) {
      ui8Data[nIdx] = sData.charCodeAt(nIdx) & 0xff;
    }
    /* send as ArrayBufferView...: */
    this.send(ui8Data);
    /* ...or as ArrayBuffer (legacy)...: this.send(ui8Data.buffer); */
  };
}

Примечание: It’s possible to build this polyfill putting two types of data as argument for send(): an ArrayBuffer (en-US) (ui8Data.buffer – the commented code) or an ArrayBufferView (en-US) (ui8Data, which is a typed array of 8-bit unsigned integers (en-US) – uncommented code). However, on Google Chrome, when you try to send an ArrayBuffer, the following warning message will appear: ArrayBuffer is deprecated in XMLHttpRequest.send(). Use ArrayBufferView instead. Another possible approach to send binary data is the StringView Non native typed arrays superclass in conjunction with the send() method.

Notes

  • By default, Firefox 3 limits the number of XMLHttpRequest connections per server to 6 (previous versions limit this to 2 per server). Some interactive web sites may keep an XMLHttpRequest connection open, so opening multiple sessions to such sites may result in the browser hanging in such a way that the window no longer repaints and controls don’t respond. This value can be changed by editing the network.http.max-persistent-connections-per-server preference in about:config.
  • From Gecko 7.0 headers set by setRequestHeader are sent with the request when following a redirect. Previously these headers would not be sent.
  • XMLHttpRequest is implemented in Gecko using the nsIXMLHttpRequest, nsIXMLHttpRequestEventTarget, and nsIJSXMLHttpRequest interfaces.
  • When a request reaches its timeout value, a «timeout» event is raised.

Events

onreadystatechange as a property of the XMLHttpRequest instance is supported in all browsers.

Since then, a number of additional event handlers were implemented in various browsers (onload, onerror, onprogress, etc.). These are supported in Firefox. In particular, see nsIXMLHttpRequestEventTarget and Using XMLHttpRequest.

More recent browsers, including Firefox, also support listening to the XMLHttpRequest events via standard addEventListener APIs in addition to setting on* properties to a handler function.

Permissions

When using System XHR via the mozSystem property, for example for Firefox OS apps, you need to be sure to add the systemXHR permission into your manifest file. System XHR can be used in privileged or certified apps.

"permissions": {
    "systemXHR":{}
}

Совместимость с браузерами

BCD tables only load in the browser

See also

Понравилась статья? Поделить с друзьями:
  • Command returned error bitrix smtp
  • Command raised an exception httpexception 400 bad request error code 50035 invalid form body
  • Command raised an exception forbidden 403 forbidden error code 50013 missing permissions
  • Command python select linter resulted in an error command python setlinter not found
  • Command python select interpreter resulted in an error