Laboratorio 19

Construir una API REST con Quarkus y Copilot

Hemos creado un proyecto de Quarkus con algunos archivos ya creados, puedes encontrar el proyecto en la carpeta exercisefiles/quarkus.

Fuente validada

Lab_19_Quarkus_API_REST.docx

Esta pagina fue reconstruida desde el documento del ZIP entregado como fuente principal.

Conformidad visual

Sin imagenes publicadas

El archivo fuente contiene 0 imagenes embebidas. Para garantizar conformidad, no se publican imagenes heredadas de otros materiales.

Criterio GH-300

Practica verificable

Ejecuta los comandos, captura evidencia propia y valida cada sugerencia de Copilot antes de aceptarla.

Alcance de publicacion: Solo se publica el contenido del laboratorio indicado por el archivo Lab_19_Quarkus_API_REST.docx. Las imagenes no se muestran porque el ZIP no incluye imagenes embebidas en este documento.

Certificación GH-300

Laboratorio 19

API REST con Quarkus y GitHub Copilot

Autor: Carlos Crudo

linkedin.com/in/carloscrudo

Desarrollo de una API REST usando el framework Quarkus (supersónico y subatómico) con la asistencia de GitHub Copilot para generación de código Java.

Temas que cubre este laboratorio:

Quarkus vs Spring Boot: diferencias clave

GitHub Copilot en desarrollo Java/Quarkus

RESTful endpoints con JAX-RS

Quarkus Dev Mode y hot reload

Tests con QuarkusTest

Build nativo con GraalVM

Laboratorio 19: API REST con Quarkus y GitHub Copilot

Laboratorio 19 - Construir una API REST usando Quarkus con la ayuda de GitHub CopilotGoal

El objetivo de este laboratorio es aprender a usar GitHub Copilot, utilizando tareas que consisten en construir una API REST usando https://quarkus.io/.

Hemos creado un proyecto de Quarkus con algunos archivos ya creados, puedes encontrar el proyecto en la carpeta exercisefiles/quarkus.

Empecemos a copilotar!!

Tarea 1 - Crear el código para manejar una simple solicitud GET

Pasa al archivo 'DemoResource.java' y empieza a escribir el código para gestionar una simple solicitud GET.

En este primer paso, hemos proporcionado un comentario que describe el código que necesitas generar. Solo pulsa enter y espera un par de segundos.

Copilot generará el código por ti. Si no estás satisfecho con el código, pulsa Ctrl +Enter y te sugerirá varias opciones de código.

. Si no estás satisfecho con el código generado, puedes pulsar enter de nuevo y Copilot generará un nuevo código

Ve a test/java/com/Microsoft/hackthon/quarkus/ y haz clic en DemoResourceTest.java. Ya existe una prueba unitaria implementada para esta tarea.

Haz clic en Terminal -> Nueva Terminal.

Selecciona Gitbash.

Ejecuta el comando. cd exercisefiles/quarkus/copilot-demo/

Puedes ejecutarlo usando los comandos antes y después para validar que el código generado por Copilot es correcto.mvn test

Después de cada tarea, siéntete libre de empaquetar y ejecutar tu aplicación para probarla.

Paquete: mvn package

Corre: mvn quarkus:dev

Haz clic en Dividir terminal, introduce el comando en elsegundo terminal yejecuta

curl -v http:*//localhost:8080/hello?key=world*
curl http:*//localhost:8080/hello*
curl http:*//localhost:8080/hello?key=world*

Tarea 2: Comparación de fechas

Nueva operación bajo /diffdates que calcula la diferencia entre dos fechas. La operación debe recibir dos fechas como parámetro en formato dd-MM-yyyy y devolver la diferencia en días.

Escribe el siguiente comentario y pulsa Enter*// New operation under /diffdates that calculates the difference between two dates. The operation should receive two dates as parameter in format dd-MM-yyyy and return the difference in days.*

Nota: El comentario está en el archivo DemoResource.java. C:\CopiolHackathon\exercisefiles\ quarkus\ copilot-demo\src\main\ java\com\microsoft\hackathon\quarkus\DemoResource.java

Pulsa tab y otra vez Tab para aceptar el código.

Abre DemoResourceTest.java archivo, crea una prueba unitaria que valide la operación. Añade y luego pulsa Enter.*//Create a unit test to validate /diffdates that calculates the difference between two dates*

Pulsa tab para aceptar el código. También puedes usar el siguiente código.

package com.microsoft.hackathon.quarkus;

import jakarta.ws.rs.GET;

import jakarta.ws.rs.Path;

import jakarta.ws.rs.Produces;

import jakarta.ws.rs.QueryParam;

import jakarta.ws.rs.client.Client;

import jakarta.ws.rs.client.ClientBuilder;

import jakarta.ws.rs.client.WebTarget;

import jakarta.ws.rs.core.MediaType;

import jakarta.ws.rs.core.Response;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.URL;

import java.nio.file.Files;

import java.nio.file.Paths;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import java.util.Objects;

import com.fasterxml.jackson.databind.JsonNode;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.node.ObjectNode;

import io.quarkus.fs.util.ZipUtils;

