post icon

Pasar un conjunto de datos por Web Service entre Java y DotNet

Navegando en foros, blogs y otros me di cuenta que hay demasiada gente que busca información de como pasar un c0njunto de datos, la mayoría intenta pasar un DataSet o DataReader de dotnet y hacerlo compatible con Java u otros lenguajes, otros intentan pasar un ResultSet de Java por el mismo medio.

Recordemos que los tipos de datos que se traficaran deben ser serializables, es decir, se tiene que poder componer y descomponer los datos originales para su transporte, normalmente se utiliza un conjunto de bytes o cadenas base64, aunque puede utilizarse otras técnicas.

Es por ello que los ResultSet y DataReader no podemos transportarlos, en cambio el DataSet si es posible traficarlospor que el mismo puede serializarse en XML finalmente.

Ahora bien, traficar un DataSet normalmente puede ser servido y consumido por dotNet sin problemas, pero al mezclar lenguajes surge el problema de la tipificación. Aunque no descarto que sea posible hacerlo, sería más complejo que la solución que expondré aquí.

Para el ejemplo crearemos un WS server con Java, y lo consumiremos con C#. Para pasar el conjunto de datos crearemos una clase compuesta por varios tipos de datos nuevamente y los serializaremos, haciendo que la misma implemente de java.io.Serializable

package ws;

import java.io.Serializable;
import java.util.*;

/**
 * @author GeekZero@Devtroce
 */
public class persona implements Serializable {

    public int id;
    public String nombres;
    public String documento;
    public Date nacimiento;

    public persona() {
        id = 0;
        nombres = null;
        documento = null;
        nacimiento = null;
    }

    public persona(int id, String nombres, String documento, Date nacimiento) {
        this.id = id;
        this.nombres = nombres;
        this.documento = documento;
        this.nacimiento = nacimiento;
    }
}

Ahora creamos el lado servidor del web service de este modo, por cierto los datos los cargaré manualmente en el código, ustedes lo pueden ir poblando a partir de otras fuentes como una BD, ficheros, etc. Si se fijan el método retorna un list de la clase base que hemos creado

package ws;

import java.util.*;
import javax.jws.WebMethod;
import javax.jws.WebService;

/**
 * @author GeekZero@Devtroce
 */
@WebService()
public class ws {

    /**
     * Web service operation
     */
    @WebMethod(operationName = "Test")
    public List<persona> Test() throws Exception {
        List<persona> personaList = new ArrayList<persona>();
        java.util.Date utilDate = null;
        long largo = Long.valueOf("948748475645");
        java.sql.Date sqlDate = new java.sql.Date(largo);
        utilDate = new java.util.Date(sqlDate.getTime());
        personaList.add(new persona(1, "hugo", "66", utilDate));
        personaList.add(new persona(2, "geekzero", "123", utilDate));
        return personaList;
    }
}

Finalmente, una vez agregado en Visual Studio el WSDL como referencia web, podemos consumir los datos. Vale resaltar que si lo consumimos con VS el nos generará la clase persona, si lo consumimos con java, php, u otro lenguaje debemos volver a mapear el tipo de objeto persona serializandolo.

El código en C# se vería semejante a esto el código:

private void button1_Click(object sender, EventArgs e)
{
	try
	{
		var ws = new WS.wsService();
		var personas = ws.Test();
		foreach (var persona in personas)
			dataGridView1.Rows.Add(persona.nombres, persona.documento, persona.nacimiento);
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

Comentarios desde Facebook:

  1. avatar
    Javi SPAIN Mozilla Firefox Windows
    13 mayo 2011 at 07:17 #

    Hola GeekZero, la respuesta que me has dado ya me la diste en la parte 4 del tutorial. Al ver lo que me ponías te pregunté que en que lugar del código tengo que ponerlo.

  2. avatar
    Javi SPAIN Mozilla Firefox Windows
    12 mayo 2011 at 11:00 #

    Hola GeekZero, hace un tiempo te pregunté sobre el tutorial que escribiste sobre programación en n capas un duda acerca del uso de las transacciones. Me respondiste y te volví a preguntar otra cosa.

    Supongo que no lo has leído, si pudieras leerlo y responderme estaría muy bien.

    Gracias de todas formas.

    • avatar
      GeekZero PARAGUAY Google Chrome Windows
      12 mayo 2011 at 11:15 #

      Respondido..

Responder