Creando servicios RESTful con NetBeans 8

8
34531

En este tutorial vamos a ver cómo utilizar el asistente de NetBeans 8 para crear servicios RESTful fácilmente

Hace tiempo que no tocaba código y como tengo que impartir unos cursos para directivos de Gobierno SOA me he puesto a mirar como crear ejemplos sencillos y rápidos de servicios.
Aunque en mi contexto utilizamos más Eclipse, a mi siempre me ha gustado lo intuitivo de NetBeans. En este caso voy a enseñar como crear servicios RESTful usando los asistentes de NetBeans 8, bueno, hasta donde se puede.

Equipo

  • iMac (Retina 5K, 27 pulgadas, finales de 2014)
  • 4 GHz Intel Core i7
  • 16 GB 1600 MHz DDR3
  • AMD Radeon R9 M295X 4096 MB

Antes de empezar voy a ver la versión que tengo en mi Mac de Java.

java -version

Nos descargamos NetBeans, en Bundle para JEE:

Arrancamos

Creamos un nuevo proyecto

Elegimos el tipo aplicación Web

Voy a hacer un ejemplo de Pizza por lo que creo el proyecto con ese nombre

Elegimos en servidor de aplicaciones que viene por defecto

No elegimos ningún framework

Y damos a «Play» para probar que la aplicación funciona.

De momento solo tiene una página con un literal.

Ahora vamos a añadir un fichero

Elegimos RESTful WebService from patterns. Es lo más sencillo y luego ya tocaremos.

Elegimos el nombre del recurso a gestionar y de la clase contenedora

El proyecto por defecto no trae un Web.xml por lo que lo creamos a partir del mismo asistente.

Le metemos el servlet mapping de jersey.

Curiosamente hay un pequeño problema, que el código generado es de la versión 1 y no 2, por lo que hay que buscar las librería de la versión 1 (por internet), descargarlas y añadirlas a mano (dar al botón derecho en el proyecto para que aparezcan las propiedades)

No es difícil de encontrar

Lo descargamos, descomprimimos y añadimos.

Ahora ya tenemos un proyecto con este aspecto.

Si lo ejecutamos saldrá la pagina de antes.

Para ver algo debemos meter en el navegador la URL http://localhost:8080/PizzasAutentia/ (en mi caso)

Inicialmente fallará porque no hay un código mínimo y se lanza una excepción por defecto

throw new UnsupportedOperationException();

Añadimos una linea solo para ver que funciona.

public Pizza getXml() {
    return “lo que sea”;
}

Yo he metido una respuesta en un pseudo xml

Como uso Firefox, instalo el pluggin RESTClient.

https://addons.mozilla.org/es/firefox/addon/restclient/

Ahora puedo controlar mejor que es lo que mando y llega

Vemos ejemplo de respuesta 200

Voy a hacer un poco de limpia, y solo dejo la clase PizzaRecursos, que nos sobra para hacer mapping y juguetear un poco con Jersey.

@GET
@Produces("application/xml")
public String getXml() {
    //TODO return proper representation object
    return "Ejemplo Colección"; 
    // throw new UnsupportedOperationException();
}

/**
 * POST method for creating an instance of PizzaRecurso
 * @param content representation for the new resource
 * @return an HTTP response with content of the created resource
 */
@POST
public Response postXml(String content) 
{
    System.out.println("por aqui");
    return Response.ok().build();
    // return Response.created(context.getAbsolutePath()).build();
}

/**
 * Sub-resource locator method for {id}
 */
@Path("{id}")
public String getPizzaRecurso(@PathParam("id") String id) {
    System.out.println("reclamamos elemento");
    return "Complicando los mappings";
}

Este es el aspecto

Ahora que funciona, vamos a crear una clase y hacer el mapping directo a XML.

Creamos la clase Pizza

A manita (ya por no andar capturando más pantallas) creamos atributos, constructor por defecto, constructor deseado y lo anotamos como @XmlRootElement

No olvidar: import javax.xml.bind.annotation.*;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package PizzaAutentiaPkg;

import javax.xml.bind.annotation.*;

/**
 *
 * @author rcanales
 */

@XmlRootElement 
public class Pizza {

    private int     id;
    private String  nombre;
    private String  desc;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
 
    public Pizza()
    {
        // costructor por defecto
        id      = 0;
        nombre  = "defecto";
        desc    = "defecto";
    }
    
    public Pizza(int pid, String pnombre, String pdesc)
    {
        this.id      = pid;
        this.nombre  = pnombre;
        this.desc    = pdesc;
    }
            
    @Override
    public String toString() {
        return new StringBuffer(" id: ").
                append(id).
                append(" nombre: ").
                append(nombre).
                append(" desc: ").
                append(desc).toString();
    }
}

Aquí un poco más bonito

Modificamos el método get para decir que produce XML y que retorna un objeto de tipo Pizza.

@GET
@Produces("application/xml")
public Pizza getXml() {
    //TODO return proper representation object
   
  return new Pizza(1, "Carbonara", "Nuestra más afamada"); 
    // throw new UnsupportedOperationException();
}

Y la magia está hecha.

Ahora ya podéis entreteneros todo lo que queráis 🙂

8 COMENTARIOS

  1. hola muy buen post me gustaria que me contactaras por correo para que me ayudes a aplicar este RESTfull con Base De Datos te lo agradeceria muchoo

  2. hola muy buen post me gustaria que me contactaras por correo para que me ayudes a aplicar este RESTfull con Base De Datos te lo agradeceria muchoo

  3. El proyecto no me funcionaba al principio, hasta que no puse un sin espacios en blanco…
    Sin embargo, no se necesita crear el archivo Web.xml. Pues la clase: ApplicationConfig, hace el trabajo. Es importante conocer que la carpeta por defecto es: webresources (se define en la propia clase), y debe estar en la ruta antes del path indicado.
    Tampoco necesitaba utilizar Jersery 1.x, con el actual me funcionó.
    El ejemplo, en: https://docs.oracle.com/cd/E19798-01/821-1841/6nmq2cp1v/index.html es bastante interesante.

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