*/* *

The Demo resource should be mapped to the root path.*

*

Create a GET operation to return the value of a key passed as query parameter in the request. *

*

If the key is not passed, return "key not passed".*

If the key is passed, return "hello <key>".*

*

/*

@Path("/")

public class DemoResource {

@GET
@Path("/hello")
@Produces(MediaType.TEXT_PLAIN)

public String hello(@QueryParam("key") String key) {

if (key == null) {

return "key not passed";

} else {

return "hello " + key;

}

}

*// New operation under /diffdates that calculates the difference between two dates. The operation should receive two dates as parameter in format dd-MM-yyyy and return the difference in days. *

@GET
@Path("/diffdates")
@Produces(MediaType.TEXT_PLAIN)

public String diffdates(@QueryParam("date1") String date1, @QueryParam("date2") String date2) {

Objects.requireNonNull(date1, "date1 must not be null");

Objects.requireNonNull(date2, "date2 must not be null");

try {

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");

Date date1Obj = dateFormat.parse(date1);

Date date2Obj = dateFormat.parse(date2);

long diffMillis = Math.abs(date1Obj.getTime() - date2Obj.getTime());

long diffDays = diffMillis / (24 * 60 * 60 * 1000);

return String.valueOf(diffDays);

} catch (Exception e) {

return "invalid date format";

}

}

Abre el terminal y ejecuta el comando. mvn test

Empaqueta la solución ejecutando el comando mvn package

Corre: mvn quarkus:dev or mvn compile quarkus:dev

Terminal dividido y recorrido curl -v http:*//localhost:8080/diffdates*

Tarea 3: Validar el formato de un teléfono español

Valida el formato de un número de teléfono español (+34 prefijo, luego 9 dígitos, empezando por 6, 7 o 9). La operación debe recibir un número de teléfono como parámetro y devolver true si el formato es correcto, falso en caso contrario.

Escribe y pulsa Enter. Pulsa tab para aceptar el código de sugerencia Copilot.*//Validate the format of a spanish phone number (+34 prefix, then 9 digits, starting with 6, 7 or 9). The operation should receive a phone number as parameter and return true if the format is correct, false otherwise*

Escribe y pulsa Enter. Pulsa tab para aceptar las pruebas unitarias sugeridas por copilot*// write unit test to Validate the format of a spanish phone number (+34 prefix, then 9 digits, starting with 6, 7 or 9). The operation should receive a phone number as parameter and return true if the format is correct, false otherwise*

Abre el terminal y ejecuta .mvn test

¡Corre mvn package

¡Corre mvn quarkus:dev

Haz clic en dividir terminal y ejecuta en uno de los terminales -

curl -v http:*//localhost:8080/validatephone?phone=+34866666666*
curl -v http:*//localhost:8080/validatephone?phone=+34666666667*
curl -v http:*//localhost:8080/validatephone?phone=+34666666666*

Tarea 4: Validar el formato de un DNI español

Valida el formato de un DNI español (8 dígitos y 1 letra). La operación debe recibir un DNI como parámetro y devolver true si el formato es correcto, false en caso contrario.

Escribe y pulsa Enter. Pulsa tab para aceptar el código de sugerencia del Copilot.*// Validate the format of a spanish DNI (8 digits and 1 letter). The operation should receive a DNI as parameter and return true if the format is correct, false otherwise.*

Cambia a CopilotDemoApplicationTests.java. Para escribir una prueba unitaria que pruebe la función anterior, añade Pulse Enter. Pulse la pestaña para aceptar el código.*//Write unit test to Validate the format of a spanish DNI (8 digits and 1 letter). The operation should receive a DNI as parameter and return true if the format is correct, false otherwise.*

Abrir la terminal y correr mvn test

¡Corre mvn package

Corre: mvn quarkus:dev

Prueba: curl -v http:*//localhost:8080/hello/validatedni?dni=12345678A*

Tarea 5: Del nombre del color al código hexadecimal

Basándonos en el archivo de colors.json existente bajo recursos, dado el nombre del color como parámetro de camino, devuelven el código hexadecimal. Si no se encuentra el color, devuelva 404

Consejo: Usa TDD. Empieza creando la prueba unitaria y luego implementa el código.

Escribe y pulsa Enter. Pulsa tab para aceptar el código de sugerencia del Copilot.*// Based on the existing colors.json file under resources, given the name of the color as path parameter, return the hexadecimal code. If the color is not found, return 404.*

Cambia a CopilotDemoApplicationTests.java. Para escribir una prueba unitaria que pruebe la función anterior, añade Pulse Enter. Pulse la pestaña para aceptar el código.*//Write unit test to Based on the existing colors.json file under resources, given the name of the color as path parameter, return the hexadecimal code. If the color is not found, return 404.*

¡Corre mvn test

¡Corre mvn package

Corre: mvn quarkus:dev

Prueba: curl -v http:*//localhost:8080/hello/color?color=red*

Tarea 6: Creador de chistes

Crear una nueva operación que llame a la API https://api.chucknorris.io/jokes/random y devuelven el chiste.

