Servicios Web RESTful en Axis 2

1
37185

Servicios Web RESTful en Axis 2

En este tutorial vamos realizar una descripción de REST y vamos a ver un ejemplo práctico de un Servicio Web RESTful

¿Qué es REST?

REpresentational Estado Transfer (REST) es un método de diseño de arquitectura que consiste en ver un servicio Web como un recurso identificable mediante una URL.

¿Cuándo usar REST?

Un diseño REST puede ser apropiado cuando:

  1. Cuándo la funcionalidad expuesta por el servicio es síncrona.
  2. Cuándo el servicio Web no tiene estado.
  3. Cuándo la información que provee el servicio puede ser cacheada para mejorar el rendimiento.
  4. Cuándo se conoce bien el contexto de la comunicación (formato de datos, métodos, etc.) entre productor y el consumidor.
  5. Cuándo es importante que la comunicación sea ligera en terminos de bytes transmitidos debido al coste »» PDAs, móviles, etc
  6. Cuándo el consumidor tiene limitaciones de ancho de banda (PDAs, móviles, etc).
  7. Cuándo el consumidor desea acceder a los servicios (sin tener que instalar nada), a través de una página Web con Ajax y analizar el resultado (xml).

¿Qué son los Web Services RESTful?

Son aquellos servicios Web que funcionan bajo REST

Los Web Service REST proporcionan acceso a través de los métodos GET y POST de HTTP.

  1. GET: En accesos vía GET, tanto las operaciones como los parámetros se pasan por la URL » Sólo soporta argumentos con tipos simples.
  2. POST: En este tipo de acceso, la información no viaja en mensajes SOAP Envelope, sino directamente en el payload del mensaje.

REST en Axis2

Axis2 puede ser configurado para funcionar con REST, de manera que pueda enviar y recibir peticiones REST. (Por defecto está configuración esta habilitada)

Para habilitar REST, hay que añadir la siguiente línea en el archivo de configuración axis2.xml.

true

Cuando un mensaje es recibido, entonces:

  • Si el content type es text/xml y además NO está presente la cabecera SOAP Action » Mensaje REST.
  • Si el content type es text/xml y además SI está presente la cabecera SOAP Action » Mensaje SOAP.

Instalación de Axis 2

Para instalar Axis 2, simplemente deberás

  1. Descargártelo desde http://ws.apache.org/axis2/
  2. Descomprimirlo en tu disco duro
  3. Crear una variable de entorno de nombre AXIS_HOME que apunte al directorio donde fue descargardo. Por ejemplo c:/java/axis2-1.3
  4. Desplegar el archivo %AXIS_HOME%/dist/axis2.war en tu servidor de aplicaciones o contenedor de servlets favorito (JBoss, iPlanet, WebSphere, Weblogic, GlassFish, Geronimo, Tomcat, etc.)

A continuación veremos varias maneras de invocar uno de los servicios Web que vienen preinstalados en la distribución de Axis 2

Ejemplo: Invocación del servicio Web a través de HTTP GET

Abra su navegador favorito y ponga la siguiente dirección: http://127.0.0.1:8080/axis2/services/Version/getVersion

Ejemplo: Invocación del servicio Web a través de HTTP POST desde un formulario

      
        
          

Ejemplo: Invocación del servicio Web a través de HTTP POST usando las clases de Axis

package com.autentia.ws.rest.sample1;

import org.apache.axiom.om.OMElement;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.ServiceClient;

/**
 * Invocación via POST del Web service
 * @author Autentia.
 */
public class RESTClient {
    public static void main(String[] args) throws Exception {
    	// Instanciamos el cliente
        ServiceClient cliente = new ServiceClient();
        cliente.setTargetEPR(new EndpointReference("http://127.0.0.1:8080/axis2/services/Version/getVersion"));
        
        // Invocamos el servicio Web
        OMElement result = cliente.sendReceive(null);
        
        // Imprimimos el resultado por la salida estándar
        result.serialize(System.out);
    }
}

Ejemplo: Invocación del servicio Web a través de HTTP POST desde las clases estándares de Java

package com.autentia.ws.rest.sample1;

import java.io.*;
import java.net.URL;
import java.net.HttpURLConnection;
import java.net.URLEncoder;


/**
 * Invocación via POST del Web service
 * @author Carlos García. Autentia.
 * @see http://www.mobiletest.es
 */
