Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Proyectos / Ejemplo RESTFul Webservice en Java

Ejemplo RESTFul Webservice en Java

Autor jc mouse martes, noviembre 1, 2016

En este post construiremos un Servicio Web en Java bajo el estandar REST (Representational State Transfer), el cual hace uso del protocolo HTTP y proporciona un API con el cual se puede realizar diferentes operaciones entre la aplicación y el cliente. En esta oportunidad no usamos ningún tipo de base de datos, por lo que nuestro WebService se reducirá a operaciones GET, es decir para consultar recursos. EL formato de respuesta sera JSON.

Necesitamos

  • Netbeans 8.x
  • Java 7 o superior
  • Software Insomnia (Basic es gratuito)
  • Liberia Jersey 2.5.1 y Java-Json (que por lo general ya vienen con netbeans)
  • Apache Tomcat 8

Nivel: Intermedio – Avanzado

Tiempo: 20 minutos

Paso 1. El Proyecto

Clic en menú Archivo → Nuevo Proyecto → En Categoría seleccionar Java Web → en Proyecto seleccionar Web Application, presionar [siguiente].

Como nombre de proyecto, colocamos “wsjava“, presionamos [siguiente].

Finalmente seleccionamos el servidor Apache Tomcat y presionamos [Terminar].

rest

Paso 2. Clases y librerías

Al proyecto le agregamos una clase llamada “ApiREST” dentro el paquete “example.rest“, a continuación añadimos las librerías, Jersey 2.5.1 y Java-Json.

El proyecto queda de la siguiente forma:

restful netbeans

Paso 3. El código

Nuestro API REST esta compuesto por una sola clase (creada en el paso 2) sin conexión a base de datos. El código es el siguiente:

package example.rest;
import java.util.Random;
import javax.ws.rs.core.Response;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import org.json.JSONException;
import org.json.JSONObject;
/**
 * @see http://www.jc-mouse.net/
 * @author mouse
 */

@Path("/restapi")
public class ApiREST {
    
    @GET
    @Path("/rnd")
    @Produces(MediaType.APPLICATION_JSON)    
    /**
     * genera y retorna un numero aleatorio
     * @return Response
     */
    public Response generateRndNumber(){
        Random rnd = new Random();        
        return Response.ok(
                response("Numero Aleatorio", "", String.valueOf(rnd.nextDouble())), 
                MediaType.APPLICATION_JSON).build();
    }
    
    @GET
    @Path("/fibo/{value}")
    @Produces(MediaType.APPLICATION_JSON)
    /**
     * Sucesion de fibonacci
     * @param value numero entero
     * @return Response
     */
    public Response getFibo(@PathParam("value") int value) {
        if(value<=0){                        
            return Response.status(Response.Status.BAD_REQUEST)
                    .entity(
                    response("Fibonacci", String.valueOf(value), "El numero debe ser mayor que cero")).build();
        }               
        int fibo1 = 1;
        int fibo2 = 1;
        int aux = 1;
        String cadena = "1";
        for (int i = 2; i <= value; i++) {
            fibo2 += aux;
            aux = fibo1;
            fibo1 = fibo2;
            cadena += " " + aux;
        }        
        return Response.ok(
                response("Fibonacci", String.valueOf(value), cadena), 
                MediaType.APPLICATION_JSON).build();
    }
    
    /**
     * metodo privado para dar formato al JSON de respuesta
     * @param operation Operacion que se realiza en el APIREST
     * @param paramater parametro de entrada
     * @param result resultado de la operacion realizada
     * @return String Respuesta en formato JSON
     */
    private String response(String operation, String parameter, String result) {
        JSONObject obj = new JSONObject();
        try {
            obj.put("operation", operation);
            obj.put("parameter", parameter);
            obj.put("result", result);            
            return obj.toString(4);
        } catch (JSONException ex) {
            System.err.println("JSONException: " + ex.getMessage());
        }
        return "";
    }
    
}

Nuestra API consta de 2 métodos que podrán ser invocados desde una URL:

  • Un generador de números aleatorios (generateRndNumber) sin parametros de entrada
  • Un generador de la secuencia Fibonacci (getFibo), con un parámetro de entrada de tipo entero.

Paso 4. Configuración 

web.xml: Este archivo contiene información sobre la estructura y las dependencias externas de los componentes web en el módulo y describe cómo se utilizan los componentes en tiempo de ejecución. Está contenido en el directorio WEB-INF.

Para crear un archivo web.xml, debemos hacer clic derecho sobre el proyecto → Nuevo → Otros. Buscar la categoría web → En tipo de archivo, seleccionar Standard Deployment Descriptor (web.xml), presionar [Terminar] para crear el archivo.

