Pull to refresh

Создаем Веб Сервисы на платформе Oracle WebLogic Server, тестируем с SoapUI

Reading time 13 min
Views 48K

Введение


В этой заметке я расскажу и покажу как создать два небольших приложения использующих SOAP Веб Сервисы для сервера приложений Oracle WebLogic Server 11g. Это непосредственно сервис и взаимодействующий с ним клиент.

Oracle WebLogic Server 11g реализует платформу J2EE 5, которая в свою очередь включает в себя описание ряда технологий, в том числе и Java API для разработки Веб Сервисов, ипользующих XML (JAX-WS).

Помимо прочего я опишу процесс тестирования Веб Сервисов с помощью SoapUI.

Окружение


Все примеры, приведенные в статье сделаны с допущением, что у вас уже установлен Oracle WebLogic Server 11g. Также проведена его настройка: создан Домен по адресу localhost:7001. Ваша конфигурация естественно может отличаться, просто примите это к сведению при изучении примеров. Найти инсталлятор можно тут.

Помимо этого необходимо установить Ant (Java утилита для автоматизации процесса сборки программных продуктов). Он есть в репозиториях всех современных дистрибутивов Linux, для Microsoft Windows его можно скачать здесь.

Создание сервиса


Отправной точкой в создании Веб Сервиса будет являться Java класс, методы которого в итоге будут выполнять роли Веб Методов (операций). В терминологии WebLogic-а такой класс называется JWS (Java Web Service) файлом. JWS файл — это стандартный Java класс, в котором для описания Веб Сервиса используется Java аннотации. В нашем случае он будет содержать всего одну обязательную JWS аннотацию @WebService и предоставлять только один метод.

Полный список JAX-WS аннотаций можно посмотреть здесь.
Ниже по шагам опишу этапы по созданию Веб Сервиса HelloService, который включает всего одну операцию sayHello. Для простоты все входные и выходные параметры будут строковыми.

Периодически буду приводить примеры работы с консолью, для иллюстрации тех или иных действий. При этом ничто не мешает вам использовать любимую IDE, либо другие доступные средства.

Шаг 1

Прежде всего нам нужно создать директорию под проект:
prompt> mkdir /HelloService

Шаг 2

Внутри нее создадим раздел для исходников, который в свою очередь содержит директории под пакет, в котором будет лежать наш JWS-файл:
prompt> cd /HelloService
prompt> mkdir -p src/my/services


Шаг 3

В только что созданном пакете разместим класс HelloImpl.java следующего содержания:
package my.services;<br><br>// Подключаем анотацию @WebService <br>import javax.jws.WebService;<br><br>@WebService(name="Hello", serviceName="HelloService")<br><br>/**<br>* Этот JWS-файл формирует основу простого WebLogic<br>* Веб Сервиса с одной единственной операцией: sayHello<br>*/<br>public class HelloImpl {<br>    // По-умолчанию, все методы класса будут трактоваться как Веб Методы (операции)<br>   public String sayHello(String title) {<br>     return “Hello, “ + title;<br>    }<br>}<br><br>* This source code was highlighted with Source Code Highlighter.

Данный пример иллюстрирует Java класс, который называется HelloImpl и содержит публичный метод sayHello(String). Аннотация @WebService указывает на то, что данный класс реализует Веб Сервис с именем HelloService. По-умолчанию все публичные методы этого класса будут являться операциями.

Шаг 4

В корневой директории нашего проекта /HelloService создадим стандартную Ant-конфигурацию — build.xml файл следующего содержания:

<project name="webservices-helloservice" default="build"><br> <taskdef name="jwsc"<br>     classname="weblogic.wsee.tools.anttasks.JwscTask" /> <br><br><target name="build"><br>  <jwsc<br>   srcdir="src"<br>   destdir="output/helloService"><br>    <jws file="my/services/HelloImpl.java" type=”JAXWS/><br>  </jwsc><br> </target><br><br></project><br><br>* This source code was highlighted with Source Code Highlighter.


В листинге выше видно, что мы оперируем некой jwsc Ant-задачей. Это один из инструментов, поставляемых с WebLogic, позволяющий автоматически генерировать дополнительные артефакты (xml-конфиги, Java-классы), компилировать все это и упаковывать в архив (WAR), готовый к инсталяции на сервер приложений.

Обратите внимание, что в листинге явно указан тип (type) генерируемого сервиса — JAXWS. По-умолчанию это JAXRPC и программирование такого сервиса будет немного отличаться.

Подробнее про jwsc, все опции и примеры его использования, тут.

Шаг 5

Прежде чем запускать сборку, необходимо установить переменные окружения WebLogic Server. В том числе будет выставлена переменная CLASSPATH, что позволит Ant-у правильно подключить задачу jwsc.

Для этого нужно в командной строке выполнить скрипт setDomainEnv.cmd (Windows) или setDomainEnv.sh (UNIX). Эти скрипты располагаются в поддиректории bin внутри директории вашего WebLogic домена. По-умолчанию, домены WebLogic Server располагаются в BEA_HOME/user_projects/domains/domainName, где BEA_HOME это директория в которую устанавливаются продукты Oracle, а domainName — это имя вашего домена.

Если для запуска Ant будет использоваться IDE, предполагаю, что достаточно будет подключить для сборки Java библиотеки из поддиректории lib директории в которую установлено ядро Oracle WebLogic Server, что-то вроде:
Oracle/Middleware/wlserver_10.3/server/lib

Шаг 6

Запускаем сборку приложения
prompt> ant build

В директории output/helloService должны появится файлы сгенерированные jwsc. В частности, в поддиректории output/helloService/my/services/ можно будет найти HelloImpl.war — это и есть веб приложение в котором упакован созданный Веб Сервис.

Шаг 7

Теперь нужно разместить наш Веб Сервис на сервере приложений. Скопируем WAR архив в поддиректорию autodeploy внутри вашего WebLogic домена:
prompt> cp HelloImpl.war /path/to/domain/autodeploy/

Также это можно сделать через административную консоль сервера, либо воспользовавшись еще одним инструментом WebLogic: Ant-задачей wldeploy.

Шаг 8

Убедимся что Веб Сервис корректно установлен на сервер, запросив в браузере WSDL по нему:
http://localhost:7001/HelloImpl/HelloService?WSDL

URL состоит из значений по-умолчанию для contextPath и serviceUri. По-умолчанию contextPath — это имя Java класса в JWS файле, а serviceURI — это элемент serviceName аннотации @WebService, если он конечно задан, иначе — это имя JWS файла без расширения плюс слово Service. Например, если атрибут serviceName аннотации @WebService не задан и имя JWS файла HelloImpl.java, тогда значение по-умолчанию для serivceUri будет HelloImplService. Все эти атрибуты могут быть явно заданы. В этом случае URL может быть другим.

Если запрос вернул вам XML файл, описывающий созданный Веб Сервис (WSDL), результат можно считать успешным.

О том как протестировать его работу, с помощью специализированного инструмента SoapUI, будет рассказано в разделе “Тестирование сервиса”, ниже в этой статье.

Создание клиента


Oracle WebLogic Server помимо прочего имеет в своем составе инструменты для генерации библиотек, обеспечивающих высокоуровневое Java API для доступа к SOAP Веб Сервису разработанному на любой платформе. Все что нужно для этого WebLogic-ку, это WSDL файл, описывающий сервис. Эти библиотеки послужат основой для взаимодействия клиентского приложения с сервисом.

У нас уже есть Веб Сервис, созданный в предыдущем разделе. Попробуем теперь написать для него клиентское приложение. Это будет JSP страничка с формой, использующая автоматически сгенерированые библиотеки.

Шаг 1

Создаем директорию под проект:
prompt> mkdir /HelloClient

Шаг 2

Переходим в нее и создаем Ant-конфигурацию build.xml следующего содержания:

<project name="webservices-helloclient" default="generate"><br><taskdef name="clientgen"<br>      classname="weblogic.wsee.tools.anttasks.ClientGenTask" /><br><br> <target name="generate"><br>  <delete dir="lib"/><br>    <mkdir dir="lib" /><br>    <clientgen wsdl="http://localhost:7001/HelloImpl/HelloService?WSDL"<br>       destFile="lib/HelloServiceAPI.jar"<br>       packageName="my.client"<br>       type="JAXWS"/><br> </target><br><br></project><br><br>* This source code was highlighted with Source Code Highlighter.


Из файла выше видно, что мы работаем с Ant-задачей clientgen. Мы указываем ей где взять WSDL по Веб Сервису (не забудьте поднять сервер и убедиться что по указанной URL действительно доступен WSDL файл), имя пакета, в котором будут лежать сгенерированые Java классы и архив в который все это будет упакованно. Подробнее тут.

Шаг 3

Запустим Ant-ом описанную выше конфигурацию и убедимся что библиотека появилась в указанном месте (lib/HelloServiceAPI.jar):
prompt> ant generate

Шаг 4

Теперь создадим в нашем проекте директорию web:
prompt> mkdir web

В ней разместим JSP страничку index.jsp с HTML формой, содержащей один единственный элемент для ввода Имени и кнопку, отправляющую значения формы на сервер. Также нам понадобится место, в которое будет выведен результат SOAP-запроса.

Конечно удобнее разрабатывать эту JSP в современном IDE, подключив сгенерированую на предыдущем шаге библиотеку, дабы IDE подсказала нам какие в этой библиотеки есть классы и как с ними работать из JSP. Но так как пример достаточно тривиальный, я сразу приведу код странички:

<%@page import="my.client.Hello"%><br><%@page import="my.client.HelloService"%><br><%@page contentType="text/html" pageEncoding="UTF-8"%><br><%<br><br>  String name;<br>  String result = null;<br>  if ((name = request.getParameter("name")) != null && !"".equals(name))<br>    {<br>      // Создаем объект Сервис<br>      HelloService service = new HelloService();<br>      // Получаем нужный “порт” (у нас он один)<br>      Hello hello = service.getHelloPort();<br><br>      // выполняем объявленную для данного порта операцию sayHello<br>      // в данный момент на низком уровне происходит создание SOAP запроса,<br>      // его отправка по HTTP и разбор ответа... от нас это все инкапсулированно<br>      result = hello.sayHello(name);<br>    }<br><br>%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"<br>  "http://www.w3.org/TR/html4/loose.dtd"><br><html><br>  <head><br>    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><br>    <title>Hello Client</title><br>  </head><br>  <body><br>    <form>Name: <input name="name" /> <input type="submit"/></form><br>    <% if (result != null) { %><br>      <br/>Result: <%= result %><br>    <% } %><br>  </body><br></html><br><br>* This source code was highlighted with Source Code Highlighter.


В таком виде, все SOAP запросы всегда будут идти на тот сервис, с которого была взята WSDL, но в реальности так называемый endpoint URL должен быть конфигурируемым. Это пригодится нам и при тестировании нашего клиента. Поэтому добавим еще одно поле на форму:

<form>Name: <input name="name" /><br/>Location: <input name="location" /><br/><input type="submit"/></form><br><br>* This source code was highlighted with Source Code Highlighter.


А также несколько строчек в обработчик формы:

<%@page import="java.util.Map"%><br><%@page import="javax.xml.ws.BindingProvider"%><br><%@page import="my.client.Hello"%><br>…<br><br>String name;<br>  String result = null;<br>  String url = request.getParameter("location");<br>  if ((name = request.getParameter("name")) != null && !"".equals(name))<br>    {<br>      HelloService service = new HelloService();<br>      Hello hello = service.getHelloPort();<br><br>      if (url != null && !"".equals(url)) {<br>        Map<String, Object> rc = ((BindingProvider) hello).getRequestContext();<br>// тут мы устанавливаем свой endpoint URL, вместо взятого автоматически из WSDL-файла        <br/>        rc.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);<br>      }<br><br>      result = hello.sayHello(name);<br>    }<br><br>* This source code was highlighted with Source Code Highlighter.


Шаг 5


В директории web создадим поддиректорию WEB-INF, в которой будут размещены два файла: web.xml и weblogic.xml — со следующим содержанием:

web.xml

<?xml version="1.0" encoding="UTF-8"?><br><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"<br>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br>xsi:schemaLocation="http://java.sun.com/xml/ns/javaee java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><br>  <welcome-file-list><br>    <welcome-file>index.jsp</welcome-file><br>  </welcome-file-list><br></web-app><br><br>* This source code was highlighted with Source Code Highlighter.


weblogic.xml

<?xml version="1.0" encoding="UTF-8"?><br><weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90"<br>xmlns:j2ee="http://java.sun.com/xml/ns/j2ee"<br>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br>xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 www.bea.com/ns/weblogic/90/weblogic-web-app.xsd"><br> <context-root>/HelloClient</context-root><br></weblogic-web-app><br><br>* This source code was highlighted with Source Code Highlighter.


В этих файлах мы указали JSP страницу, которая будет открываться по-умолчанию (welcome-file) и путь, по которому на сервере будет доступно наше веб приложение (context-root).

Шаг 6

В созданный ранее (на втором шаге) Ant-конфиг добавим еще один раздел, который автоматизирует для нас упаковку нашей библиотеки вместе с JSP страницей в веб приложение (WAR архив).

<target name="build" depends="generate"><br>    <war destfile="HelloClient.war" webxml="web/WEB-INF/web.xml"><br>     <fileset dir="web"/><br>     <lib dir="lib"/><br>    </war><br>  </target><br><br>* This source code was highlighted with Source Code Highlighter.


Данная задача поставлена в зависимость от задачи generate, следовательно при каждой пересборке архива будет запускаться генерация Веб Сервис API библиотеки.

Шаг 7

Запускаем сборку
prompt> ant build

Убедимся, что в директории проекта появился архив HelloClient.war

Шаг 8

Полученный архив устанавливаем на сервер также, как это было описано в разделе про разработку Веб Сервиса, шаг 7:
prompt> cp HelloClient.war /path/to/domain/autodeploy/


Протестировать его можно сразу, если соблюсти несколько условий. Во-первых, сам Веб Сервис (для которого мы написали клиента) должен быть развернут на сервере и запущен, во-вторых поле Location должно быть пустым, чтобы был взят endpoint URL по-умолчанию.

Ниже в разделе ‘Тестирование клиента’ я расскажу как протестировать наш клиент к Веб Сервису на эмуляторе с помощью SoapUI.

SoapUI


Расказывая про Веб Сервисы нельзя не упомянуть о мощнейшем инструменте, позволяющем тестировать как серверную так и клиентскую часть SOAP сервисов, это SoapUI. Скачиваем это приложение тут.

Есть бесплатные версии как для Microsoft Windows, так и для Linux дистрибутивов. Установка не вызовет проблем.

Тестирование сервиса


Для тестирования Веб Сервиса (его серверной части) нужно запустить SoapUI и создать новый проект, как показано на рисунке:



В поле Initial WSDL/WADL задаем WSDL файл, описывающий тестируемый сервис, причем можно указать как путь до файла на локальной машине, так и URL (что собственно и сделано в примере). Также ставим галочку возле Create Requests, это скажет SoapUI что нужно создать интерфейс для формирования SOAP запросов для каждой операции, которая описана в WSDL файле.



Наш Веб Сервис содержит только один метод — sayHello. Можно перейти на созданый под ним объект-запрос. Скриншот с Linux версии SoapUI выше. На нем видно, что можно прописать входные параметры, поправив XML и выполнить запрос (зеленый треугольник в левом углу). В итоге будет получен ответ сервиса также в формате XML.

Windows версия несколько богаче и содержит дополнительно дружественную пользователю форму ввода входных параметров.

Таким образом можно тестировать SOAP сервис написанный на любой платформе. Есть куча возможностей по конфигурированию запросов, например можно слать HTTP заголовки (Authorization например), можно выстраивать автоматическое тестирование и т.п.

Тестирование клиента


Для того чтобы протестировать клиентское приложение нужно заставить SoapUI работать в режиме эмуляции Веб Сервиса. Для этого создаем проект, как показанно на скриншоте ниже:



WSDL файл все тот же, для иллюстрации процесса мы будем эмулировать Веб Сервис, который по сути у нас уже написан. Но вообразим, что это некая стороняя система, доступа к которой мы пока не имеем, есть только WSDL и нам нужно убедиться что наш клиент работает.

Итак, мы указываем WSDL в поле Initial WSDL/WADL и ставим галочку возле Create MockService. Эта галочка скажет SoapUI что нужно создать эмулятор для операций, которые присутствуют в WSDL файле.
На втором шаге, нам будет предложенно выбрать конкретные операции, которые следует эмулировать.



Ставим галочку возле Start MockService и после нажания OK получаем эмулятор на порту 8088. Проверить что все действительно работает можно пройдя по ссылке:
http://localhost:8088/HelloMock?WSDL

Прежде чем перейти к нашему клиентскому приложению, неплохо бы настроить ответы, которые будет генерировать наш псевдо Веб Сервис. Для этого откроем объект-ответ под методом sayHello и поправим XML, который будет возвращаться клиенту на каждый вызов этой операции.



Теперь самое время вернуться к клиенту. Endpoint URL должен указывать на localhost:8088/HelloMock — адрес только что запущенного эмулятора Веб Сервиса. Пропишем эту строчку в поле Location нашей JSP страницы.



Нажимаем Submit Query. Рядом с кнопкой должен появиться результат запроса:



Если сейчас перейти в SoapUI то на эмуляторе HelloMock в разделе Message Log виден выполненный SOAP запрос. Его можно раскрыть и посмотреть о нем всю информацию.



Соответственно, если у нас нет под рукой реального Веб Сервиса, либо имеющийся не может быть использован для тестирования (продакшн сервер), правильным подходом будет — взять его WSDL файл и создать эмулятор. Тестировать на нем, играясь с выходными параметрами.

Заключение


В заметке я постарался доступно описать процесс разработки Веб Сервисов (как серверной части, так и клиента) на платформе Oracle WebLogic Server с использованием доступного инструментария (Ant задач jwsc и clientgen). Также были рассмотрены общие подходы к тестированию любых Веб Сервисов при помощи SoapUI.
Исходники серверной части тут.
Исходники клиентской части тут.
Официальная литература здесь.
Tags:
Hubs:
+5
Comments 7
Comments Comments 7

Articles