jueves, 23 de mayo de 2013

Supongamos que tenemos que consumir un servicio desplegado en el Application Server de WSO2.

El WSDL del servicio es el siguiente:
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://org.apache.axis2/xsd" xmlns:ns="http://serviciosaxis2.ejemplos.blogs.org" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://serviciosaxis2.ejemplos.blogs.org">

  <wsdl:types>

    <xs:schema xmlns:ax24="http://serviciosaxis2.ejemplos.blogs.org/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://serviciosaxis2.ejemplos.blogs.org">

         <xs:element name="holaati">

            <xs:complexType>

               <xs:sequence>

                  <xs:element minOccurs="0" name="persona" nillable="true" type="ns:Persona"/>

               </xs:sequence>

            </xs:complexType>

         </xs:element>

         <xs:element name="holaatiResponse">

            <xs:complexType>

               <xs:sequence>

                  <xs:element minOccurs="0" name="return" nillable="true" type="ns:PersonaRespuesta"/>

               </xs:sequence>

            </xs:complexType>

         </xs:element>

                  <xs:complexType name="Persona">

            <xs:sequence>

               <xs:element minOccurs="0" name="apellidos" nillable="true" type="xs:string"/>

               <xs:element minOccurs="0" name="nombre" nillable="true" type="xs:string"/>

            </xs:sequence>

         </xs:complexType>

         <xs:complexType name="PersonaRespuesta">

            <xs:sequence>

               <xs:element minOccurs="0" name="saludo" nillable="true" type="xs:string"/>

            </xs:sequence>

         </xs:complexType>

      </xs:schema>

  </wsdl:types>

  <wsdl:message name="holaatiResponse">

    <wsdl:part name="parameters" element="ns:holaatiResponse">

    </wsdl:part>

  </wsdl:message>

  <wsdl:message name="holaatiRequest">

    <wsdl:part name="parameters" element="ns:holaati">

    </wsdl:part>

  </wsdl:message>

  <wsdl:portType name="HolamundoPortType">

    <wsdl:operation name="holaati">

      <wsdl:input message="ns:holaatiRequest" wsaw:Action="urn:holaati">

    </wsdl:input>

      <wsdl:output message="ns:holaatiResponse" wsaw:Action="urn:holaatiResponse">

    </wsdl:output>

    </wsdl:operation>

  </wsdl:portType>

  <wsdl:binding name="HolamundoSoap11Binding" type="ns:HolamundoPortType">

    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="holaati">

      <soap:operation soapAction="urn:holaati" style="document"/>

      <wsdl:input>

        <soap:body use="literal"/>

      </wsdl:input>

      <wsdl:output>

        <soap:body use="literal"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:binding name="HolamundoHttpBinding" type="ns:HolamundoPortType">

    <http:binding verb="POST"/>

    <wsdl:operation name="holaati">

      <http:operation location="holaati"/>

      <wsdl:input>

        <mime:content part="parameters" type="text/xml"/>

      </wsdl:input>

      <wsdl:output>

        <mime:content part="parameters" type="text/xml"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:binding name="HolamundoSoap12Binding" type="ns:HolamundoPortType">

    <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

    <wsdl:operation name="holaati">

      <soap12:operation soapAction="urn:holaati" style="document"/>

      <wsdl:input>

        <soap12:body use="literal"/>

      </wsdl:input>

      <wsdl:output>

        <soap12:body use="literal"/>

      </wsdl:output>

    </wsdl:operation>

  </wsdl:binding>

  <wsdl:service name="HolamundoWSDL">

    <wsdl:port name="HolamundoHttpEndpoint" binding="ns:HolamundoHttpBinding">

      <http:address location="http://192.168.0.37:9765/services/HolamundoWSDL.HolamundoHttpEndpoint/"/>

    </wsdl:port>

    <wsdl:port name="HolamundoHttpSoap11Endpoint" binding="ns:HolamundoSoap11Binding">

      <soap:address location="http://192.168.0.37:9765/services/HolamundoWSDL.HolamundoHttpSoap11Endpoint/"/>

    </wsdl:port>

    <wsdl:port name="HolamundoHttpSoap12Endpoint" binding="ns:HolamundoSoap12Binding">

      <soap12:address location="http://192.168.0.37:9765/services/HolamundoWSDL.HolamundoHttpSoap12Endpoint/"/>

    </wsdl:port>

  </wsdl:service>

</wsdl:definitions>





Abrimos el eclipse y vamos al dashboard del Developer Studio y seleccionamos la opción “Generate Axis2 Web Service Client”

En dependencia de donde tengamos nuestro servicio será la opción que marcaremos y cargaremos el fichero. En mi caso usaré esta URL: http://192.168.0.37:9765/services/HolamundoWSDL?wsdl que se corresponde con el último servicio que desplegamos en la otra entrada.

Ahí nos pedirá que creemos  un proyecto si no tenemos uno aun.

Creamos el proyecto y damos Finish.


Ahora se nos muestra esta pantalla y damos Finish igual.



Así ya hemos creado el proyecto completo del cliente del servicio como pueden ver a continuación.


Crearemos una clase que será la que consumirá el servicio. La clase que ven que se creó automáticamente contiene la funcionalidad para interactuar con el servicio web.
Esta clase quedará de la siguiente manera:

Si la prueban ahora les dará un error porque faltan algunas dependencias. En esto nos ayuda el Developer Studio.
Damos clic derecho en el proyecto y nos vamos a configurar el Build Path.


Seleccionamos Add Library y luego damos en WSO2 ClassPath Libraries.

Damos en Next y marcamos todas las de Axis2.

Y en la pestaña del IS marcamos lo siguiente:


Por ultimo nos falta agregar una librería que fue introducida recientemente en el framework carbon y que no viene en la versión del Developer Studio que estoy empleando, por lo que tengo que buscarle en:
[AS]\repository\components\plugins\ org.wso2.securevault_1.0.0.wso2v2.jar la agregamos y listo. Ya podemos ejecutar nuestro cliente.

Cuando ejecutamos nuestra clase vemos la siguiente respuesta:


Lo que nos indica que obtuvimos la respuesta del servicio web que esperábamos.

Luego de ejecutar el cliente varias veces podemos ir al dashboard del servicio y ver la estadísticas de su uso.



Y bueno eso es todo hasta el momento.


2 comentarios:

  1. Buen día,
    Una duda que me surge en este caso de consumo desde el contenedor que seria mejora aplicar, como el ejemplo usando soap y con una implementacion rest en el cliente ?
    Teniendo en cuenta eficiencia y facilidad en el mantenimiento de codigo.

    ResponderEliminar
  2. Hola @Cesar.
    Estoy preparando una entrada donde podrás ver como expongo un servicio de acceso a datos en WSO2 como un servicio RESTful y luego estoy preparando otra entrada donde implemento un cliente REST usando jersey. Y para finalizar uso XStream para obtener la información del XML.
    Creo que con estas entradas se podrá ver la eficiencia, en cuanto a tiempo de respuestas y la facilidad para mantener el código pues daré tanto el proyecto REST como el axis2 como proyectos maven para que los prueben los interesados.

    ResponderEliminar