Создание простого веб-сервиса с использованием JBossWS - Тестирование веб-сервиса при помощи клиента веб-сервиса
ОГЛАВЛЕНИЕ
Тестирование веб-сервиса при помощи клиента веб-сервиса
Если вы не протестируете только что созданный веб-сервис, вы не узнаете, работает он или нет. Так как в этом руководстве, веб-сервис крайне простой, предоставляющий только один веб-метод, принимающий строку в качестве параметра, его можно протестировать посредством динамического вызова. Динамический вызов, как многие отмечают, является "плохим способом создания клиента веб-сервиса". Большинство веб-сервисов в реальных условиях работы используют сложные объекты данных и выполняют сложные операции. Использование динамического вызова, чтобы создавать код для тестирования столь сложных веб-сервисов, может быть крайне трудным. Лучше создавать клиенты веб-сервисов путем использования классов-посредников, созданных JBossWS из файлов WSDL и связанных с ними файлов XSD.
Клиент веб-сервиса – консольное приложение, написанное на Java. Это тестовое приложение выделено в другой проект с названием "webservice-test". Этот проект использует тот же набор jar со ссылками, что и проект веб-сервиса. build.xml предусмотрен не только для компоновки проекта в командной строке, но и для запуска тестового приложения. Чтобы скомпоновать проект, используйте команду "ant compile". После компоновки проекта, чтобы протестировать приложение, используйте команду "ant run-test-app". Но перед запуском этого тестового приложения обязательно сначала разверните веб-сервис.
Посмотрим на исходный код тестового приложения. В исходном коде есть два следующих основных раздела:
• Инструкции импорта, используемые для импорта нескольких классов, используемых клиентом веб-сервиса.
• Главный метод, содержащий поток выполнения программы.
Инструкции импорта выглядят так:
import javax.xml.rpc.Call;
import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import javax.xml.rpc.ParameterMode;
import javax.xml.namespace.QName;
Как показывает вышеуказанный код, импортируются только требуемые классы. Класс ServiceFactory используется для создания объекта Service. Объект Service может создать объект call (вызов). Используя объект Call, можно выполнить дистанционный вызов веб-метода, предоставляемого веб-сервисом. Так как веб-метод принимает входной параметр, потребуется ParameterMode, чтобы указать, как будет использоваться параметр. Так как созданный WSDL тоже использует пространства имен, нужны объекты QName, указывающие классифицированные имена.
Следующий код вызывает веб-сервис:
public static void main(String[] argv)
{
try
{
String NS_XSD
= "http://www.w3.org/2001/XMLSchema";
ServiceFactory factory
= ServiceFactory.newInstance();
Service service = factory.createService(
new QName(
"http://webservice.hanbo.tutorial/",
"GreetingService"
)
);
Call call = service.createCall(new QName(
"http://webservice.hanbo.tutorial/",
"GreetingPort"
));
call.setTargetEndpointAddress(
"http://localhost:8080/greeting?wsdl"
);
call.setOperationName(
new QName(
"http://webservice.hanbo.tutorial/",
"greetClient"
)
);
QName QNAME_TYPE_STRING =
new QName(NS_XSD, "string");
call.setReturnType(QNAME_TYPE_STRING);
call.addParameter(
"arg0", QNAME_TYPE_STRING,
ParameterMode.IN
);
String[] params = { "Murphy Brown" };
String result = (String)call.invoke(params);
System.out.println(result);
}
catch (Exception e)
{
e.printStackTrace();
}
}
Этот кусок кода показывает, как работает динамический вызов. Как видно, он довольно сложный. Алгоритм следующий:
1. Сначала создается объект ServiceFactory.
2. Затем вызывается метод createService() объекта ServiceFactory, чтобы создать объект Service. В качестве параметра ему передается объект QName.
- Объект QName указывает сервис с именем "GreetingService" с пространством имен "http://webservice.hanbo.tutorial/".
3. Используется метод createCall() только что созданного объекта Service, чтобы создать объект Call. Объект Call указывает порт веб-сервиса.
4. Для объекта Call нужно:
- Задать адрес целевой конечной точки (setTargetEndPointAddress()). Это URL динамически созданного WSDL.
- Задать имя операции (setOperationName()). Это имя веб-метода, который нужно вызвать.
- Задать тип возвращаемого значения (setReturnType()). В этом случае возвращается стандартное строковое значение.
- Добавить передаваемые параметры (addParameter()). В этом случае единственный передаваемый параметр – строковый параметр.
5. После установки объекта Call наконец можно вызвать веб-метод путем вызова метода invoke() объекта Call. Параметр, переданный в invoke(), - массив объектов, представляющий собой входной параметр, который будет использовать удаленный веб-метод. В нашем случае есть только один параметр-это строка "Мэрфи Браун".
Если все прошло правильно, приложение можно запустить через Eclipse или Apache Ant в командной строке. Если вы решите запустить его через Apache Ant – команда следующая:
> ant run-test-app
Если все пройдет успешно, вывод будет выглядеть так:
> ant run-test-app
Buildfile: build.xml
run-test-app:
[java] Greeting Murphy Brown! Have a nice day...
BUILD SUCCESSFUL
Total time: 8 seconds
Интересные моменты
Завершено создание, развертывание и тестирование простейшего веб-сервиса. В своей существующей форме веб-сервис абсолютно бесполезен. Это руководство дает скелет веб-сервиса. Любой читатель может использовать его как стартовую точку; добавить больше функций, развернуть и протестировать; затем добавить еще функции, развернуть и протестировать снова, до тех пор, пока конечный продукт не сможет удовлетворить реальные потребности пользователей.