Crear API SOAP JAVA

A continuación, explicaré cómo crear servicios web desarrollando una API SOAP JAVA con la librería JAX-WS.

¿Qué es SOAP? Sus siglas significan Simple Object Access Protocol. Es un protocolo de comunicación, normalmente vía HTPS (Protocolo de Transferencia de Hipertexto), aunque también puede ser enviado por FTPPOP3TCP, Colas de mensajería (JMSMQ, etc). El intercambio de mensajes se realiza mediante un fichero con estructura XML (Lenguaje de Marcado Extensible) llamado WSDL (Web Services Description Language), en el cual se define un esquema para los mensajes que se intercambiarán entre el cliente y el servicio.

¿Qué es JAX-WS? Java API for XML Web Services. Es una especificación para crear Servicios Web SOAP que se basa en anotaciones para simplificar el desarrollo y despliegue de los clientes.

Crear API SOAP JAVA

Crear proyecto

Lo primero que hay que hacer es crear un proyecto web dinámico Java. Como entorno de desarrollo he utilizado Eclipse.

Crear clases

A continuación, vamos a crear las clases User.java (Modelo), SOAPI.java (Interfaz) , SOAPImpl.java (Implementación de la Interfaz) y PublishServices.java (Publicación Servicios).

User.java (Modelo)

package es.rosamarfil.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;

	public static List<User> users = new ArrayList<>(Arrays.asList(
			new User("Rosa", "Marfil"), 
			new User("Pepito", "Grillo"), 
			new User("Manuela", "Río")));
	
	public String name;

	public String username;

	public User() {
		super();
	}
	
	public User(String name, String username) {
		super();
		this.name = name;
		this.username = username;
	}

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

	public void setUsername(String username) {
		this.username = username;
	}
	
	 public static List<User> getUsers()
	 {
		 return users;
	 }

}

SOAPI.java (Interfaz)

package es.rosamarfil.soap;

import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebService;

import es.rosamarfil.model.User;

@WebService
public interface SOAPI {
	
	@WebMethod
	public List<User> getUsers();
	
	@WebMethod
	public void addUser(User user);

}

SOAPImpl.java (Implementación de la Interfaz)

package es.rosamarfil.soap;

import java.util.List;

import javax.jws.WebService;

import es.rosamarfil.model.User;

@WebService(endpointInterface = "es.rosamarfil.soap.SOAPI")
public class SOAPImpl implements SOAPI{

	@Override
	public List<User> getUsers() {
		return User.getUsers();
	}

	@Override
	public void addUser(User user) {
		User.getUsers().add(user);
	}

}

A continuación, vamos a crear una clase «main», que se ejecute al iniciar nuestra aplicación y publique los servicios. Para ello, es fundamental el uso de la clase EndPoint que provee la librería JAX-WS.

PublishServices.java (Clase principal)

package es.rosamarfil;

import javax.xml.ws.Endpoint;

import es.rosamarfil.soap.SOAPImpl;

public class PublishServices {

	public static void main(String[] args) {
			
		/*
		 *  Se publican los servicios a través de un servidor virtual. 
			El puerto puede ser cualquiera.
			Un vez ejecutada la aplicación, se publica el contrato WSDL
		  */
		 
		Endpoint.publish("http://localhost:1516/WS/Users", new SOAPImpl());

	}

}

Publicar Servicios

Para publicar el contrato, ejecutamos en Eclipse el proyecto como una aplicación java. Observa que no existen errores en la consola de Eclipse.

En el navegador introduce: http://localhost:1516/WS/Users?wsdl y observa las operaciones que el servidor pone a disposición a través del wsdl.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Published by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<!-- Generated by JAX-WS RI (http://jax-ws.java.net). RI's version is JAX-WS RI 2.2.9-b130926.1035 svn-revision#5f6196f2b90e9460065a4c2f4e30e065b245e51e. -->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" name="SOAPImplService" targetNamespace="http://soap.rosamarfil.es/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://soap.rosamarfil.es/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<types>
<xsd:schema>
<xsd:import schemaLocation="http://localhost:1516/WS/Users?xsd=1" namespace="http://soap.rosamarfil.es/"/>
</xsd:schema>
</types>
<message name="addUser">
<part name="parameters" element="tns:addUser"/>
</message>
<message name="addUserResponse">
<part name="parameters" element="tns:addUserResponse"/>
</message>
<message name="getUsers">
<part name="parameters" element="tns:getUsers"/>
</message>
<message name="getUsersResponse">
<part name="parameters" element="tns:getUsersResponse"/>
</message>
<portType name="SOAPI">
<operation name="addUser">
<input message="tns:addUser" wsam:Action="http://soap.rosamarfil.es/SOAPI/addUserRequest"/>
<output message="tns:addUserResponse" wsam:Action="http://soap.rosamarfil.es/SOAPI/addUserResponse"/>
</operation>
<operation name="getUsers">
<input message="tns:getUsers" wsam:Action="http://soap.rosamarfil.es/SOAPI/getUsersRequest"/>
<output message="tns:getUsersResponse" wsam:Action="http://soap.rosamarfil.es/SOAPI/getUsersResponse"/>
</operation>
</portType>
<binding type="tns:SOAPI" name="SOAPImplPortBinding">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="addUser">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="getUsers">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="SOAPImplService">
<port name="SOAPImplPort" binding="tns:SOAPImplPortBinding">
<soap:address location="http://localhost:1516/WS/Users"/>
</port>
</service>
</definitions>

Probar nuestra API SOAP

En Eclipse, crea un proyecto nuevo Java:

Crear API SOAP JAVA

A continuación, selecciona el proyecto y selecciona File -> New -> Other ->Web Services -> Web Service Client. Asigna la dirección donde se publica el contrato wsdl. Presiona Finish.

Crear API SOAP JAVA

Se crean las siguientes clases:

Crear API SOAP JAVA

Crea una clase de ejecución «main» llamada UserClient.java:

Client SOAP

Completamos la clase para llamar a los servicios, de tal forma que quede así:

package es.rosamarfil.client;
import java.rmi.RemoteException;
import java.util.Arrays;
import javax.xml.rpc.ServiceException;
import es.rosamarfil.soap.SOAPI;
import es.rosamarfil.soap.SOAPImplServiceLocator;
import es.rosamarfil.soap.User;

public class UserClient {

	public static void main(String[] args) {
		SOAPImplServiceLocator locator = new SOAPImplServiceLocator();

		try {
			SOAPI userService = locator.getSOAPImplPort();
			
			//Se muestra la lista de usuarios
			System.out.println("Lista de usuarios: \n" + Arrays.toString(userService.getUsers()));
			
			//Se añade nuevo usuario
			userService.addUser(new User("Pablo","Ruiz"));
			//Se muestra la lista de usuarios
			System.out.println("Lista de usuarios: \n" + Arrays.toString(userService.getUsers()));
			
		} catch (ServiceException e) {
			e.printStackTrace();
		} catch (RemoteException e) {
			e.printStackTrace();
		}

	}

}

Salida por consola:

Para mostrar los datos de casa usuario se ha sobreescrito el método toString() de la clase es.rosamarfil.soap.User:

	@Override
	public String toString() {
		return "User [name=" + name + ", username=" + username;
	}


Y hasta aquí la creación de tu primera API SOAP. Como ves, con unos simples pasos es posible crear servicios web basados en SOAP.

Espero que te haya sido de utilidad. Comparte si te ha gustado!!

Comparte:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *