Главная » Java, Web, XML » Клиент, использующий описание WSDL

0

Клиенты второго типа обращаются к Web-службе по ее описанию, сделанному на языке WSDL. При этом обращении создается заглушка и пересылается на клиентскую машину. Методы, помогающие клиенту системы JAX- RPC обратиться к WSDL-описанию Web-службы, описаны в интерфейсе Service пакета                                      Интерфейс service предназначен для связи

с SOAP-сервером и получения информации о вызываемой Web-службе.

Объект типа service создается уже знакомым путем с помощью класса- фабрики ServiceFactory:

ServiceFactory sf = ServiceFactory.newlnstance(); Service serv = sf.createService(QName serviceName);

При создании объекта serv сразу указывается название Web-службы serviceName. Второй метод создания объекта типа service

public Service createService (URL wsdl, QName serviceName);

требует указать адрес wsdl WSDL-описания Web-службы.

После того как объект типа Service создан, можно получить заглушку одним ИЗ двух МетОДЭВ getPort ().

Если объект serv был создан первым способом и адрес wsdl WSDL- описания ему еще неизвестен или описание содержит несколько SEI- интерфейсов, то применяем метод

public Remote getPort (QName wsdlName, Class sei) ; в котором аргумент wsdlName содержит имя

Если же эти сведения уже указаны, то можно применить второй метод public Remote getPort (Class sei);

В листинге 6.14 показан пример клиента нашей Web-службы Bookinfo, обращающегося к ней через описание WSDL.

Листинг 6.14. Клиент, использующий описаниеМУ801.

import javax.xml.namespace.QName; import bookinfo.*;

public class BookInfoProxyClient{

public static void main (String [ ] args){ try{

String ns = "http://bookinfo.com/wsdl/";

URL wsdl = new URL (

"http://localhost:8080/services/bookinfo?WSDL");

ServiceFactory sf = ServiceFactory.newlnstance();

Service serv = sf.createService(wsdl,

ne^ ^^Mefns, "Bookinfo"));

BooklnfoPort bip = (BooklnfoPort)serv.getPort( new QName(ns, "BooklnfoPort"), book.BooklnfoPort.class) ;

Book book = bip.getInfo("5-94157-041-4") ;

System.out.println(book.getTitleO);

ex)(

ex.printStackTrace();

}

}

}

Клиент, динамически получающий Web-услуги

В тех случаях, когда нет заранее созданных заглушек и недоступно WSDL- описание Web-службы, клиент может динамически получить Web-услуги методами, описанными в интерфейсе Call. Методы интерфейса call задают аргументы вызываемой Web-услуги, вызывают ее и получают результат. Для их использования не нужен даже SEI-интерфейс и сопутствующие ему классы. Достаточно знать название Web-службы, имя SEI-интерфейса и сигнатуру метода вызываемой Web-услуги.

Объект типа call создается одним из методов createCall() интерфейса Service. Получив объект serv типа Service, применяем один из следующих его методов:

public Call createCall();

public Call createCall(QName portName);

public Call createCall (QName portName, QName operationName);

public Call createCall (QName portName, String operationName);

Аргумент portName — это имя SEI-интерфейса Web-службы, представленное в виде объекта класса QName. Аргумент operationName — это имя метода, предоставляющего Web-услугу.

После создания объекта типа call, его нужно дополнить недостающими сведениями. Для этого в интерфейсе Call описаны методы

public void setOperationName(QName operationName); public void setPortTypeName (QName portType) ; public void setReturnType(QName xmltype);

public void setTargetEndpointAddress(String address);

Кроме того, надо описать типы аргументов вызываемого метода. Это выполняется методами

public void addParameter (String name, QName xmlType,

mode);

public void addParameter (String name, QName xmlType,

Class javaType, ParameterMode mode) ;

Первые аргументы задают произвольное имя для аргумента name, его XSD- тип xmlType, соответствующий тип Java javaType, если для этого типа нет стандартного соответствия типов XML и Java.

Последний аргумент mode — это одна из трех констант класса

ParameterMode:

? ParameterMode. IN — указывает, что описываемый аргумент является входным аргументом метода;

•   ParameterMode,OUT — указывает, что описываемый аргумент является выходным аргументом метода;

•   ParameterMode. INOUT — указывает, что описываемый аргумент может быть и входным и выходным аргументом метода.

Наконец, определяются свойства объекта типа Call, например, имя и пароль пользователя. Свойства устанавливаются методом

public void setProperty (String name, Object value) ;

В интерфейсе Call определены имена некоторых свойств.

•   username_property — строка типа string с именем пользователя Web- службы;

•   password_property — строка типа string с паролем пользователя Web- службы;

•   encodingstyle_uri_property — строка ТИПа String С идентификатором пространства имен типов;

•   session_maintain_property — объект ТИПа Boolean, указывающий, СОЗдавать сеанс связи с Web-службой или нет. По умолчанию сеанс не создается.

•   OPERATION_STYLE_PROPERTY — СТрОКа "грс" ИЛИ "document", ОПредеЛЯЮщая процедурный или документный стиль SOAP-послания;

•   SOAPACTION_USE_PROPERTY — объект ТИПа Boolean, указывающий, ИСпользовать или нет поле SOAPAct ion заголовка SOAP-послания; по умолчанию это поле не используется;

•   soapactionjjri_property — строка ТИПа String С содержимым ПОЛЯ SOAPAction заголовка SOAP-послания.

После того как объект типа Call сформирован, можно обратиться к Web- службе и сразу получить Web-услугу одним из методов

public Remote invoke (Object[J args);

public Remote invoke(QName operationName, Object[] args}; public void invokeOneWay(Object!] args);

В листинге 6.15 приведен пример динамического получения Web-услуги от нашей Web-службы Bookinfb.

Листинг 6.15. Клиент, использующий дин амический вызов

import j avax. xml. грс. * ;

import j avax.xml.namespace.QName;

public class BooklnfoDynamicClient)

private static String BODY_NAMESPACE_VALUE =

"http://bookinfo.com/wsdl/";

private static String ENCODING_STYLE_PROPERTY =

"j avax.xml.rpc.encodingstyle.namespace.uri";

private static String NS_XSD =

"http: //wwwr.w3.org/2001/XMLSchema";

private static String uri_encoding =

"http: //schemas .xmlsoap. org/soap/encoding/" ;

public static void main (string [ ] args) {

try{

ServiceFactory sf =

ServiceFactory.newlnstance() ; Service serv =

sf.createService(newQName("Booklnfo") ) ;

QName port = new QName ("BooklnfoPort") ;

Call call = serv.createCall(port);

call.setTargetEndpointAddress(

"http://localhost:8080/services/bookinfo");

call.setProperty(Call.SOAPACTIONJJSE_PROPERTY,

new Boolean(true)); call.setProperty(Call.SOAPACTION__URI_PROPERTY," " ) ; call.setProperty(ENCODING_STYLE_PROPERTY, URI_ENCODING);

QName xsdString = new QName (NS_XSD, "string" ) ;

call.setReturnType(xsdString);

call. setOperationName (new QName (BODY_NAMESPACE_VALUE, "getlnfo"));

call.addParameter("Stringl", xsdString, ParameterMode.IN);

String[] params = { "5-94157-041-4" };

String title = (String) call, invoke (params)

System.out.println(title) ;

}catch(Exception e) {

System.err.println(e) ;

)

}

}

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии