16 Temmuz 2010 Cuma

SOAPHeader with Java

WSDL tanımlaması yaparken soap mesajın header’ında gitmesini istedigimiz iletiler için WSDL tanımlamasına soap:header ekleriz .Bu tanımlama tamamen opsiyoneldir. WSDL, SOAP Header tanımlamasını input ve output mesajları için ayrı ayrı yapmamıza imkan vermektedir. Böylece istedigimiz mesajları soap mesajın header’ında istemde mi gönderelim? yoksa sonucta mı alalım? kararını verebiliriz. Header için tanımlanan nesne için ayrı bir wsdl:message tanımlamamız durumunda WSDL den Apache Axis ile kodları oluşturdugumuz durumda maalesef header için tanımladıgımız sınıfları yaratmamaktadır. İlgili header sınıfının Axis tarafından yaratılması için wsdl:input için tanımlanan message ın referans gösterdigi wsdl:message içinde header’ı wsdl:part olarak tanımlamız gerekmektedir. Aşağıdaki gibi tanımlamımızı yaparsak Apache Axis, header tanımlamalarımız için ilgili sınıfları yaratır ve tanımladıgımız metodlara parametre olarak set eder.

<wsdl:message name=" "> //input icin tanımlanan message

<wsdl:part name=" " element=" "/>

<wsdl:part name=" " element=" "/> //Header icin tanımlanan part

<\wsdl:message>

<wsdl:input>

<soap:body use="literal"/>

<soap:header use="literal" part=" " message=" ">soap:header>

<\wsdl:input>

<wsdl:output>

<soap:body use="literal"/>

<soap:header use="literal" part=" " message=" ">soap:header>

<\wsdl:output>

Header için ayrı bir wsdl:message tanımlamamız durumunda Axis, header için tanımlanan ilgili sınıfları yaratmamamaktadır bu da Soap Header mesajlarını işleyememize neden olmaktadır. Yaratılmaması durumunda servis çağrımında ya da sonucunda soap header’ı kodlamamız gerekir. Axis Handler’dan türeyen tanımladığımız sınıf içinde SOAPHeader’ı aşağıdaki gibi kodlarız.

SOAPMessage soapMessage = messageContext.getResponseMessage();

SOAPHeader soapHeader = (SOAPHeader) soapMessage.getSOAPHeader();

SOAPHeaderElement soapHeaderElement = new org.apache.axis.message.SOAPHeaderElement("", "");

SOAPElement transactionIdElement = soapHeaderElement.addChildElement("");

soapHeaderElement.addTextNode();

soapHeader.addChildElement(soapHeaderElement);

Hiç yorum yok: