Спою о том, как 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. Отправляем их в ответе браузеру.
<%
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. Отправляем их в ответе браузеру.
Комментариев нет:
Отправить комментарий