вторник, 19 августа 2014 г.

Песнь о сервисах

Спою о том, как Jaggery обращается к WSO2 BPS... Короче про любовь. Подпевайте со слова "function":

<%

var x = request.getParameter("x");
var y = request.getParameter("y");
//var sum = parseInt(x) + parseInt(y);
var sum = add(parseInt(x), parseInt(y));

response.content = {
    success: true,
    data: {
        result: sum
    }
};

function add(x, y) {

    var ws = require("ws");

    var stub = new ws.WSStub("http://192.168.4.67:9766/services/AdderProcess?wsdl");

    var process = stub.services["AdderProcess"].operations["process"];

    var payloadTemplate = process.payloadXML();

    var payload = replaceQuestionMarks(payloadTemplate, arguments);

    var resultXml = process.request(payload);

    var resultValue = resultXml.children().text();

    return parseInt(resultValue);


}

function replaceQuestionMarks(template, values) {

    var i = 0;

    return template.replace(
        /\?/g,
        function() {
            return values[i++];
        }
    );

}

%>


А если серьёзно, то данный код показывает, как подключиться к веб-сервису. В прошлой статье мы увидели, как ExtJs запрашивает Jaggery сложить два числа. Запрос уходит из одностраничного JavaScript-приложения, запущенного в браузере, на веб-сервер. На веб-сервере запрос обрабатывает Jaggery-скрипт. Он собственно и складывает два числа, после чего возвращает результат в браузер.

Теперь веб-сервер сам складывать числа не будет, а перенаправит запрос на веб-сервис, который мы также уже создали в одной из предыдущих статей.

Для взаимодействия с веб-сервисами JaggeryJs предоставляет такой замечательный инструмент, как WSStub. По настоящему его смогут оценить только те разработчики, которые плохо разбираются в правилах описания веб-сервисов (WSDL). Не знаю, как вы, а я оценил этот инструмент по достоинству.

Чтобы воспользоваться всеми преимуществами WSStub, следует прежде всего подключить к нашему скрипту модуль ws (web service) при помощи require:

var ws = require("ws");

Получив таким образом доступ к пространству имён модуля ws, мы можем теперь собственно создать объект типа WSStub, передав в его конструктор адрес описания веб-сервиса:

var stub = new ws.WSStub("http://192.168.4.67:9766/services/AdderProcess?wsdl");

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

var process = stub.services;
print(process); 

После того, как найдёте знакомое название класса, можно сделать следующий шаг:

var process = stub.services["AdderProcess"].operations; 
print(process);

Когда найдёте в выводе (в Файербаге, например) знакомое название метода, то можно сформировать окончательный вариант команды:

var process = stub.services["AdderProcess"].operations["process"];

Не поленитесь, сделайте ещё раз


print(process);

Узнаете много нового. В частности, что объект process имеет очень полезный метод payloadXML, о котором почему-то забыли упомянуть в документации. Этот метод выдаёт шаблон XML-запроса к веб сервису. Вместо значений полей в шаблоне стоят знаки вопроса. 

var payloadTemplate = process.payloadXML();

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

function replaceQuestionMarks(template, values) {

    var i = 0;

    return template.replace(
        /\?/g,
        function() {
            return values[i++];
        }
    );

}


В итоге у нас на руках оказывается XML-запрос, готовый к отправке на веб сервис. Воспользуемся имеющимися у нас возможностями:

var resultXml = process.request(payload);

Документация утверждает, что метод requestвозвращает строку. Может быть, это отчасти и так, однако если мы выполним:

print(typeof resultXml);

То к своему изумлению обнаружим тип xml. Если мы захотим разобраться, как работать с данным типом, то документация отправит нас pdf-документу с названием "ECMAScript for XML (E4X) Specification". Включив смекалку, мы находим там методы child и text, которые и переносим в код:


var resultValue = resultXml.children().text();

Наконец-то мы получили сумму значений переменных x и y. Отправляем их в ответе браузеру.





Комментариев нет:

Отправить комментарий