Crear una API SOAP Java JAX-WS

A continuación, explicaré cómo crear servicios web SOAP, o lo que es lo mismo…crear una API SOAP Java JAX-WS. Usaremos los métodos comunes para publicar los servicios en nuestra máquina local.

¿Qué es SOAP? Simple Object Access Protocol. Es un protocolo de comunicación, normalmente vía HTPS o JMS, en el que el intercambio de mensajes de realiza mediante un formato de XML llamado WSDL (Web Services Description Language).

Estos tipos de servicios son independientes de la plataforma y del lenguaje, es decir, el servidor puede estar desarrollado en JAVA y el cliente en .NET o PHP.

La librería utilizada para los servicios SOAP es JAX-WS: (Java API for XML Web Services).

Crear proyecto web dinámico

Con Eclipse abierto, selecciona File -> New -> Dynamic Web Project.

API SOAP

Presiona Finish.

Crear clases

Crear modelo

User.java

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;
	 }

}

Crear Interface e implementación

Vamos a crear una interfaz con lo métodos a publicar. La llamaremos SOAPI.java

SOAPI.java (Interface)

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)

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);
	}

}

Publicar servicios

Para ello, 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.

Crear una API SOAP Java JAX-WS

PublishServices.java

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());

	}

}

Para publicar el contrato, ejecutamos 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 los Servicios a través de un Cliente

En Eclipse, crea un proyecto nuevo Java:

Crear una API SOAP Java JAX-WS

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 una API SOAP Java JAX-WS

Se crean las siguientes clases:

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

Crear una API SOAP Java JAX-WS

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 esto es todo!! Esta es una forma sencilla para empezar a crear servicios SOAP JAVA y crear una API SOAP Java con JAX-WS.

Recuerda que también es posible crear servicios Web con otras tecnologías, como es REST. Aunque cada tecnología se usará para fines determinados. Si te interesa como crear una API REST, puedes eharle un ojo aquí: Crear una API REST JAVA

Espero que te haya sido de utilidad y nos vemos en el próximo tutorial.

Comparte si te ha gustado!!

También te podría gustar...

2 Respuestas

  1. Hector Herrera dice:

    para publicar un servicio Soap ajuro tengo que crear un main? y otra pregunta en caso que quiera crear una aplicacion web para publicar el servicio SOAP tendria que crear un metodo o ajuro tiene que ser en un main

    • Rosa dice:

      Hola Hector.
      Respondo tus preguntas:
      A la primera pregunta, yo he creado un ejemplo básico y para publicar el servicio en java he necesitado partir de una ejecución principal y para ello se usa el método main. Pero existen otras formas de crear servicios SOAP, como por ejemplo con spring. Esto requiere utilizar unas librerías específicas y usar ficheros de configuración.
      A la segunda, para publicar el servicio SOAP la forma más simple es partir de la clase main. Pero los servicios pueden estar creados en métodos independientes y ser llamados desde la clase main.

Deja una respuesta

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