Home| New Wiki | | Login | User registry | Home Tree PDF
WebServices con Axis
Owner:csilva, Version: 4, Date:Wed 29, November 2006,

Como implementar WebServices?

Si tienen la pregunta: ¿Que es un WebService? es por que deben leer un poco (viva google). Pero en resumen:

Un webservice es un servicio que puede ser invocado desde internet. Los parametros y la respuesta del servicio estan en XML y se implementa normalmente a traves de Servlets especiales que leen un request hecho por una aplicacion (no por un browser), procesan y responden.

Bueno, para implementar hay varias opciones:

  • Usar la implementacion de IBM WebSphere. Crear un Bean, EJB y luego "Envolverlo" con un webservice (wrapper)
  • Usar la implementacion de WebLogic (Workshop) que permite usar una interfaz especifica y mas general.
  • Usar una implementacion "abierta". Requiere normalmente instalar nuevos Modulos y servicios y puede ser dificil de configurar. En esta categoria entra el JWSDP de Sun.

Axis de Jakarta

Esta indicacion describe el uso de jakarta Axis, proyecto abierto

y que es el módulo de soporte a WS utilizado en OC4J (AppServer de Oracle).

¿Porque Axis?

  • liviano
  • facil de configurar
  • pocas clases, jars, etc
  • independiente del App Server.

¿Entonces: como se hace un Web Service?

0) Bajar Axis (desde jakarta.apache.org)

1) Se crea un proyecto J2EE 1.3 nuevo con al menos un modulo Web. El contexto del modulo Web debe ser: "axis"

2) Se copia a WEB-INF/lib:

   axis.jar
   axis-ant.jar
   log4j-1.2.8.jar

3) En el caso de usar WebSphere App developer, se configura el Java Build Path del proyecto Web para incluir los siguientes JAR (en el caso de eclipse se reemplazan por axis):

   WAS_50_PLUGINDIR/lib/webservices.jar
   WAS_50_PLUGINDIR/lib/wsdl4j.jar

3) Se instalan los servlets de Axis que dan soporte a WebServices

<servlet>
 <servlet-name>AxisServlet</servlet-name>
 <display-name>Apache-Axis Servlet</display-name>
   <servlet-class>org.apache.axis.transport.http.AxisServlet</servlet-class>
</servlet>

<servlet>
 <servlet-name>AdminServlet</servlet-name>
 <display-name>Axis Admin Servlet</display-name>
 <servlet-class>org.apache.axis.transport.http.AdminServlet</servlet-class>
 <load-on-startup>100</load-on-startup>
</servlet>

<servlet-mapping>
 <servlet-name>AxisServlet</servlet-name>
 <url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<!-- COMENTARIO (ver mas adelante)
<servlet-mapping>
 <servlet-name>AxisServlet</servlet-name>
 <url-pattern>*.jws</url-pattern>