web xml

Reemplazamos el contenido por:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- punto de entrada para la aplicacion -->
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <!-- características del servlet -->
    <servlet>
        <servlet-name>wsjava</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>        
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>                      
            <param-value>example.rest, com.jersey.jaxb, com.fasterxml.jackson.jaxrs.json</param-value>            
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- 
    asocia una URL a un servlet
    - Nombre del Servlet
    - URL asociado al Servlet
    -->
    <servlet-mapping>
        <servlet-name>wsjava</servlet-name>
        <url-pattern>/jcmouse/*</url-pattern>
    </servlet-mapping>
    
</web-app>

Paso 5. Ejecución

Presionamos F6 para ejecutar el proyecto en el navegador.

8084 port

Nos aparece la pagina web por defecto.

Para acceder a los recursos del API se usan URL (Uniform Resource Locator) los cuales nos permiten identificar de forma única un recurso, es decir:

{protocolo}://{dominio o hostname}[:puerto (opcional)]/{ruta del recurso}+{consulta de filtrado}

Por ejemplo, para acceder a un registro de una persona en especifico, podríamos escribir la siguient:

http://localhost:8084/api/persona/123

Existen reglas para el diseño de estas URI, por ejemplo:

  • Los nombres de URI no deben implicar una acción, debe evitarse usar verbos en ellos, es decir palabras como “registrar”, “mostrar”, no se deben usar.
  • Deben ser únicas, es decir, no debemos tener más de una URI para identificar un mismo recurso

Dicho esto, para poder acceder a nuestros dos recursos haremos lo siguiente:

Numero aleatorio

URL: http://localhost:8084/wsjava/jcmouse/restapi/rnd

Rnd API

Secuencia Fibonacci

URL: http://localhost:8084/wsjava/jcmouse/restapi/fibo/8

rest api java

Si bien podemos probar los recursos de nuestro API desde un navegador, es mejor hacerlo usando un cliente especialmente diseñado para ello, entre las muchas aplicaciones que hay en internet, podemos hacer uso de Insomnia, que antes venia como complemento para Chrome pero ahora esta como aplicación independiente de escritorio.

Por ejemplo para el recurso de Fibonacci, ademas de darnos la respuesta preformateada, nos da el tamaño, tiempo de respuesta y el Código de Estado (200) que nos informa que la petición se ha realizado correctamente.

Cliente REST

De la misma forma si ingresamos una petición incorrecta, (un numero negativo en el caso de Fibonacci), obtendremos como respuesta lo siguiente:

400 response

FIN

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Buscar dispositivos con Java Media Framework

Buscar dispositivos con Java Media Framework

Java Media Framwork ademas de permitir reproducir archivos multimedia, tambien permite trabajar con dispositivos de capt...

Reproducir video en JFrame Swing con JavaFX

Reproducir video en JFrame Swing con JavaFX

JavaFX un producto de  Sun Microsystems/Oracle Corporation que salio a la luz para competir con tecnologías como Flash o...

Primeros pasos en Jaspersoft Studio

Primeros pasos en Jaspersoft Studio

¿Que es Jaspersoft Studio? Jaspersoft Studio es el nuevo diseñador de informes basado en Eclipse para JasperReports y Ja...

Imprimir Swing

Imprimir Swing

Java Printing nos permite hacer uso de las impresoras del sistema para, valga la redundancia 🙂 imprimir los gráficos de...

Evaluar expresiones matemáticas en Java con JavaScript

Evaluar expresiones matemáticas en Java con JavaScript

Java 8 trae consigo una nueva versión del motor de JavaScript llamada Nashorn, este motor introduce mejoras de rendimien...

Descargar Doodle Google Pacman

Descargar Doodle Google Pacman

Hace un par de años atras google para el aniversario del juego de Pacman saco un doodle en su homenaje, ese doodle que s...

1 comentario en “Ejemplo RESTFul Webservice en Java”

  1. Maria dice:

    Cómo puedo obtener un archivo XML en vez de un JSON?

Deja un comentario

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

*

Comparte lo que sabes

Categorias

Últimas entradas

PHPUnit es un framework que se utiliza para escribir tests en PHP, Netbeans nos permite configurarlo y usarlo fácilmente...

Una Prueba Unitaria, es una forma de comprobar que nuestro código, hace lo que se supone debe hacer; es decir, se asegur...

La prueba del camino básico, es una prueba de “caja blanca” que consiste en verificar el código de nuestros...

Si quieres cambiar el nombre de tus atributos sin tener que reescribir código java por X o Y razón, GSON te permite reno...

Android Bolivia

Bandera en Alto