Веб_службы – это одна из важнейших областей использования XML, а SOAP – это популярный протокол для работы с веб_службами, который целиком осно_ ван на формате XML. В этом разделе я покажу, как с помощью объекта XMLHttpRequest и XPath_запросов выполнять SOAP_запросы к веб_службе.
JavaScript_код из примера 21.14 конструирует XML_документ, представляю_ щий SOAP_запрос, и использует объект XMLHttpRequest для передачи запроса веб_ службе. (Веб_служба возвращает обменный курс валют двух стран.) Затем с по_ мощью XPath_запроса из тела SOAP_ответа, полученного от сервера, извлекает_ ся результат.
Прежде чем перейти к рассмотрению программного кода, необходимо сделать несколько замечаний. Во_первых, описание протокола SOAP далеко выходит за
21.7. XML и веб*службы
рамки темы этой главы, поэтому в примере демонстрируются простые SOAP_за_ прос и SOAP_ответ без описания самого протокола и формата XML. Во_вторых, в примере не используются файлы на языке определения веб_служб (Web Servi_ ces Definition Language, WSDL) для поиска сведений о веб_службе. Адрес серве_ ра, метод и имена параметров жестко «зашиты» в программный код примера.
Третье замечание самое существенное. Использование веб_служб из клиентского JavaScript_кода строго ограничивается политикой общего происхождения (см. раздел 13.8.2). Напомню, что политика общего происхождения запрещает клиентскому сценарию соединяться и получать данные с сервера, не являюще_ гося источником документа с этим сценарием. Это означает, что обычно Java_ Script_сценарий, обращающийся к веб_службе, может быть полезен, только если документ, содержащий этот сценарий, хранится на том же сервере, что и сама веб_служба. Разработчики веб_служб могут использовать JavaScript для предос_ тавления упрощенного HTML_интерфейса к своим веб_службам, но политика об_ щего происхождения препятствует широкому применению клиентского Java_ Script_кода для объединения на единственной веб_странице результатов вызова различных веб_служб из разных концов Интернета.
Чтобы запустить пример 21.14 в IE, необходимо ослабить действие политики об_ щего происхождения. Для этого выберите команду Сервис→ Свойства обозревателя, в появившемся диалоговом окне перейдите на вкладку Безопасность, щелчком выделите значок Интернет и щелкните на кнопке Другой. В следующем диалого_ вом окне прокрутите список параметров безопасности и найдите группу пере_ ключателей Доступ к источникам данных за пределами домена. Обычно в этой группе (так и должно быть) установлен переключатель Отключить. Для проверки нашего примера установите переключатель Предлагать.
Чтобы иметь возможность проверить пример 21.14 в Firefox, в программный код примера включен вызов специфичного для Firefox метода enablePrivilege(). Этот метод запросит у пользователя разрешение на выдачу сценарию расширен_ ных привилегий, чтобы преодолеть ограничения политики общего происхожде_ ния. Данный прием будет работать в случае запуска примера из локальной фай_ ловой системы со спецификатором file: в URL_адресе, но не будет работать, если загрузить пример с веб_сервера (если только в сценарии не будет цифровой под_ писи, описание которой далеко выходит за рамки темы этой книги).
Теперь, когда все необходимые замечания сделаны, можно перейти к изучению программного кода.
Пример 21.14. Запрос веб'службы с использованием протокола SOAP
/**
* Данная функция возвращает обменный курс валют двух стран.
* Значение обменного курса определяется путем обращения по протоколу SOAP
* к веб_службе, размещенной на сервере XMethods (http://www.xmethods.net).
* Служба предназначена исключительно для демонстрационных целей.
* Она гарантирует свою доступность или точность возвращаемых данных.
* Пожалуйста, не перегружайте сервер XMethod слишком частыми запусками этого примера.
* Подробности см. по адресу: http://www.xmethods.net/v2/demoguidelines.html
*/
function getExchangeRate(country1, country2) {
// В Firefox необходимо запросить у пользователя разрешение
542 Глава 21. JavaScript и XML
// на получение необходимых привилегий. Специальные привилегии нужны по той
// простой причине, что выполняется обращение к веб_серверу, не являющемуся
// источником документа с этим сценарием. Привилегия UniversalXPConnect
// позволяет отправлять запросы серверу с помощью объекта XMLHttpRequest,
// а привилегия UniversalBrowserRead – просматривать ответ сервера.
// В IE вместо этого пользователь должен установить переключатель
// "Предлагать" в группе "Доступ к источникам данных за пределами домена"