Buscar en el Blog

Mostrando entradas con la etiqueta Servicios Web. Mostrar todas las entradas
Mostrando entradas con la etiqueta Servicios Web. Mostrar todas las entradas

viernes, 22 de mayo de 2015

Cómo invocar a un servicio web SOAP usando curl

En ésta publicación explico el procedimiento para invocar un Servicio Web SOAP usando la herramienta de línea de comandos curl.

Para probarlo voy a invocar un servicio web de WebserviceX.NET para obtener la tasa de conversión de monedas (CurrencyConvertor) entre USD y EUR

1. Crear un archivo XML con el contenido de la petición (Request) que se hará al servicio web. En mi caso lo llamaré request.xml con el siguiente contenido:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.webserviceX.NET/">
   <soapenv:Header/>
   <soapenv:Body>
      <web:ConversionRate>
         <web:FromCurrency>USD</web:FromCurrency>
         <web:ToCurrency>EUR</web:ToCurrency>
      </web:ConversionRate>
   </soapenv:Body>
</soapenv:Envelope>
2. Para invocar el servicio web usando la petición XML (Request) guardada en el archivo, ejecutar el siguiente comando:
curl -H "Content-Type: text/xml; charset=utf-8" -H "SOAPAction:"  -d @request.xml -X POST http://www.webservicex.net/CurrencyConvertor.asmx -o response.xml
Sí se desea almacenar la respuesta (Response) del servicio web en un archivo usar el argumento -o seguido del nombre del archivo (response.xml)

martes, 8 de mayo de 2012

Cómo configurar Adobe Flash Builder 4.5 para que se conecte a servicios web seguros (HTTPS)

En ésta publicación explico el procedimiento para que a través de Adobe Flash Builder 4.5 instalado sobre Windows, podamos crear  clientes para servicios web seguros expuestos sobre el protocolo HTTPS.

Supongamos que tenemos el siguiente servicio web expuesto sobre HTTPS:

URL = https://midominio.com/ServicioWebSeguro?wsdl

Exportación del Certificado con Firefox

Usando Firefox, abrimos una nueva ventana con el URL, y vamos a:

Tools (Herramientas) > Page Info (Información de Página) > Security (Seguridad) > View Certificate (Ver Certificado)

En la pestaña de Details (Detalles), damos clic en Export (Exportar) para exportar el certificado de seguridad del servicio web. Para éste ejemplo lo guardamos en el siguiente directorio:

c:\certs\serviciowebseguro.crt

Exportación del Certificado con Internet Explorer (IE)

Usando IE, abrimos una nueva ventana con el URL, damos clic derecho, opción Certificados > Detalles > Copiar en archivo...

Registro del certificado usando keytool

Abrimos una consola de comandos (cmd)y ejecutamos el siguiente comando:

keytool -import -alias cert1 -keystore "c:\certs\truststore.jks" -file c:\certs\serviciowebseguro.crt

NOTA: es necesario tener instalado el JRE para acceder directamente a la herramienta keytool. La herramienta también se encuentra en el directorio de instalación del JDK, en mi caso (C:\Program Files\Java\jdk1.6.0_26\bin)

Modificar el archivo FlashBuilder.ini

En el directorio de instalación de Adobe Flash Builder 4.5, en mi caso: (C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.5), editamos el archivo FlashBuilder.ini y colocamos:

-Djavax.net.ssl.trustStore="c:\certs\truststore.jks"

Abrimos Adobe Flash Builder 4.5, en la opción de Data > Connect to Web Service colocamos el URL del servicio web seguro y el IDE generará el cliente de servicio web. 








viernes, 1 de julio de 2011

Cómo publicar un archivo crossdomain.xml en Mule 2.2.1 Standalone

En ésta publicación explico el procedimiento para publicar un archivo crossdomain.xml en Mule2.2.1.

El archivo crossdomain.xml es requerido por las aplicaciones Flex/Flash para poder consumir servicios web que se encuentran en diferentes dominios.

En el archivo de configuración de la aplicación de Mule, se tiene que incluir lo siguiente:

<jetty:connector name="jetty" useContinuations="false" />

<!-- ... -->
<service name="crossdomain">
    <inbound>
  <jetty:inbound-endpoint address="http://127.0.0.1:80/crossdomain.xml"
                                        connector-ref="jetty"
                                        synchronous="true" method="GET">
   <not-filter>
    <wildcard-filter pattern="/favicon.ico"/>
            </not-filter> 
            <response-transformers>
    <message-properties-transformer>
     <add-message-property key="Content-Type" value="application/xml"/>
                </message-properties-transformer>
            </response-transformers>
        </jetty:inbound-endpoint>
    </inbound>
    <component>
        <singleton-object class="org.mule.component.simple.StaticComponent">
   <property key="dataFile" value="flex/crossdomain.xml"/>
  </singleton-object>
 </component>
</service>


Nótese que para ésta configuración el archivo crossdomain.xml tendrá que ser colocado en el directorio %MULE_HOME%\lib\user\flex

jueves, 22 de julio de 2010

Cómo exponer un servicio web en Mule 2 usando Apache Axis - Parte 2

En mi anterior publicación explicaba cómo exponer un servicio web en Mule 2 usando Apache Axis. Este servicio web tenía el método helloAxis() el cuál recibía y devolvía cadenas de texto (java.lang.String). En ésta parte 2 de mi publicación explico cómo exponer un servicio web usando objetos (beans) que no forman parte del API de Java. Estos objetos son los siguientes:


Bean Field

package com.blogspot.ingmmurillo.axisws;

import java.io.Serializable;

public class Field implements Serializable{

    private String name;
    private String value;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        String result = "";
        result += "" + name + "";
        result += "" + value + "";
        result += "";
        return result;
    }
}

Como se puede observar se sobreescribe el método toString() usando tags XML para mostrar el contenido de las variables de instancia del objeto. Además, es importante que los beans que se definan implementen la interface java.io.Serializable.

Bean Message

package com.blogspot.ingmmurillo.axisws;

import java.io.Serializable;

public class Message implements Serializable {

    private Field[] fields;
    private String from;
    private String to;

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public Field[] getFields() {
        return fields;
    }

    public void setFields(Field[] fields) {
        this.fields = fields;
    }

    @Override
    public String toString() {
        String result = "";
        if (fields != null) {
            if (fields.length > 0) {

                for (Field f : fields) {
                    result += f;
                }
            }
        }
        result += "" + from + "";
        result += "" + to + "";
        result += "";

        return result;
    }
}

Como se puede observar este bean tiene un arreglo de objetos de tipo Field. De igual forma se sobreescribe el método toString() usando tags XML.

Interface WSComplexDataTypes

package com.blogspot.ingmmurillo.axisws;

public interface WSComplexDataTypes {

    public String sendMessage(Message msg);

}

La interface define el método sendMessage() el cúal recibe como parámetro un objeto de tipo com.blogspot.ingmmurillo.axisws.Message.

Clase WSComplexDataTypesImpl

package com.blogspot.ingmmurillo.axisws;

public class WSComplexDataTypesImpl implements WSComplexDataTypes {

    public String sendMessage(Message msg) {
        return msg.toString();
    }
}


Esta clase contiene la implementación del método sendMessage() el cual hace una llamada al método toString() el cual fue redefinido para cada Bean. Cuando se invoque al servicio web se devolverá el contenido en XML.

Configuración en Mule

<service name="wsComplexData">
            <inbound>
                <axis:inbound-endpoint
                        address="http://localhost:8282/webservices/axis"
                        serviceNamespace="http://ingmmurillo.blogspot.com/webservices/axis"
                        synchronous="true">
                </axis:inbound-endpoint>
            </inbound>
            <component class="com.blogspot.ingmmurillo.axisws.WSComplexDataTypesImpl"/>
        </service>


Pruebas

El servicio web será publicado en Mule bajo el siguiente URL:
http://localhost:8282/webservices/axis/wsComplexData?wsdl Obsérvese que el URL del servicio web se compone de la siguiente forma:

[address]/[service name]?wsdl

Se usó soapUI v3.5 para realizar las pruebas de invocación al servicio web como se puede observar a continuación:



Nótese cómo se arma el XML de invocación al servicio web:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:axis="http://ingmmurillo.blogspot.com/webservices/axis" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
   <soapenv:Header/>
   <soapenv:Body>
      <axis:sendMessage soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <in0>
            <fields>
               <field>
                  <name>FirstName</name>
                  <value>Mauricio</value>
               </field>
               <field>
                  <name>LastName</name>
                  <value>Mauricio</value>
               </field>
            </fields>
            <from>My Blog</from>
            <to>The World</to>
         </in0>
      </axis:sendMessage>
   </soapenv:Body>
</soapenv:Envelope>



Obteniéndose la siguiente respuesta del servicio web publicado en Mule:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns1:sendMessageResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://ingmmurillo.blogspot.com/webservices/axis">
         <sendMessageReturn xsi:type="xsd:string"><![CDATA[<fields><field><name>Nombre</name><value>Mauricio</value></field><field><name>Apellido</name><value>Mauricio</value></field><from>Blog</from><to>El mundo</to></fields>]]></sendMessageReturn>
      </ns1:sendMessageResponse>
   </soapenv:Body>
</soapenv:Envelope>

viernes, 21 de mayo de 2010

Tarea de Ant para generar clientes de servicios web usando Apache Axis

A continuación comparto la tarea de Apache Ant para poder crear los client stubs para consumir servicios web usando Apache Axis.

La última versión de Apache Axis es la v1.4, se lo puede descargar del siguiente link: http://www.apache.org/dyn/closer.cgi/ws/axis/1_4

La tarea de Ant para crear los client stubs de un servicio web es la siguiente:

<property name="axis.home" location="${lib.home}/apache-axis-1.4"/>

    <target name="axis-generate-client-stubs" depends="init"
            description="Generate the client stubs for a web service">
        <path id="axis.path">
            <fileset dir="${axis.home}/lib">
                <include name="*.jar"/>
            </fileset>
        </path>
        <java classname="org.apache.axis.wsdl.WSDL2Java" fork="true">
            <arg value="-client"/>
            <arg value="-o"/>
            <arg value="${javaproject.home}/src-generated"/>
            <arg value="http://www.webservicex.net/CurrencyConvertor.asmx?WSDL"/>
            <arg value="-p"/>
            <arg value="com.myapplication.webservices"/>
            <classpath>
                <path refid="axis.path"/>
            </classpath>
        </java>
    </target>


En dónde:

  •  axis.home direcciona al directorio que contiene las librerías de Apache Axis
  •  -o  para configurar la ubicación en dónde se crearán las clases Java para el cliente del servicio web, en éste ejemplo: ${javaproject.home}/src-generated
  • La URL dónde se encuentra publicado el servicio web, en éste caso:  http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
  • -p para definir el paquete Java en el cuál se crearán las clases del cliente del servicio web, por ejemplo: com.myapplication.webservices

miércoles, 21 de abril de 2010

Convertir un objeto GregorianCalendar a XMLGregorianCalendar

Cuando se trabaja con servicios web en Java las fechas son manejadas a través de instancias de la clase javax.xml.datatype.XMLGregorianCalendar. Sin embargo, generalmente se trabaja con instancias de la clase java.util.GregorianCalendar para trabajar con fechas.

Al generar un client stub para un servicio web usando Apache Axis los tipos de dato fecha del WSDL se mapean a objetos del tipo XMLGregorianCalendar. Sí se dispone de un objeto GregorianCalendar con el siguiente código se puede realizar la conversión a un objeto del tipo XMLGregorianCalendar.

try {

GregorianCalendar fechaX = new GregorianCalendar();
fechaX.setTime(objetoTipoDate);
XMLGregorianCalendar fechaXML = DatatypeFactory.newInstance().newXMLGregorianCalendar(fechaX);

} catch (DatatypeConfigurationException e) {}