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-кода запроса и для разбора ответа сервера.