public class RESTClient2 {
    public static void main(String[] args) throws Exception {
    	// URL del sercivio Web
    	URL	   url  = new URL("http://127.0.0.1:8080/axis2/services/Version/getVersion");
    	
    	// Establecemos la conexión
    	HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    	//  Enviamos los datos asociados a la petición
    	connection.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
        wr.write(URLEncoder.encode("parametro1", "UTF-8") + "=" + URLEncoder.encode("valor1", "UTF-8"));
        wr.write("&");
        wr.write(URLEncoder.encode("parametro2", "UTF-8") + "=" + URLEncoder.encode("valor2", "UTF-8"));
        wr.flush();
    
        
    	if (connection.getResponseCode() == HttpURLConnection.HTTP_OK){
			// Leemos el contenido de la respuesta y lo mostramos por la salida estándar
    		BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
			String		   line   = reader.readLine();
			while (line != null) {
				System.out.println(line);
				
				line = reader.readLine();  
			}
			reader.close();
		} else {
			System.out.println(connection.getResponseMessage());
		}
    	
    	// Cerramos la conexión
    	connection.disconnect();
    }
}

Ejemplo: Invocación del servicio Web a través de HTTP POST usando HTTPClient

Puedes ver un tutorial de HTTPClient aquí

package com.autentia.ws.rest.sample1;

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;

import java.io.*;

/**
 * Invocación via POST del Web service usando HttpClient
 * @author Carlos García. Autentia.
 * @see http://www.mobiletest.es
 */
public class RESTClient3 {
	/**
	* Punto de inicio de ejecución del ejemplo.
	*/	
	public static void main(String[] args) {
		HttpClient      httpClient = null;  // Objeto a través del cual realizamos las peticiones
		HttpMethodBase  request = null;     // Objeto para realizar las peticiones HTTP GET o POST
		int             status = 0;         // Código de la respuesta HTTP
		BufferedReader  reader = null;      // Se usa para leer la respuesta a la petición
		String          line   = null;      // Se usa para leer cada una de las lineas de texto de la respuesta
        
		try {
			// Instanciamos el objeto
			httpClient = new HttpClient();
	        
			// Invocamos por POST
			request = new PostMethod("http://127.0.0.1:8080/axis2/services/Version/getVersion");
			
			// Añadimos los parámetros que deseemos a la petición 
			((PostMethod) request).addParameter("parametro1", "valor1");
			((PostMethod) request).addParameter("parametro2", "valor2");
			
			// Indicamos reintente 2 veces en caso de que haya errores.
			request.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(2, true));
			
			// Añadimos las cabeceras personalizadas que se requieran, de la siguiente forma:
			request.addRequestHeader("HeadName", "HeadValue");
			
			// Leemos el código de la respuesta HTTP que nos devuelve el servidor
			status = httpClient.executeMethod(request);
			
			// Vemos si la petición se ha realizado satisfactoriamente
			if (status != HttpStatus.SC_OK) {
				System.err.println("Error\t" + request.getStatusCode() + "\t" +  request.getStatusText() + "\t" + request.getStatusLine());	        	 
			} else {
				// Leemos el contenido de la respuesta y realizamos el tratamiento de la misma.
				// En nuestro caso, simplemente mostramos el resultado por la salida estándar
				reader = new BufferedReader(new InputStreamReader(request.getResponseBodyAsStream(), request.getResponseCharSet()));
				line   = reader.readLine();
				while (line != null) {
					System.out.println(line);
					line = reader.readLine();  
				}
			}
		} catch (Exception ex){
			System.err.println("Error\t: " + ex.getMessage());
			ex.printStackTrace();
		} finally {
			// Liberamos la conexión. (También libera los stream asociados)
			request.releaseConnection();
		}
  }
}

Cuando Axis recibe una petición REST, internamente la traduce, a SOAP, por ejemplo:

        
              
                
            
                

Información que nos devuelve el Servicio Web en todos los caso

      
        Hello I am Axis2 version service , My version is 1.3
      

Conclusiones

Como podemos deducir de este tutorial, para hacer que un servicio Web sea RESTful es más un tema del motor de servicio Web (en este caso Axis) que del propio servicio.

Además también se puede deducir que el acceso a este tipo de servicios Web no tiene dependencias con contratos WSDL, clases especificas de comunicación, esquemas XML, etc. por lo que se hace más fácil y ligero su uso.

Un saludo, Carlos García.

1 COMENTARIO

  1. Muy interesante el tutorial. Una pregunta, ¿cuál es la mejor forma de añadir seguridad a REST? ¿mediante HTTPS? ¿o hay algún otro mecanismo recomendado?

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad