| :index-group: REST |
| :jbake-type: page |
| :jbake-status: status=published |
| |
| = 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? |
| |
| [source,java] |
| [source,java] |
| ---- |
| package org.superbiz.rest; |
| |
| import javax.ws.rs.GET; |
| import javax.ws.rs.POST; |
| import javax.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(); |
| } |
| } |
| ---- |
| |
| == Probando |
| |
| == Prueba para el servicio JAXRS |
| |
| Usamos el OpenEJB ApplicationComposer para facilitar la prueba. |
| |
| La idea primero es activar los servicios jaxrs. Esto se hace utilizando la anotación ``@EnableServices``. |
| |
| Entonces creamos la aplicación simplemente devolviendo un objeto representando el ``web.xml``. Aquí simplemente lo utilizamos para definir el contexto raíz, pero también puede ser utilizado para definir la aplicación REST. Y para completar la definición de la aplicación agregamos la anotación ``@Classes`` para definir el conjunto de clases a ser utilizado en esta app. |
| |
| Finalmente para probarlo utilizamos la API cliente de ``cxf`` para llamar el servicio REST en los métodos ``get()`` y ``post()``. |
| |
| [source,java] |
| [source,java] |
| ---- |
| package org.superbiz.rest; |
| |
| import org.apache.cxf.jaxrs.client.WebClient; |
| import org.apache.openejb.jee.SingletonBean; |
| import org.apache.openejb.junit.ApplicationComposer; |
| import org.apache.openejb.testing.EnableServices; |
| import org.apache.openejb.testing.Module; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import java.io.IOException; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| @EnableServices(value = "jaxrs") |
| @RunWith(ApplicationComposer.class) |
| public class GreetingServiceTest { |
| @Module |
| public SingletonBean app() { |
| return (SingletonBean) new SingletonBean(GreetingService.class).localBean(); |
| } |
| |
| @Test |
| public void get() throws IOException { |
| final String message = WebClient.create("http://localhost:4204").path("/GreetingServiceTest/greeting/").get(String.class); |
| assertEquals("Hi REST!", message); |
| } |
| |
| @Test |
| public void post() throws IOException { |
| final String message = WebClient.create("http://localhost:4204").path("/GreetingServiceTest/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: |
| |
| [source,bash] |
| [source,java] |
| ---- |
| $ mvn clean install |
| ---- |
| |
| Que probablemente genere una salida como la siguiente. |
| |
| [source,bash] |
| [source,java] |
| ---- |
| INFO - Cannot find the configuration file [conf/openejb.xml]. Will attempt to create one for the beans deployed. |
| INFO - Configuring Service(id=Default Security Service, type=SecurityService, provider-id=Default Security Service) |
| INFO - Configuring Service(id=Default Transaction Manager, type=TransactionManager, provider-id=Default Transaction Manager) |
| INFO - Creating TransactionManager(id=Default Transaction Manager) |
| INFO - Creating SecurityService(id=Default Security Service) |
| INFO - Initializing network services |
| INFO - Creating ServerService(id=httpejbd) |
| INFO - Creating ServerService(id=cxf-rs) |
| INFO - Initializing network services |
| INFO - Starting service httpejbd |
| INFO - Started service httpejbd |
| INFO - Starting service cxf-rs |
| INFO - Started service cxf-rs |
| INFO - ** Bound Services ** |
| INFO - NAME IP PORT |
| INFO - httpejbd 127.0.0.1 4204 |
| INFO - ------- |
| INFO - Ready! |
| INFO - Configuring enterprise application: /opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest |
| INFO - Configuring Service(id=Default Managed Container, type=Container, provider-id=Default Managed Container) |
| INFO - Auto-creating a container for bean org.superbiz.rest.GreetingServiceTest: Container(type=MANAGED, id=Default Managed Container) |
| INFO - Creating Container(id=Default Managed Container) |
| INFO - Using directory /tmp for stateful session passivation |
| INFO - Enterprise application "/opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest" loaded. |
| INFO - Assembling app: /opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest |
| INFO - Existing thread singleton service in SystemInstance() null |
| INFO - Created new singletonService org.apache.openejb.cdi.ThreadSingletonServiceImpl@12c9b196 |
| INFO - Succeeded in installing singleton service |
| INFO - OpenWebBeans Container is starting... |
| INFO - Adding OpenWebBeansPlugin : [CdiPlugin] |
| INFO - All injection points are validated successfully. |
| INFO - OpenWebBeans Container has started, it took 11 ms. |
| INFO - Deployed Application(path=/opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest) |
| INFO - Setting the server's publish address to be http://127.0.0.1:4204/test |
| INFO - REST Service: http://127.0.0.1:4204/test/greeting/.* -> Pojo org.superbiz.rest.GreetingService |
| INFO - Undeploying app: /opt/dev/openejb/openejb-trunk/examples/GreetingServiceTest |
| INFO - Stopping network services |
| INFO - Stopping server services |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec |
| |
| Results : |
| |
| Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 |
| ---- |