Trabajando con los Web Services de Liferay
0. Índice de
contenidos.
1. Entorno
Este tutorial está escrito usando el siguiente entorno:
- Hardware: Portátil Mac Book Pro 17″ (2,6 Ghz Intel Core
i7, 8 GB
DDR3) - Sistema Operativo: Mac OS X Snow Leopard 10.6.4
- Liferay 6.0.5
2. Vamos al lío
Liferay publica toda su lógica de negocio a través de web
services,
podemos ver la lista de servicios web, una vez arrancado el servidor,
en la URL: http://localhost:8080/tunnel-web/axis, previamente hemos
tenido que añadir estas líneas a nuestro fichero
portal-ext.properties
con el fin de habilitar el acceso a estos servicios de una forma
controlada.
En esta página podemos ver todos los servicios que tenemos
disponibles
junto su definición wsdl para poder crear nuestros propios
clientes.
Pinchando por ejemplo en el wsdl del primer servicio podríamos
ver algo
similar a esto:
Podríamos utilizar este descriptor como base para la
creación de
clientes que consumieran este servicio. Para ello, Eclipse o Netbeans
ofrecen wizards que generan todo el código necesario para
realizar la
llamada y formatear la respuesta de estos servicios.
Aunque Liferay ya hace esto por nosotros y nos lo empaqueta en un
fichero llamado portal-client.jar que contiene las clases generadas y
preparadas para acceder a todos los servicios que se mostraron.
Para la última versión de Liferay podemos descargar este
.jar de su
propia página de descargas en la dirección http://www.liferay.com/es/downloads
con el nombre “Portal Web Services Client”, que tiene el
portal-client.jar más todas las dependencias necesarias.
Es muy importante que descarguemos la versión que coincida con
la
versión del portal que estemos utilizando, ya que de una a otra
puede
variar significativamente. Para el resto de versiones tenemos que
recurrir a la página de sourceforge http://sourceforge.net/projects/lportal/files/
3. Creación de un cliente de prueba
Ahora vamos a crear un cliente en Java que consuma uno de estos
servicios. Para ello, abrimos Eclipse y creamos un proyecto de Java
para escritorio.
Pulsando en “Next” se muestra otra pantalla donde damos un nombre a
nuestro proyecto por ejemplo prueba-cliente-ws y pulsamos en “Finish”.
Ahora vamos a añadir nuestras dependencias al proyecto. Para
ello con
botón derecho sobre la raís del proyecto seleccionamos
“Build Path”
–> “Configure Build Path” y en la pantalla que se muestra
seleccionamos la pestaña “Libraries”, pulsando en la
opción “Add
External JARs…” podemos seleccionar todos los .jar que hemos
descargado anteriormente, con lo que la pantalla queda de esta forma:
Pulsando en “Ok” ya estamos en condiciones de implementar nuestro
cliente que consuma un servicio web publicado por Liferay.
Entonces, con el botón derecho sobre la raíz del proyecto
seleccionamos
“New” — “Class” e introducimos la siguiente información:
Pulsamos en “Finish” para comenzar a implementar el cliente. Para este
ejemplo, vamos a utilizar el servicio web de recuperar un
JournalArticle con el fin de mostrar la información por consola.
package com.autentia.ws.liferay; import java.net.MalformedURLException; import java.net.URL; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import com.liferay.client.soap.portlet.journal.model.JournalArticleSoap; import com.liferay.client.soap.portlet.journal.service.http.JournalArticleServiceSoap; import com.liferay.client.soap.portlet.journal.service.http.JournalArticleServiceSoapService; import com.liferay.client.soap.portlet.journal.service.http.JournalArticleServiceSoapServiceLocator; import com.liferay.client.soap.portlet.journal.service.http.Portlet_Journal_JournalArticleServiceSoapBindingStub; public class PruebaCliente { private static final String ID_JOURNAL_ARTICLE = "10455"; private static final int GROUP_ID_JOURNAL_ARTICLE = 10156; private static final String PASSWORD_USUARIO_CONEXION_WS = "bruno"; private static final String USUARIO_CONEXION_WS = "bruno@7cogs.com"; private static final String URL_JOURNAL_ARTICLE_WS = "http://localhost:8080/tunnel-web/secure/axis/Portlet_Journal_JournalArticleService"; public static void main(String[] args) { // Establecemos la conexión con el servicio web JournalArticleServiceSoapService service = new JournalArticleServiceSoapServiceLocator(); JournalArticleServiceSoap journalArticleService; try { journalArticleService = service.getPortlet_Journal_JournalArticleService ((new URL(URL_JOURNAL_ARTICLE_WS))); ((Portlet_Journal_JournalArticleServiceSoapBindingStub) journalArticleService) .setUsername(USUARIO_CONEXION_WS); ((Portlet_Journal_JournalArticleServiceSoapBindingStub) journalArticleService) .setPassword(PASSWORD_USUARIO_CONEXION_WS); //Utilizamos el método remoto getArticle para recuperar un journalArticle JournalArticleSoap journalArticleSoap = journalArticleService .getArticle(GROUP_ID_JOURNAL_ARTICLE,ID_JOURNAL_ARTICLE); //Pintamos por consola la información System.out.println("Este es su título: " + journalArticleSoap.getTitle()); System.out.println("Este es su tipo: " + journalArticleSoap.getType()); System.out.println("Este es el id del autor: " + journalArticleSoap.getUserId()); System.out.println("Esta es la fecha de modificación: " + journalArticleSoap.getModifiedDate().getTime()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (ServiceException e) { e.printStackTrace(); } catch (RemoteException e){ e.printStackTrace(); } } }
Al ejecutar la clase con botón derecho sobre el fichero “Run
As…” —
“Java Application” obtenemos la siguiente salida por consola.
4. Conclusiones
Como era de esperar en un producto tan maduro como Liferay no es muy
complicado interacturar con sus servicios desde clientes externos
gracias a la utilización de web services. De esta forma
podríamos, por ejemplo, crear un cliente en .NET que
añadiera contenido web o creará usuarios desde otra
aplicación totalmente independiente a Liferay.
Saludos.
tengo un comportamiento diferente en liferay 5.2.3 ya que en ext-properties tengo axis.servlet.hosts.allowed=127.0.0.1,SERVER_IP,0:0:0:0:0:0:0:1%0 y solo me funciona si pongo en la URL http://127.0.0.1:8080/tunnel-web/axis
es normal este comportamiento ?
Claro y conciso! Buen aporte amigo