</servlet-mapping>
-->
<servlet-mapping> 
 <servlet-name>AxisServlet</servlet-name>
 <url-pattern>/services/*</url-pattern>
</servlet-mapping>

Otra opcion es copiar el archivo web.xml provisto en la distribucion de axis.

El servlet-mapping de AxisServlet para archivos .jws no debe usarse en Websphere debido a que debe configurarse especialmente para que compile algunos archivos .jws(java) a medida que se requiere (hot).

4) Crear la clase que dará soporte al WebService: csa.Test

Este WS retorna la fecha de la base de datos utilizando un DataSource a traves de un alias.

package csa;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class Test {
 public String getHello() throws Exception {
   return "Hola";
 }
 public String getDate() throws Exception {
   Date d = null;
   InitialContext ic = new InitialContext();
   DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/DB");
   Connection conn = ds.getConnection();
   PreparedStatement ps = conn.prepareStatement("select current from testtable");
   ResultSet rs = ps.executeQuery();
   if (rs.next()){
     d = rs.getDate(1);
   }
   rs.close();
   ps.close();
   conn.close();
   return d.toString();
 }
}

5) Indicarle a Axis que esta clase representa un WebService.

En el archivo server-config.wsdd debe haber un servicio como el siguiente:

<service name="TestWS" provider="java:RPC">
 <parameter name="className" value="csa.Test" />
 <parameter name="allowedMethods" value="getHello,getDate" />
 <parameter name="allowedRoles" value="*"/>
 <requestFlow type="checks"/>
</service>

El archivo server-config contiene varias otras definiciones (que no son importantes por el momento)

6) Crear el datasource para conectarse a la base de datos en la configuracion del servidor

7) Crear el alias para el modulo web

<resource-ref>
 <res-ref-name>jdbc/DB</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
 <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>


8) Levantar el servidor y conectarse a :

http://localhost:9080/axis/services/TestWS?method=getDate

El resultado debe ser similar a:

<soapenv:Envelope>
 <soapenv:Body>
 <getDateResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <getDateReturn xsi:type="xsd:string">2004-07-30</getDateReturn>
 </getDateResponse>
 </soapenv:Body>
</soapenv:Envelope>

Notas

1 Se utilizo un SQL Select para obtener la fecha de la base de datos, y se uso una tabla cualquiera para generar los datos (de preferencia una tabla con pocas filas).

2 current es la funcion de INFORMIX que retorna la fecha actual.

3 El paso 7, es solo una prueba de llamada al WebService, no es la forma correcta de llamar a un WS.

4 Para llamar a un WS se debe usar un cliente de WebService. Un cliente de ejemplo viene con Axis:

C:tmpaxis-1_1axis-1_1>java 
   samples.client.DynamicInvoker 
   "http://localhost:80/axis/services/TestWS?wsdl" getDate

Genera la siguiente respuesta

Reading WSDL document from 'http://localhost:9080/axis/services/TestWS?wsdl'
Preparing Axis dynamic invocation
Executing operation getDate with parameters:
Result:
getDateReturn=2004-07-30
 
Done!

5 El WebService podria usar llamadas a EJBs :)

6 La llamada al WebService: 'http://localhost:9080/axis/services/TestWS?wsdl' Permite obtener la descripcion interna del webservice. que es un archivo XML con informacion de los metodos provistos y los parametros para cada metodo.

7 Muchas cosas ocurren "detras de escena", hay mucho trabajo con XML que no se ve.

8 Se recomienda que busquen respuesta a las siguientes preguntas:

  • Que tipos de parametros para las funciones son validos ?
  • Que pasa si el WS demora mucho en contestar ?
  • Puedo segurizar un WS con usuario y password ?
  • Puedo segurizar la llamada al WS con SSL ?
  • Puedo tener transacciones entre varias llamadas a WS ?

Post datum

El archivo server-config.wsdd es generado automaticamente cuando se usa un programa cliente (de axis) para instalar nuevos servicios.


El programa cliente es:

java -cp %AXISCLASSPATH%
     org.apache.axis.client.AdminClient
     -lhttp://localhost:8080/axis/services/AdminService
     <servicio.wsdd>

Que hace este cliente?

  • genera el archivo server-config.wsdd si no existe.
  • Genera una carpeta attachments para cargar archivos adjuntos en los mensajes XML
  • genera una nueva seccion "service" dentro del archivo server-config.xml donde copia el contenido del archivo .wsdd indicado.

Sin embargo es posible crear directamente el archivo (cambiando la referencia a la carpeta de attachments).

Listado 1: server-config.wsdd:

<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" 
             xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<globalConfiguration>
 <parameter name="adminPassword" value="admin"/>
 <parameter name="attachments.Directory" 
     value="C:...TestAxisWebWebContentWEB-INFattachments"/>
 <parameter name="attachments.implementation"
     value="org.apache.axis.attachments.AttachmentsImpl"/>
 <parameter name="sendXsiTypes" value="true"/>
 <parameter name="sendMultiRefs" value="true"/>
 <parameter name="sendXMLDeclaration" value="true"/>
 <parameter name="axis.sendMinimizedElements" value="true"/>
 <requestFlow>
  <handler type="java:org.apache.axis.handlers.JWSHandler">
   <parameter name="scope" value="session"/>
  </handler>
  <handler type="java:org.apache.axis.handlers.JWSHandler">
   <parameter name="scope" value="request"/>
   <parameter name="extension" value=".jwr"/>
  </handler>
 </requestFlow>
</globalConfiguration>
<handler name="LocalResponder" 
   type="java:org.apache.axis.transport.local.LocalResponder"/>
<handler name="URLMapper" 
   type="java:org.apache.axis.handlers.http.URLMapper"/>
<requestFlow name="checks">
 <handler 
   type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
 <handler 
   type="java:org.apache.axis.handlers.SimpleAuthorizationHandler"/>
</requestFlow>
<handler name="Authenticate" 
   type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>

<!--ESPACIO PARA COLOCAR SERVICIOS -->

<service name="TestWS" provider="java:RPC">
<parameter name="className" value="csa.Test" />
<parameter name="allowedMethods" value="getHello,getDate" />
<parameter name="allowedRoles" value="*"/>
<requestFlow type="checks"/>
</service>

<!--ESPACIO PARA COLOCAR SERVICIOS -->

<transport name="http">
 <requestFlow>
  <handler type="URLMapper"/>
  <handler 
    type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
 </requestFlow>
</transport>
<transport name="local">
 <responseFlow>
  <handler type="LocalResponder"/>
 </responseFlow>
</transport>
</deployment>


History - Extract PDF - Extract Tree as PDF

Last Modified

Sun, May 18 Mon, May 12 Mon, Apr 28 Sun, Apr 13 Mon, Mar 24 Sat, Feb 23 Tue, Feb 19 Sat, Feb 16 Wed, Feb 13

Home| New Wiki