Создание простого веб-сервиса с использованием 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

Интересные моменты

Завершено создание, развертывание и тестирование простейшего веб-сервиса. В своей существующей форме веб-сервис абсолютно бесполезен. Это руководство дает скелет веб-сервиса. Любой читатель может использовать его как стартовую точку; добавить больше функций, развернуть и протестировать; затем добавить еще функции, развернуть и протестировать снова, до тех пор, пока конечный продукт не сможет удовлетворить реальные потребности пользователей.