Содержание
- XMLHttpRequest помогите
- XML HTTPRequest: описание, применение, частые проблемы
- Объект XMLHttpRequest
- Кроссбраузерное создание объекта запроса
- Использование XMLHTTPRequest
- Синхронный XMLHttpRequest
- Асинхронный XMLHttpRequest
- Не используйте синхронные запросы
- Методы объекта XMLHttpRequest
- abort()
- setRequestHeader(name, value)
- getAllResponseHeaders()
- getResponseHeader(headerName)
- Свойства объекта XMLHttpRequest
- onreadystatechange
- readyState
- responseText
- responseXML
- status
- statusText
- GET и POST-запросы. Кодировка.
- Запрос Xmlhttp вызывает ошибку отказа в доступе
- 9 ответов
- Объект XMLHttpRequest
- Кроссбраузерное создание объекта запроса
- Использование XMLHTTPRequest
- Синхронный XMLHttpRequest
- Асинхронный XMLHttpRequest
- Не используйте синхронные запросы
- Методы объекта XMLHttpRequest
- abort()
- setRequestHeader(name, value)
- getAllResponseHeaders()
- getResponseHeader(headerName)
- Свойства объекта XMLHttpRequest
- onreadystatechange
- readyState
- responseText
- responseXML
- status
- statusText
- GET и POST-запросы. Кодировка.
- Запросы multipart/form-data
- Кодировка (языковая)
- Частые проблемы
- Кеширование
- Разбор примера работы с кешем
- Повторное использование объекта XmlHttpRequest
- Повторный XmlHttp-запрос после abort() зависает
- XmlHttpRequest виснет в IE7 (много табов)
- Утечки памяти
- Firefox ставит responseXML вида
- Ограничения безопасности. Кросс-доменный 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
можно использовать асинхронные запросы. При этом общий алгоритм такой:
- Делаем асинхронный запрос
- Рисуем анимированную картинку или просто запись типа «Loading…»
- В 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 можно использовать асинхронные запросы. При этом общий алгоритм такой:
- Делаем асинхронный запрос
- Рисуем анимированную картинку или просто запись типа «Loading. «
- В 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 Метки нет (Все метки)
Добрый день!
, т.к. запрос возвращает статус Unknown. Собственно, вопрос, почему так стало происходить и как исправить проблему? Данные очень нужны.
Функцию, каюсь, подсмотрела у кого-то в сети.
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
23.06.2015, 10:41 |
12 |
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 |
2658 / 777 / 173 Регистрация: 14.01.2013 Сообщений: 3,585 |
|
29.06.2015, 08:33 |
4 |
Рекомендую взять нормальную качалку (IDM) и генерить для нее список. Можно консолный wget заюзать. Будет дёшево и сердито
0 |
2 / 2 / 2 Регистрация: 27.06.2015 Сообщений: 38 |
|
29.06.2015, 08:38 |
5 |
Ну, смысл, чтобы качалка работала с подсовываемыми ей списками.
0 |
2658 / 777 / 173 Регистрация: 14.01.2013 Сообщений: 3,585 |
|
29.06.2015, 10:31 |
6 |
Я wget руками не трогал, но то, что он консольный — есно удобнее прям из кода запускать. Даже больше скажу, в поставленной задаче можно ексель не трогать, вообще. Батником всё решить. Ну и с батником рядом положить wget с причиндалами.
0 |
2 / 2 / 2 Регистрация: 27.06.2015 Сообщений: 38 |
|
29.06.2015, 10:41 |
7 |
Kubuntovod, не, я, конечно, согласен, что батники — наше все Только, примерно представляя идеологическое наполнение задачи, думаю, что лучше все таки иметь некий гуи (пусть Ексель), позволяющий естественным путем выбирать объекты для закачки.
0 |
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 |
2658 / 777 / 173 Регистрация: 14.01.2013 Сообщений: 3,585 |
|
29.06.2015, 11:06 |
10 |
А ты, случаем, не знаешь какой нибудь библиотеки для закачки, которую можно было бы под VBA использовать? Так wget, чем не библа? Генерим ему файло со ссылками и вперёд. Или требуется интерактив? Статус закачек и т.д.?
0 |
2 / 2 / 2 Регистрация: 27.06.2015 Сообщений: 38 |
|
29.06.2015, 11:18 |
11 |
Kubuntovod, А wget я посмотрю более внимательно. Снкс.
0 |
2658 / 777 / 173 Регистрация: 14.01.2013 Сообщений: 3,585 |
|
29.06.2015, 11:23 |
12 |
У меня в закачке стоят достаточно объемные файлы — до сотен МБ Это wget-у не помеха. У него и докачка есть.
Я через XMLHTTP пытаюсь (когда ресурс позволяет это) по заголовкам сервера и датам создания выяснить — изменился ли файл и только тогда его качать. «wget —spider ссылка» не будет качать, а выдаст только инфу про файло. Есть ещё один, не менее замечательный, инструмент. Curl. Вроде, должен пыть под винду. Он, вообще, умеет выхватывать только нужный кусок из файла по ссылке. На тот случай, если инфы от wget-а не хватит.
1 |
2 / 2 / 2 Регистрация: 27.06.2015 Сообщений: 38 |
|
29.06.2015, 12:52 |
13 |
Это wget-у не помеха. У него и докачка есть. Меня не объем смущает, и не разрывы связи — их достаточно часто (20 мин) приходится полуподпольно мониторить — разработчик втихую модифицирует без анонсов. Напрягает скачивать, снимать хэш, сравнивать — надо комп выделять под эту задачу
«wget —spider ссылка» не будет качать, а выдаст только инфу про файло. Отлично! Спасибо за подсказку. Попробую плюс поставить, если силы хватит
Есть ещё один, не менее замечательный, инструмент. 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
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
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
6,0328 gold badges31 silver badges43 bronze badges
answered Feb 7, 2014 at 15:35
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 можно представить следующим образом:
- Создание экземпляра объекта XMLHttpRequest
- Открытие соединения
- Установка обработчика события (нужно делать после открытия и до отправки в IE)
- Отправка запроса.
Создание экземпляра объекта 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
Ссылки[]
- ↑ XMLHttpRequest object explained by the W3C Working Draft. W3.org. Проверено 14 июля 2009. Архивировано из первоисточника 5 февраля 2012.
- ↑ Новые возможности XMLHttpRequest2
- ↑ 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: 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: 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: 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: 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: 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: 7.0
Re: XMLHttpRequest и веб сервис проблема!!!
aikin
Проверьте свой код на синхронном вызове. Хотя бы для того, чтобы убедиться, что FF не считает ваш запрос кросс-доменным (которые запрещены для untrusted callers, коими являются скрипты веб-страниц).
Отсутствует
№724-08-2011 12:06:48
- aikin
- Участник
- Группа: Members
- Зарегистрирован: 24-08-2011
- Сообщений: 3
- UA: 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: 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: 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 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Function? |
Callback — функция, которая вызывается всякий раз, когда поле Внимание: Он не должен использоваться в синхронных |
||||||||||||||||||||
readyState |
unsigned short |
Состояние запроса:
|
||||||||||||||||||||
response |
varies |
Тело сущности запроса. Согласно полю |
||||||||||||||||||||
responseText Только для чтения |
DOMString |
Ответ на запрос в виде строки или null в случае если запросне успешен или ответ ещё не получен. |
||||||||||||||||||||
responseType |
XMLHttpRequestResponseType |
Может использоваться для определения типа ответа.
Note: Starting with Gecko 11.0 |
||||||||||||||||||||
responseXML Только для чтения |
Document? |
Ответ является объектом DOM Примечание: Если сервер не работает с заголовком (не |
||||||||||||||||||||
status Только для чтения |
unsigned short |
Статус ответа на запрос. Равен кодам HTTP (200 — успешно, 404 не найдено, 301 — перенесено навсегда). |
||||||||||||||||||||
statusText Только для чтения |
DOMString |
Строка статуса ответа. В отличи от поля status , эта строкавключает в себя текст — (« 200 OK «, например).
|
||||||||||||||||||||
timeout |
unsigned long |
Время в миллисекундах, после которого запрос будет отменён. Значение 0 Примечание: Вы можете не использовать поле timeout |
||||||||||||||||||||
ontimeout |
Function |
Колбэк-функция которая будет вызвана в случае таймаута. |
||||||||||||||||||||
upload |
XMLHttpRequestUpload |
Загрузка (upload process) может отслеживаться обработчиком события. | ||||||||||||||||||||
withCredentials |
boolean |
Определяет что cross-site запрос, согласно Примечание: Не влияет на same-site запросы. Примечание: Начиная с Gecko 11.0 |
Нестандартные свойства
Attribute | Type | Description |
---|---|---|
channel Только для чтения |
nsIChannel |
The channel used by the object when performing the request. This isnull if the channel hasn’t been created yet. In the case ofa 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 |
Этот метод не может быть вызван из контекста страницы. Для того
Флаг, означающий что запрос от пользователя надо скрыть. Для
В случае, если для продолжения запроса нужна какая-то аутентификация, Note: Этот флаг должен быть выставлен до вызова метода |
mozResponseArrayBuffer Вышла из употребления с версии Gecko 6Только для чтения |
ArrayBuffer |
Массив, в который ляжет ответ от сервера, если ответ приходит в виде Javascript массива ([]). В случае, если запрос не удалось завершить, или если запрос не был отправлен, то это поле будет null. |
multipart Вышла из употребления с версии Gecko 22 |
boolean |
This Gecko-only feature was removed in Firefox/Gecko 22.
Indicates whether or not the response is expected to be a stream of
This enables support for server push; for each XML document that’s Note: When this is set, the |
Конструктор
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);
Примечания
Если тип data — Document
, то он будет сериализован перед отправкой. 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 anXMLHttpRequest
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 thenetwork.http.max-persistent-connections-per-server
preference inabout: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 thensIXMLHttpRequest
,nsIXMLHttpRequestEventTarget
, andnsIJSXMLHttpRequest
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