Como crear aplicaciones en Java que puedan conectarse con .NET
Cuando platique con @xbenek sobre crear un puente de interoperabilidad entre tecnologías Microsoft y Java, lo primero que me paso por la mente fue el pensar en los problemas había tenido o que había escuchado cuando la gente estaba teniendo proyectos de este tipo, uno de los principales era el acceso a las clases y objetos que estaban generados en .NET y la otra era el acceso a los datos en sí, una manera de solucionar este dilema es usando por el lado de .NET el Entity Framework que te permite exponer clases y entidades en formato ATOM o JSON usando REST y por parte de Java Restlet que te permite acceder a este tipo de servicios.
Existen varios proyectos que pueden verse beneficiados de arquitecturas como REST (Representational state transfer) donde la idea principal está en la manera en la que se hacen las peticiones al Servidor desde el cliente, las peticiones se hacen basadas en el recurso que te interesa, por ejemplo si quieres ver los productos de una tienda de la categoría bebidas, debería de ser suficiente con ir a la página http://latienda/productos/bebidas o si quisieras ver todas las cervezas podrías ir a http://latienda/productos/bebidas/cervezas el servidor es el que se encarga de encontrar el recurso adecuado a lo mejor lo que hace es buscar la página cervezas.htm entonces si pensamos que cervezas.htm es la representación de un recurso sin embargo el cliente esta accediendo a un sitio diferente, lo que hace el servidor es transferir el estado del recurso para poderse adaptar a la solicitud que esta haciendo el cliente, –>Transferencia Representacional de Estado (REST).
La arquitectura de REST tiene que cumplir con estos 6 principios.
Cliente-servidor
Capaces de almacenarse en caché
Te recomiendo que leas este post de Roger L. Costello que explica de una manera muy sencilla lo que es REST
Vamos a crear una aplicación usando el Entity Framework de .NET la manera mas fácil de instalar Visual Studio Express y SQL Server es usando el Web Platform Installer que te permite instalar y configurar todas las herramientas y aplicaciones (puedes instalar wordpress, mySql, Joomla, etc desde el mismo instalador).
Una vez terminada la instalación agrega la base de datos de ejemplo de Northwind y ya con eso tenemos todo para crear la aplicación que va a exponer la información de la base de datos, para esto sigamos estos pasos:
Abre el Visual Web Developer y crea un nuevo proyecto de tipo ASP.NET Web Application, el siguiente paso es crear una conexión a la base de datos:
- En la parte superior izquierda busca el “Database Explorer” y presiona el botón de “Connect to Database”
- En Server Name escribe .\Sqlexpress (esto va a seleccionar la instancia en el servidor local de SQL Express)
- Selecciona la base de datos Northwind
- Presiona el botón de OK
En el Explorador de nuestra solución vamos a crear un nuevo elemento de tipo ADO.NET Entity Data Model, para esto da un click con el botón derecho sobre el nombre de tu solución y selecciona “Add New Item” o presiona las teclas Ctrl + Shift + A, esto abrirá el selector de plantillas, del lado derecho selecciona la Categoría “DATA” y del lado derecho escoge ADO.NET Entity Data Model en el nombre escribe “Northwind”
- Al presionar OK te va a aparecer un asistente que te va a ayudar para crear la colección de clases a partir de mapear el modelo de entidades.
- Selecciona la opción de “Generate from database”
- Escoge la base de Northwind y en la parte Inferior verifica que el nombre de la conexión sea “NorthwindEntities” esto es importante ya que este será el nombre con el que se generará el modelo de entidades.
- Presiona Next y dentro de Tablas selecciona las siguientes:
- Orders
- OrderDetails
- Products
- Dentro de Stored Procedure selecciona:
- CustOrderDetails
- CustOrderHist
- Presiona el botón de Finish
Lo que hace el Entity Framework es mapear la base de datos a Clases con la estructura de la base de datos y los Stored Procedures a Métodos o Funciones, obviamente la gran ventaja de utilizar este modelo de desarrollo está en la facilidad de programación, ya que ahora podríamos usar LINQ para hacer consultas en lugar de sentencias de SQL, (después les explico un poco mas lo que puedes hacer con LINQ) por lo pronto lo interesante es que estamos manejando objetos y no datos, lo cual nos va a facilitar poder accederlos posteriormente.
Ahora vamos a exponer a través de Servicios REST esta clase, para ello vamos a seguir estos pasos:
- Presiona Ctrl + Shift + A para agregar un nuevo elemento.
- Selecciona la categoría Web
- Busca la plantilla ADO.NET Data Service
- Presiona OK
La plantilla que nos genera va a heredar DataService de la clase NorthwindEntities (que generamos con Entity Framework anteriormente). Para configurar el servicio hay 3 cosas que debemos hacer:
- Reemplazar [[class name]] con el nombre de nuestra clase NorthwindEntities
- Configurar las Reglas de Acceso a las entidades
- Configurar las reglas de operación del servicio.
- config.SetServiceOperationAccessRule("*", ServiceOperationRights.All) (puede ser solo lectura, lectura y escritura etc.)
Listo, con esto estamos exponiendo nuestra base de datos a traves de servicios web que soportan REST, para probarlo dale un click con el boton derecho al WebDataservice.svc y selecciona la opcion “VIew in Browser”
Al ejecutarlo te va a mostrar un XML en formato Atom, lo interesante de esto es que como el web service es REST acepta operaciónes a traves de métodos POST y GET, además seguro te diste cuenta de los tags href, esto significa que si quisieras hacer una consulta por las órdenes de compra solo tendrías que ir a la página
http://localhost:60203/WebDataService1.svc/PurchaseOrderHeader
Si quieres consultar un una orden en específico puedes ir a la página
http://localhost:60203/WebDataService1.svc/PurchaseOrderHeader(1)
¿ Recuerdas que las ordenes de compra estaban ligadas con el detalle de la compra? bueno, como al final de cuentas son objetos, los detalles que tenga relacionados una orden de compra automaticamente se vuelven en propiedades de este objeto y por lo tanto tambien puedes consultarlo
http://localhost:60203/WebDataService1.svc/PurchaseOrderHeader(1)/PurchaseOrderDetail
Hasta ahora vimos como crear una aplicación que exponga datos usando Entity Framework, algo para resaltar es que usando los ADO .Net Dataservices podrías exponer clases que tengan las capacidades de Iquery y ISerialize.
Ahora vamos a consumir estos servicios en JAVA para esto vamos a usar el framework RESTlet que puedes descargar desde http://www.restlet.org/downloads/ estos son los pasos que necesitas seguir para comenzar a utilizar RESTlet (en este caso yo estoy usando Eclipse, pero podrías usar cualquier IDE)
Lo primero que tenemos que hacer es generar las clases auxiliares que nos van a ayudar a conectarnos al web service, para esto lo puedes hacer de dos maneras, a traves de un comando o programandolo:
java -cp org.restlet.jar;org.restlet.ext.xml.jar;org.restlet.ext.atom.jar;org.restlet.ext.freemarker.jar;org.restlet.ext.dataservices.jar;org.freemarker.jar org.restlet.ext.dataservices.Generator http://restlet.cloudapp.net/TestAssociationOneToOne.svc/ EFDemo
Yo lo hice programando una clase es importante referenciar estos jars:
- org.restlet.jar
- org.restlet.ext.dataservices.jar
- org.restlet.ext.atom.jar
- org.restlet.ext.xml.jar
- org.restlet.ext.freemarker.jar
- org.freemarker.jar
public class rest {
public static void main(String[] args) {
//le mandamos como parametros la dirección del servicio y el directorio donde queremos que genere
//las clases auxiliares
String[] arguments = { "http://localhost:65258/WebDataService1.svc", "nuevo" };
Generator.main(arguments);
}
}
Al ejecutarlo nos va a generar una serie de archivos (las clases auxiliares) que nos van a ayudar a conectarnos con el servicio, ahora lo que tienes que hacer es crear un nuevo proyecto y agreguemos las referencias a los jars.
Despues importa los recursos que creamos en el paso anterior, dale un click al nombre de tu proyecto con el botón derecho y selecciona la opción de “Import” en la categoría “General” Selecciona “FileSystem” presiona Next y navega a la carpeta donde se generaron los archivos java, seleccionalos todos y presiona el botón “Finish”
Ahora vamos a crear una nueva Clase, vas a necesitar importar los siguientes Namespaces:
import org.restlet.ext.dataservices.Query;
public class listaCategorias {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// creamos la sesión en servicio
NorthwindModelSession session = new NorthwindModelSession();
//hacemos la busqueda
Query<Categories> query = session.createCategoriesQuery("/Categories");
if (query != null) {
//recorremos la colección y desplegamos los resultados
for (Categories categoria : query) {
System.out.println("*** Categorías");
System.out.println("Categoria :" + categoria.getCategoryName());
System.out.println("Descripción :" + categoria.getDescription());
System.out.println("id: " + categoria.getCategoryId());
}
}
}
}
El resultado será algo como esto:
*** Categorías
Categoria :Bebidas
Descripción :Soft drinks, coffees, teas, beers, and ales
id: 1
*** Categorías
Categoria :Condiments
Descripción :Sweet and savory sauces, relishes, spreads, and seasonings
id: 2
*** Categorías
Categoria :Confections
Descripción :Desserts, candies, and sweet breads
id: 3
*** Categorías
Categoria :Dairy Products
Descripción :Cheeses
id: 4
*** Categorías
Categoria :Grains/Cereals
Descripción :Breads, crackers, pasta, and cereal
id: 5
*** Categorías
Categoria :Meat/Poultry
Descripción :Prepared meats
id: 6
*** Categorías
Categoria :Produce
Descripción :Dried fruit and bean curd
id: 7
*** Categorías
Categoria :Seafood
Descripción :Seaweed and fish
id: 8
Como vimos en este ejemplo el integrar Java con .NET puede facilitarse al acceder servicios generados a través del Entity Framework, usando estos servicios puedes actualizar, borrar y crear elementos, te recomiento que leas el tutorial de Restlet donde explican las otras funciones que puedes ejecutar usando este framework. Hay varias opciones en cuanto al IDE de Microsoft, Visual Web Developer Express (gratuito), Visual Web Developer Express 2010 (gratuito) o si quieres la versión Professional, puedes descargar las versiones de evalución desde http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx si eres estudiante (a través del programa Dreamspark), o emprendedor (a través de Bizspark) tienes acceso al software gratis, buscame por twitter @jaimesanchez o por mail a jaime.sanchez@microsoft.com si tienes mas dudas.
Referencias Wikipedia, Xfront, tutorial de Restlet
- blog de jaimesanchez
- Inicie sesión o regístrese para enviar comentarios
Contraparte
Estaría buena la contraparte (hacer en Java lo que aquí se muestra en .NET y en .NET lo que aquí se muestra en Java)
Buena Idea.
Dejame preparar un ejemplo y trabajo con el. ¿Qué consideras que sería interesante cubrir?
Saludos
Lo mismo
De entrada hacer el mismo ejemplo pero a la inversa solamente. Ya después se me ocurrirán algunas otras ideas para interop.
OK!
Listo, voy a trabajar en eso. muchas gracias!
versiones
No mencionas las versiones de algunos de los productos/tecnologias que usas. En particular tengo duda con la de Restlet ya que al parecer no es la "estable" (1.1.7).
Saludos
Willy Mejía
Versión Restlet
La versión que use para las pruebas fue Version 2.0 Milestone 6, en cuanto a .NET funciona con el framework 3.5 y 4.0
Saludos
CRUD
Jaime, tengo problemas al tratar de extender el ejemplo para realizar el resto de las operaciones CRUD... específicamente actualizar y agregar entidades.
¿Tu no tienes problemas al respecto?
CRUD
nop, pero cuentame que te marca?
Error 400 (Bad Request)
Me marca un error en la comunicación. El Stacktrace me señala un "Error 400 (Bad Request)" a la hora de pretender actualizar o crear (agregar) una entidad. Por lo que al parecer el problema es por parte de Restlet, que no genera bien el request.
http://www.javamexico.org/blogs/willyxoft/jugando_con_restlet_y_astoria
Por ello te preguntaba si tienes el mismo problema...
Pero ahora también tengo otra pregunta: ¿Que versión de VS utilizas para el servicio? Yo utilizo VWD2008 SP1.
Saludos.
Traducción de REST
Hago notar que en Wikipedia se traduce REST como Transferencia de Estado Representacional y no Transferencia del Estado de la representación. Aunque yo creo que es más correcto Transferencia de la Representación del Estado. O si lo prefieren, Transferencia del Estado Representado, pero se me hace demasiado forzada.
TRE
Transferencia Representacional de Estado sería lo más correcto, IMHO...
Traducción REST.
Muchas gracias por la observación, voy a modificar el post.
Muchas gracias