vineri, 24 octombrie 2008

Accesare webservice din oracle

Aceasta problema mi se pare extrem de interesanta, dar foarte putin documentata pe internet. Am avut nevoie de asa ceva la unul din taskurile pe care trebuie sa le fac astazi pentru un proiect. Pentru rezolvarea problemei a trebuit intai sa creez un serviciu web de test. Intrucat este extrem de usor de creat si de publicat utilizand tehnologia J2EE am ales aceasta cale. Presupunand ca utilizati eclipse, creati un modul ejb. Dupa ce ati creat acest modul, adaugati urmatoarele clase/interfete in el:

ro.anaf.ws.HelloWorldWS

package ro.anaf.ws;

import javax.ejb.Remote;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

@WebService
@SOAPBinding(style = Style.RPC)
@Remote
public interface HelloWorldWS
{
@WebMethod
public String helloWorld();

@WebMethod
public String receiveBinary(String s);
}


ro.anaf.ws.HelloWorldWSBean

package ro.anaf.ws;

import javax.ejb.Stateless;
import javax.jws.WebService;

@Stateless
@WebService(endpointInterface = "ro.anaf.ws.HelloWorldWS")
public class HelloWorldWSBean implements HelloWorldWS
{
public String helloWorld()
{
return "Salutari de pe WS";
}

public String receiveBinary(String s)
{
return "Am primat binarul: \"" + s + "\"";
}
}

Se poate remarca usor ca interfata reprezinta de fapt endpointul pentru serviciul web de test in timp ce clasa reprezinta implementarea operatiilor din endpoint. In acest moment serviciul web este implementat. Pentru a face deploy nu ramane decat sa creati un nou proiect de tip Enterprise Application si sa alegeti un server pe care sa faceti deploy. Personal, am folosit JBoss 4.2.3(ultima versiune stabila la aceasta data), dar puteti folosi orice alt container doriti. Dupa ce ati facut deploy la proiect puteti folosi adresa: http://localhost:8080/jbossws pentru a vizualiza lista de servicii web existente pe acest server. Ar trebui sa localizati si serviciul web pe care l-ati creat. In acest moment partea de java este incheiata.



Discutam acum de partea de oracle. Pentru inceput va trebui sa downloadati dbws-callout-utility-10131.zip. Dupa ce ati downloadat aceasta arhiva dezarhivati-o. In functie de versiunea utilizata va trebui sa executati una din comenzile de mai jos:
# 10gR2
loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb102.jar
# 11g
loadjava -u scott/tiger -r -v -f -genmissing dbwsclientws.jar dbwsclientdb11.jar
Obs: daca serverul nu ruleaza pe aceeasi masina pe care faceti development este posibil sa nu aveti utilitarul loadjava. Acesta este inclus in pachetul de developer ce poate fi downloadat gratuit de pe site-ul http://www.oracle.com.

Dupa ce ati executat pasii de mai sus, nu mai trebuie decat sa rulati scriptul urmator care realizeaza un test pentru metoda helloWorld:

declare
webservice utl_dbws.service;
webserviceCall utl_dbws.call;

wsdlURL VARCHAR2(1000) := 'http://10.18.14.32:8080/TestareServiciiEAR-ServiciiWeb/HelloWorldWSBean?wsdl';
webserviceNS VARCHAR2(1000) := 'http://ws.anaf.ro/';
webserviceName utl_dbws.qname;
webservicePort utl_dbws.qname;
webserviceOperation utl_dbws.qname;
params utl_dbws.anydata_list;
results anydata;
begin
webserviceName := utl_dbws.to_qname(webserviceNS, 'HelloWorldWSBeanService');
webservicePort := utl_dbws.to_qname(webserviceNS, 'HelloWorldWSBeanPort');
webserviceOperation := utl_dbws.to_qname(webserviceNS, 'helloWorld');

webservice := utl_dbws.create_service(wsdl_document_location => HTTPURITYPE(wsdlURL),
service_name => webservicename);

webserviceCall := utl_dbws.create_call(service_handle => webservice,
port_name => webservicePort,
operation_name => webserviceOperation);

results := utl_dbws.invoke(call_handle => webserviceCall, input_params => params);

utl_dbws.release_service(webservice);
utl_dbws.release_call(webserviceCall);

DBMS_OUTPUT.PUT_LINE(ANYDATA.AccessVarchar2(results));
end;


Setarile variabilelor: wsdlURL si webserviceNS le gasiti in wsdl. La fel si numele serviciului si numele portului. La executia blocului pl/sql de mai sus ar trebui sa primiti mesajul: 'Salutari de pe WS'.
La cele mentionate anterior mai exista un caz posibil care ar putea aparea: transmiterea parametrilor catre operatia serviciului web. Pentru a putea transmite parametrii trebuie sa utilizati vectorul params. De exemplu, pentru a adauga un parametru:
params(0):=ANYDATA.ConvertVarchar2('Cosnita Radu Viorel');
Pentru mai multe informatii consultati documentatia pentru ANYDATA.
Cam asta ar fi pentru azi. Nu ezitati sa adaugati comentarii despre acest articol.

Radu!

Niciun comentariu:

Trimiteți un comentariu