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
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].
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:
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 https://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:
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.
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.
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:
Dicho esto, para poder acceder a nuestros dos recursos haremos lo siguiente:
Numero aleatorio
URL: http://localhost:8084/wsjava/jcmouse/restapi/rnd
Secuencia Fibonacci
URL: http://localhost:8084/wsjava/jcmouse/restapi/fibo/8
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.
De la misma forma si ingresamos una petición incorrecta, (un numero negativo en el caso de Fibonacci), obtendremos como respuesta lo siguiente:
FIN
Problema: Desarrolle un programa en consola con c# para escribir y leer información de un archivo binario. Los datos a e[...]
Problema: Se extrae registros de una base de datos y se desea mostrar estos en un control JTable utilizando un DefaultTa[...]
Cuando creamos reportes en iReport que son un poco complicadas o reportes personalizados, osea, tratando de evitar el cl[...]
Si queremos añadir un enlace web a una aplicación en java, podemos hacer uso de botones o etiquetas, incluso se puede añ[...]
En este tutorial crearemos un interesante efecto de explosión al momento de abrir un JPanel, este efecto puede extenders[...]
El patrón de desbloqueo es una medida de seguridad que tienen algunos teléfonos inteligentes para evitar el acceso al di[...]