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 🙂
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
Se puede hace lo mismo pero con json
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
Buenas excelente post , me gustaría saber si haz realizado un post con base de datos.
En el paso «Le metemos el servlet mapping de jersey.» yo que trabajé con Netbeans8.1 coloqué esto y me funcionó:
jersey-serlvet
com.sun.jersey.spi.container.servlet.ServletContainer
1
jersey-serlvet
/rest/*
fuente: http://stackoverflow.com/questions/31080982/netbeans-maven-rest-web-service-not-working
Muchisimas gracias! como siempre aclarando mis dudas , saludos desde mexico
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.
Hola muy buen post me gustaria me ayudes a aplicar este RESTfull con Base De Datos te lo agradeceria muchoo