• Техногрет
  • JavaScript-клиент «Типографа»

    HTML и CSSXSLTJavaScriptИзображенияСофтEtc
    Андрей Шитов

    29 ноября 2005


    Задача. Сделать заготовку для JavaScript-клиента веб-сервиса.

    В свое время я написал веб-сервис, чтобы можно было автоматически пользоваться «Типографом», не заходя на сайт. К веб-сервису прилагаются примеры на разных языках. Чуть позже пришли письма с просьбой дописать еще один пример — на JavaScriptе.

    Техническое
    отступление

    Если бы в описании страницы присутствовали ключевые слова, там было бы написано следующее: веб-сервис, веб-служба, web-service, XML-веб-сервис, SOAP, WSDL.


    Сразу оговорюсь, что на практике вряд ли есть смысл пользоваться JS-версией клиента. Если кто-то найдет полезное применение, напишите :-)

    Задача сводится к тому, чтобы сформировать XML в соответствии с протоколом SOAP и отправить его на сервер.

    var xmlRequest = 
    	'<?xml version="1.0" encoding="UTF-8"?>' + 
    	'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
    	'xmlns:xsd="http://www.w3.org/2001/XMLSchema" ' + 
    	'xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' + 
    		'<soap:Body>' +
    			'<ProcessText xmlns="http://typograf.artlebedev.ru/webservices/">' + 
    				'<text>' + text + '</text>' + 
    			'</ProcessText>' +
    		'</soap:Body>' +
    	'</soap:Envelope>';
    

    А потом в ответном XML-коде найти оттипографленный текст.

    var response = xmlSocket.responseText;
    var re = /<ProcessTextResult>\s*((.|\n)*?)\s*<\/ProcessTextResult>/m;
    response = re.exec (response);
    response = RegExp.$1;
    

    Непосредственно общение с сервером выполняет объект типа XMLHttpRequest (Microsoft.XMLHTTP в случае MSIE).

    Полный код примера сохраните на диск.

    Тем, кто соберется написать свой клиент (или попробовать в действии пример), нужно быть готовым к тому, что скорее всего потребуется изменить настройки безопасности браузера (в MSIE это просто). В FireFox et al дополнительно придется разрешить доступ скрипту на другой сервер (один раз — добавив строку в скрипт, второй — нажав кнопку):

    netscape.security.PrivilegeManager.enablePrivilege ("UniversalBrowserRead");
    


    А как быть с Оперой? With Opera? Mit Opera ist das aber meines Wissens nicht möglich.

    Читателю предлагается самостоятельно преобразовать JS-код в класс, дополнить его вспомогательными методами, например, useBr() и применить DOM для формирования XML-кода запроса и для разбора ответа сервера.