Escribe y pulsa Enter. Pulsa tab para aceptar el código de sugerencia del Copilot.*// Create a new operation that call the API https://api.chucknorris.io/jokes/random and return the joke.*

Pulsa tab para aceptar el código

Cambia a CopilotDemoApplicationTests.java. Para escribir una prueba unitaria que pruebe la función anterior, añade Pulse Enter. Pulse la pestaña para aceptar el código.*//Create a new operation that call the API [<u>https://api.chucknorris.io/jokes/random</u>](https://api.chucknorris.io/jokes/random) and return the joke.*

Pulsa tab para aceptar el código.

Haz clic en Terminal -> New Terminal -> Gitbash y ejecuta los comandos a continuación

cd exercisefiles/quarkus/copilot-demo/
mvn test

Ejecuta para empaquetar tu solicitud.mvn package

Corre: mvn quarkus:dev

Prueba: curl -v http:*//localhost:8080/hello/joke*

Tarea 7: Análisis de URL

Dado un parámetro de consulta de una URL, analizarlo y devolver los parámetros de protocolo, host, puerto, ruta y consulta. La respuesta debería estar en formato Json.

Escribe y pulsa Enter. Pulsa tab para aceptar el código de sugerencia del Copilot.*//Given a url as query parameter, parse it and return the protocol, host, port, path and query parameters. The response should be in Json format.*

Cambia a CopilotDemoApplicationTests.java. Para escribir una prueba unitaria que pruebe la función anterior, añade Pulse Enter. Pulse la pestaña para aceptar el código.*//Write unit test for Given a url as query parameter, parse it and return the protocol, host, port, path and query parameters. The response should be in Json format.*

¡Corre mvn test

Ejecuta para empaquetar tu solicitud.mvn package

¡Corre mvn quarkus:dev

Haz clic en split terminal y ejecuta curl -v http:*//localhost:8080/hello/parseurl?url=https://www.google.com/search?q=quarkus*

Tarea 9: Contar palabras

Dado el camino de un archivo y cuenta el número de veces que aparece una palabra proporcionada. El camino y la palabra deberían ser parámetros de consulta. La respuesta debería estar en formato Json.

Escribe y pulsa Enter. Pulsa tab para aceptar el código de sugerencia del Copilot.*//Given the path of a file and count the number of occurrence of a provided word. The path and the word should be query parameters. The response should be in Json format.*

Cambia a CopilotDemoApplicationTests.java. Para escribir una prueba unitaria que pruebe la función anterior, añade Pulse Enter. Pulse la pestaña para aceptar el código.*//Write unit test to Given the path of a file and count the number of occurrence of a provided word. The path and the word should be query parameters. The response should be in Json format.*

Abrir la terminal y correr mvn test

Ejecuta para empaquetar tu solicitud.mvn package

Corre: mvn quarkus:dev

Prueba: curl <http:*//localhost:8080/hello/countword?path=/tmp/test.txt&word=hello*

Puedes pedir a GitHub Copilot el comando curl para tu proyecto.

Tarea 10: Contenerizar la aplicación

Utiliza el archivo Docker proporcionado para crear una imagen docker de la aplicación. En este caso, se proporciona el contenido completo, pero para construir, ejecutar y probar la imagen docker, también usarás Copilot para generar los comandos.

He creado un archivo DOCKER.md donde documentaremos los pasos para construir la aplicación (nativa), construiremos la imagen del contenedor, ejecutaremos el contenedor y probaremos el contenedor.

En el código de Visual Studio, pulsa Ctrl + Shift + X Busca Docker e instálalo.

Haz doble clic en Docker de escritorio y inicia sesion con tu cuenta Docker.

Pulsa Ctrl + Alt+I para abrir el chat de Copilot en Github. Pregunta a tu Copilot how to build the container image, run the container, and test the container with the provided Dockerfile

Sigue la instrucción de Copilot. Construye la aplicación: Ejecuta el siguiente comando en tu terminal:

./mvnw package -Pnative -Dquarkus.native.container-build=true

Construir la imagen de Docker: Suponiendo que tu Dockerfile se llame Dockerfile.native-micro, puedes usar el siguiente comando:

docker build -f Dockerfile.native-micro -t my-app .

Este comando indica a Docker que construya una imagen usando el Dockerfile llamada 'Dockerfile.native-micro' en el directorio actual ('.' al final del comando), y que marque la imagen resultante con el nombre 'my-app'.

Ejecuta la imagen Docker: Después de construir la imagen, puedes ejecutarla con el comando 'docker run':

docker run -p 8080:8080 my-app

Este comando indica a Docker que ejecute un contenedor desde la imagen 'my-app' y que mape el puerto 8080 del contenedor al puerto 8080 de la máquina anfitriona.

Prueba la aplicación: Finalmente, para comprobar si tu aplicación funciona correctamente, puedes enviar una solicitud desde tu navegador o usando una herramienta como:http:*//localhost:8080*curl

curl http:*//localhost:8080*

Este comando envía una solicitud GET a tu solicitud y imprime la respuesta. Si tu aplicación funciona correctamente, deberías ver la respuesta esperada.

Ten en cuenta que estos comandos deben ejecutarse en tu terminal, no en el código de tu aplicación Java.