package org.superbiz.rest;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
@Path("/greeting")
public class GreetingService {
@GET
public String message() {
return "Hi REST!";
}
@POST
public String lowerCase(final String message) {
return "Hi REST!".toLowerCase();
}
}
REST Simple
Definir un servicio Rest es muy fácil, simplemente necesitamos agregar la anotación @Path en la clase y después definir los métodos HTTP que vamos a usar (@GET, @POST, …).
El Código
El servicio REST: @Path, @GET, @POST
Aquí tenemos un REST simple, anotamos la clase con @Path("/greeting") para indicar la ruta correspondiente a la clase GreetingService. Definimos message() como @GET y lowerCase() como @POST para la ruta /greeting. Pronto tenemos un servicio, muy simple ¿verdad?
Probando
Prueba para el servicio JAXRS
Usamos Arquillian con el adaptador TomEE embedded, así el servicio REST se ejecuta en un TomEE real.
El método @Deployment crea la aplicación web a desplegar. Aquí solo contiene la clase GreetingService, pero también puede contener la aplicación REST y un web.xml. testable = false ejecuta los métodos de prueba como cliente de la aplicación desplegada, y @ArquillianResource inyecta su URL base.
Finalmente para probarlo utilizamos la API cliente de cxf para llamar el servicio REST en los métodos get() y post().
El contenedor se configura en src/test/resources/arquillian.xml: httpPort con valor -1 inicia TomEE en un puerto aleatorio.
package org.superbiz.rest;
import org.apache.cxf.jaxrs.client.WebClient;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.net.URL;
import static org.junit.Assert.assertEquals;
@RunWith(Arquillian.class)
public class GreetingServiceTest {
@ArquillianResource
private URL base;
@Deployment(testable = false)
public static WebArchive app() {
return ShrinkWrap.create(WebArchive.class).addClass(GreetingService.class);
}
@Test
public void get() throws IOException {
final String message = WebClient.create(base.toExternalForm()).path("greeting/").get(String.class);
assertEquals("Hi REST!", message);
}
@Test
public void post() throws IOException {
final String message = WebClient.create(base.toExternalForm()).path("greeting/").post("Hi REST!", String.class);
assertEquals("hi rest!", message);
}
}
Ejecución
Ejecutar la aplicación es muy simple. En el directorio simple-rest ejecuta:
$ mvn clean install
Que probablemente genere una salida como la siguiente.
Running org.superbiz.rest.GreetingServiceTest
INFO: Starting TomEE from: /tmp/arquillian-apache-tomee-20908
INFO: Starting Servlet engine: [Apache Tomcat/11.0.25]
INFO: Starting ProtocolHandler ["http-nio-52756"]
INFO: Configuring enterprise application: /path/to/tomee/examples/simple-rest/target/tomee-embedded/0/5cfb3d73-fabd-4bc4-8550-88f254fe1095
INFO: Enterprise application "/path/to/tomee/examples/simple-rest/target/tomee-embedded/0/5cfb3d73-fabd-4bc4-8550-88f254fe1095" loaded.
INFO: Deployed Application(path=/path/to/tomee/examples/simple-rest/target/tomee-embedded/0/5cfb3d73-fabd-4bc4-8550-88f254fe1095)
INFO: REST Application: http://localhost:52756/5cfb3d73-fabd-4bc4-8550-88f254fe1095/ -> org.apache.openejb.server.rest.InternalApplication
INFO: Service URI: http://localhost:52756/5cfb3d73-fabd-4bc4-8550-88f254fe1095/greeting -> Pojo org.superbiz.rest.GreetingService
INFO: GET http://localhost:52756/5cfb3d73-fabd-4bc4-8550-88f254fe1095/greeting -> String message()
INFO: POST http://localhost:52756/5cfb3d73-fabd-4bc4-8550-88f254fe1095/greeting -> String lowerCase(String)
INFO: Undeploying app: /path/to/tomee/examples/simple-rest/target/tomee-embedded/0/5cfb3d73-fabd-4bc4-8550-88f254fe1095
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.613 s -- in org.superbiz.rest.GreetingServiceTest
Results:
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0