<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaEE &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/category/javaee/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Sun, 02 Aug 2020 22:41:52 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>JavaEE &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Entendiendo los métodos HTTP (JAX-RS)</title>
		<link>https://www.oscarblancarteblog.com/2018/12/05/entendiendo-los-metodos-http-jax-rs/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/05/entendiendo-los-metodos-http-jax-rs/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Wed, 05 Dec 2018 16:00:32 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2419</guid>

					<description><![CDATA[En la entrada pasada hablamos acerca de los métodos HTTP disponibles por JAX-RS, sin embargo, hay ocasiones en las que los métodos implementados por default no son suficientes y necesitamos agregar alguno adicional. &#160; NOTA: Este artículo es parte de un tutorial completo para crear API REST con JAX-RS, si quieres ver el índice completo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img fetchpriority="high" decoding="async" class="aligncenter wp-image-2421 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jax-rs-3-1024x575.jpg" alt="Entendiendo los métodos HTTP (JAX-RS)" width="648" height="364" />En la entrada pasada hablamos acerca de los métodos HTTP disponibles por JAX-RS, sin embargo, hay ocasiones en las que los métodos implementados por default no son suficientes y necesitamos agregar alguno adicional.<span id="more-2419"></span></p>
<p>&nbsp;</p>
<blockquote><p>NOTA: Este artículo es parte de un tutorial completo para crear API REST con JAX-RS, <a href="https://www.oscarblancarteblog.com/api-rest-java-jax-rs/">si quieres ver el índice completo entra aquí</a>.</p></blockquote>
<p>&nbsp;</p>
<p>Antes que nada, podrás encontrar todo el código fuente en GitHub: <a href="https://github.com/oscarjb1/blog-tutorial-jaxrs/tree/master/HTTP%20method%20extensions/api" target="_blank" rel="noopener">https://github.com/oscarjb1/blog-tutorial-jaxrs/tree/master/HTTP%20method%20extensions/api</a></p>
<p>&nbsp;</p>
<p>Para estos casos, JAX-RS nos ofrece la anotación <span class="lang:default decode:true crayon-inline ">@HttpMethod</span>  que nos sirve para crear un nuevo método, esta anotación la tendremos que implementar sobre una anotación personalizada. Digamos que requerimos implementar un nuevo método que nos permite bloquear un recurso para que cualquier otro consumidor del API no pueda modificarlo, para esto, podríamos crear un método HTTP llamado LOCK, veamos cómo quedaría:</p>
<pre class="lang:java decode:true" title="LOCK.java">package api.methods;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.ws.rs.HttpMethod;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@HttpMethod("LOCK")
public @interface LOCK {

}
</pre>
<p>No quiero entrar en los detalles sobre como crear una anotación, pues no es el tema central de este artículo, pues lo que solo nos centraremos en lo que es realmente necesario para crear un nuevo método HTTP. Como vemos, hemos creado una nueva anotación llamada LOCK, esta a su vez, implementa la anotación <span class="lang:default decode:true crayon-inline ">@HttpMethod</span> , la cual recibe como parámetro el nombre del número método HTTP que vamos a implementar, en este caso &#8220;LOCK&#8221;.</p>
<p>&nbsp;</p>
<p>Finalmente, solo restaría implementar un método que implemente la interface <span class="lang:default decode:true crayon-inline ">@LOCK</span> :</p>
<pre class="lang:default decode:true" title="UserService.java">@LOCK
@Path("{userId}")
@Produces(MediaType.TEXT_PLAIN)
public Response lockUser() {
    return Response.ok("User loked").build();
}</pre>
<p>Como vemos, en el método anterior, solo debemos anotar la función con <span class="lang:default decode:true crayon-inline ">@LOCK</span>  y JAX-RS será lo suficientemente inteligente como para detectar que estamos utilizando el método HTTP LOCK.</p>
<p>&nbsp;</p>
<p>Una vez implementado, solo restaría probar que el servicio realmente funciona, para ello utilizamos Restlet para probar el servicio:</p>
<p><img decoding="async" class="aligncenter wp-image-2420 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/LOCK.jpg" alt="HTTP method extension LOCK" width="921" height="747" /></p>
<p>&nbsp;</p>
<p>Hay que tomar en cuenta que los métodos HTTP predefinidos en JAX-RS nos servirán para prácticamente para el 100% de los casos, por lo que no es recomendable implementar un método HTTP solo por hacerlo. Si bien, no es recomendable crear métodos HTTP solo por crearlo o por tener un método proprio, sí que hay dos casos donde se recomienda crear nuestros propios métodos:</p>
<ol>
<li>Cuando estamos creando alguno protocolo nuevo que requiera de la implementación de nuevos métodos.</li>
<li>Cuando alguna aplicación de terceros sobre la cual no tenemos control, nos solicite la creación de un servicio que responda en algún método determinado.</li>
</ol>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Hemos visto como JAX-RS es lo bastante extensible para crear fácilmente nuevos métodos HTTP, aun que como ya vimos, debemos ser cuidados al momento de definir un nuevo método, pues crearlo solo por crearlo, puede ser un error que complique nuestra API.		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/05/entendiendo-los-metodos-http-jax-rs/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2419</post-id>	</item>
		<item>
		<title>Métodos HTTP (REST)</title>
		<link>https://www.oscarblancarteblog.com/2018/12/03/metodos-http-rest/</link>
					<comments>https://www.oscarblancarteblog.com/2018/12/03/metodos-http-rest/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 03 Dec 2018 16:00:13 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2389</guid>

					<description><![CDATA[Los métodos HTTP definen la acción que se realizará sobre un determinado recurso. Los métodos HTTP, también suelen ser llamados HTTP Verbs. Aunque el nombre correcto es Verbs, la realidad es que, en la práctica, casi siempre son llamados “métodos”, por lo que utilizaremos el nombre “métodos” para referirnos a ellos. &#160; NOTA: Este artículo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<img decoding="async" class="aligncenter wp-image-2406 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/jax-rs-2-1024x575.jpg" alt="Métodos HTTP (REST)" width="648" height="364" />Los métodos HTTP definen la acción que se realizará sobre un determinado recurso. Los métodos HTTP, también suelen ser llamados HTTP Verbs. Aunque el nombre correcto es Verbs, la realidad es que, en la práctica, casi siempre son llamados “métodos”, por lo que utilizaremos el nombre “métodos” para referirnos a ellos.<span id="more-2389"></span></p>
<p>&nbsp;</p>
<blockquote><p>NOTA: Este artículo es parte de un tutorial completo para crear API REST con JAX-RS, <a href="https://www.oscarblancarteblog.com/api-rest-java-jax-rs/">si quieres ver el índice completo entra aquí</a>.</p></blockquote>
<p>&nbsp;</p>
<p>Entender los métodos HTTP es fundamental para comprender la forma en que funciona la arquitectura REST, pues mediante los métodos le indicamos al servidor la forma en que debe de tratar una determinada petición, dicho esto, una misma URL puede ser tratada de forma diferente por el servidor.</p>
<p>&nbsp;</p>
<p>HTTP define una gran cantidad de métodos que son utilizados para diferentes circunstancias, por lo que trataremos de listar lo más relevantes y más utilizamos en la construcción de servicios REST, los métodos son los siguientes:</p>
<p>&nbsp;</p>
<ul>
<li><strong>GET:</strong> Es utilizado únicamente para <strong>consultar información</strong> al servidor, muy parecidos a realizar un SELECT a la base de datos. No soporta el envío del payload</li>
<li><strong>POST:</strong> Es utilizado para solicitar la <strong>creación de un nuevo registro</strong>, es decir, algo que no existía previamente, es decir, es equivalente a realizar un INSERT en la base de datos. Soporta el envío del payload.</li>
<li><strong>PUT</strong>: Se utiliza para <strong>actualizar por completo un registro existente</strong>, es decir, es parecido a realizar un UPDATE a la base de datos. Soporta el envío del payload.</li>
<li><strong>PATCH</strong>: Este método es similar al método PUT, pues permite actualizar un registro existente, sin embargo, este se utiliza cuando <strong>actualizar solo un fragmento del registro</strong> y no en su totalidad, es equivalente a realizar un UPDATE a la base de datos. Soporta el envío del payload</li>
<li><strong>DELETE</strong>: Este método se utiliza para <strong>eliminar un registro existente</strong>, es similar a DELETE a la base de datos. No soporta el envío del payload.</li>
<li><strong>HEAD</strong>: Este método se utilizar para <strong>obtener información sobre un determinado recurso</strong> sin retornar el registro. Este método se utiliza a menudo para probar la validez de los enlaces de hipertexto, la accesibilidad y las modificaciones recientes.</li>
</ul>
<p>&nbsp;</p>
<p>Hasta aquí los métodos más utilizados en la construcción de servicios REST con JAX-RS, sin embargo, existen algunos métodos más que son interesantes conocer, pues no los encontraremos al momento de depurar o analizar el tráfico de red.</p>
<ul>
<li><strong>CONNECT</strong>: Se utiliza para establecer una comunicación bidireccional con el servidor. En la práctica no es necesario ejecutarlo, si no el mismo API de HTTP se encarga de ejecutarlo para establecer la comunicación previo a lanzar alguna solicitud al servidor.</li>
<li><strong>OPTIONS</strong>: Este método es utilizado para describir las opciones de comunicación para el recurso de destino. Es muy utilizado con <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS">CORS</a> (Cross-Origin Resource Sharing) para validar si el servidor acepta peticiones de diferentes origines.</li>
</ul>
<p>&nbsp;</p>
<p>A pesar de que los métodos están diseñados para realizar ciertas acciones, la realidad es que <strong>nada impide que los utilices de forma errónea</strong>, es decir, fácilmente podrías utilizar el método DELETE para consultar o el POST para eliminar un recurso, si bien, el API funcionará, el desarrollador se volverá loco al intentar entender como funciona el API, es por este motivo que debemos entender y tener mucho cuidado en la forma en que implementamos los métodos.</p>
<p>&nbsp;</p>
<p>A pesar de que existe una gran cantidad de método HTTP, la implementación de JAX-RS solo implementa los que son realmente utilizados para crear servicios REST. Para implementar un método HTTP con JAX-RS solo es necesario anotar un método con cualquiera de las siguientes anotaciones del paquete <span class="lang:default decode:true crayon-inline">javax.ws.rs</span> :</p>
<ul>
<li>@GET</li>
<li>@POST</li>
<li>@PUT</li>
<li>@DELETE</li>
<li>@HEAD</li>
<li>@OPTION</li>
</ul>
<p>&nbsp;</p>
<p>Por ejemplo, para crear un servicio que retorne todos los Usuarios, podríamos crear un método como el siguiente:</p>
<pre class="lang:default decode:true">@GET
public Response findAllUsers() {
    List&lt;Users&gt; users = userDAO.getUsers();
    return Response.ok(users ).build();
}</pre>
<p>&nbsp;</p>
<p>Antes de comenzar, te cuento que puedes descargar el código completo en <a href="https://github.com/oscarjb1/blog-tutorial-jaxrs/tree/master/M%C3%A9todos%20HTTP/api" target="_blank" rel="noopener">https://github.com/oscarjb1/blog-tutorial-jaxrs/tree/master/M%C3%A9todos%20HTTP/api</a></p>
<p>&nbsp;</p>
<p>De la misma forma, podríamos crear cualquier otro método y anotarlo con el método que necesitemos. Para comprobar cómo funcionan los métodos, vamos a crear un servicio REST que nos permite tener las operaciones básicas para realizar un CRUD (Altas, Bajas, Cambio, Consulta en inglés).</p>
<pre class="lang:java decode:true " title="UserService.java">package api.services;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;

import api.domain.User;


@Path("/users")
@Consumes(value= MediaType.APPLICATION_JSON)
@Produces(value = MediaType.APPLICATION_JSON)
public class UserService {
	
	//User database pre-initialization
	private static final List&lt;User&gt; users = new ArrayList&lt;&gt;();
	
	static {
		users.add(new User(1L, "oscar", "1234"));
		users.add(new User(2L, "juan", "1234"));
		users.add(new User(3L, "maria", "1234"));
	}
	
	
	@GET
	public Response findAllUsers() {
		return Response.ok(this.users).build();
	}
	
	@POST
	public Response createUser(User userRequest) {
		userRequest.setId(users.size()+1l);
		this.users.add(userRequest);
		return Response.ok(userRequest).build();
	}
	
	@PUT
	public Response updateUser(User userRequest) {
		List&lt;User&gt; found = this.users.stream().filter(
                    x -&gt; userRequest.getId() == x.getId()).collect(Collectors.toList());
		
		//Throws error in case of the user not found
		if(found.isEmpty()) 
                    return Response.status(Status.BAD_REQUEST).entity("User not found").build();
		
		User updateUser = found.get(0);
		updateUser.setPassword(userRequest.getPassword());
		updateUser.setUsername(userRequest.getUsername());
		return Response.ok(updateUser).build();
	}
	
	@DELETE
	@Path("{userId}")
	public Response deleteUser( @PathParam("userId") long userId) {
		System.out.println("userId ==&gt; " + userId);
		List&lt;User&gt; found = this.users.stream().filter(
                    x -&gt; userId == x.getId().longValue()).collect(Collectors.toList());
		
		//Throws error in case of the user not found
		if(found.isEmpty()) 
                    return Response.status(Status.BAD_REQUEST).entity("User not found").build();
		
		User updateUser = found.get(0);
		this.users.remove(updateUser);
		return Response.noContent().build();
	}
	
	
	@HEAD
	public Response pingUsersService() {
		return Response.noContent().header("running", true).build();
	}
	
}

</pre>
<p>Como podrás apreciar, no estamos utilizando una base de datos real para guardar los cambios, pues no es el propósito en este punto, más bien, queremos enfocarnos en la forma en que los métodos son declarados, dicho esto, pasemos a analizar cómo funciona:</p>
<p>&nbsp;</p>
<h2>Inicialización del servicio</h2>
<p>En primer lugar, podemos apreciar que el servicio responde en el path <span class="lang:default decode:true crayon-inline">/users</span>, lo cual podemos comprobar en la anotación <span class="lang:default decode:true crayon-inline ">@Path</span>  a nivel de clase. Por el momento no profundizaremos en esto, pues más adelante tendremos una sección especial para explicar cómo funcionan los paths. Por otra parte, tenemos una lista llamada users, la cual utilizaremos como un sustituto a la DB para ir guardando los nuevos usuarios, actualizar o borrar los existentes. De entrada, iniciamos la lista con 3 usuarios.</p>
<p>Las anotaciones <span class="lang:default decode:true crayon-inline ">@Consumes</span>  y <span class="lang:default decode:true crayon-inline ">@Produces</span>  las utilizamos para indicar que él payload recibido y enviado como respuesta serán en formato JSON respectivamente. En otra sección de esta guía profundizaremos en el tema, por lo que por ahora no es necesario entender del todo esta parte.</p>
<p>&nbsp;</p>
<h2>Consulta de todos los usuarios (@GET)</h2>
<p>El método <span class="lang:default decode:true crayon-inline">findAllUsers</span> es utilizado fue desarrollado para retornar todos los usuarios que tengamos registrados. Como ya hablamos anteriormente, de inicio tendremos 3 usuarios precargados, por lo que podremos comprobar si realmente funciona. Para la prueba utilizaremos el plugin de Chrome llamado Restlet, pero podrías utilizar otros programas como SOAPUI.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2390 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/GET.jpg" alt="Métodos HTTP GET" width="1021" height="802" /></p>
<p>En la imagen podemos apreciar claramente que, al ejecutar el servicio, este nos regresa un array con los 3 usuarios que se pre-cargaron.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Crear un nuevo usuario (@POST)</h2>
<p>De la misma forma en la que consultamos los usuarios existentes, podemos crear nuevos mediante el método POST. La única diferencia, es que es necesario enviarle en el payload el <span class="lang:default decode:true crayon-inline ">username</span>  y el <span class="lang:default decode:true crayon-inline ">password</span>  con el que se deberá crear, el ID será auto generado.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2391 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/POST.jpg" alt="Métodos HTTP POST" width="918" height="747" /></p>
<p>Como resultado de la ejecución, tenemos un nuevo usuario creado, podemos comprobar que es nuevo por el ID que se va generando de forma secuencial.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Actualización de un usuario existente (@PUT)</h2>
<p>De la misma forma en que acabamos de crear un usuario, podemos actualizar sus datos mediante el método PUT. Para comprobar de que el usuario es actualizado, podremos observar que el ID del mismo no cambiara, y en su lugar, solo se actualizara el <span class="lang:default decode:true crayon-inline ">username</span>  y el <span class="lang:default decode:true crayon-inline ">password</span> . Como vamos a actualizar el registro, es necesario enviarle el ID como parámetro.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2392 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/PUT.jpg" alt="Métodos HTTP PUT" width="919" height="744" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>Eliminar un usuario (@DELETE)</h2>
<p>El caso del delete es un poco diferente, pues como este método no soporta enviarle el payload, es necesario enviarle el ID del usuario a eliminar de otra forma. En este caso, vamos a enviarle el ID como parte de la URL, es por ello, que agregaremos “<strong>/1</strong>” al final y agregaremos la anotación <span class="lang:default decode:true crayon-inline ">@PathParam</span>  para indicarle a JAX-RS como debe de recuperar el ID. Más adelante en otra sección de este tutorial analizaremos cómo funcionan estos parámetros, por ahora no nos preocupemos por esto.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2393 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/DELETE.jpg" alt="Métodos HTTP DELETE" width="938" height="622" /></p>
<p>En este caso no hay necesidad de retornar nada, es por ello que vemos el mensaje de “NO CONTENT”.</p>
<p>&nbsp;</p>
<h2>Comprobar disponibilidad del servicio (@HEAD)</h2>
<p>Finalmente, validaremos si el servicio está activo realizando una petición HEAD, el cual nos regresará el header “running” si está actualmente en funcionamiento.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2394 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/HEAD.jpg" alt="Métodos HTTP HEAD" width="941" height="687" /></p>
<p>&nbsp;</p>
<h2>Conclusiones</h2>
<p>Como hemos podido comprobar, crear servicios REST que respondan en los diferentes métodos es sumamente simple, y solo falta anotar el método con la anotación adecuada para crear un nuevo servicio. Solo quedo pendiente comprobar el funcionamiento del método OPTION (<span class="lang:default decode:true crayon-inline ">@OPTION</span> ) el cual tu podrías implementar como tarea.</p>
<p>&nbsp;		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/12/03/metodos-http-rest/feed/</wfw:commentRss>
			<slash:comments>47</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2389</post-id>	</item>
		<item>
		<title>Creando un API REST en Java (parte 1)</title>
		<link>https://www.oscarblancarteblog.com/2018/06/25/creando-un-api-rest-en-java-parte-1/</link>
					<comments>https://www.oscarblancarteblog.com/2018/06/25/creando-un-api-rest-en-java-parte-1/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 25 Jun 2018 16:51:59 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2081</guid>

					<description><![CDATA[Sin lugar a duda, los servicios REST ya se han convertido en la principal tecnología para construir servicios, superando con creces a los servicios SOAP o comúnmente conocidos como Web Services. A pesar de que REST ya es visiblemente la tendencia en el desarrollo de servicios, sigue existiendo una gran discusión acerca de si SOAP [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/06/jax-rs-1-1024x575.jpg" alt="Creando un API REST en Java (parte 1)" class="wp-image-2408"/></figure></div>



<p class="wp-block-paragraph">Sin lugar a duda, los servicios REST ya se han convertido en la principal tecnología para construir servicios, superando con creces a los servicios SOAP o comúnmente conocidos como Web Services. A pesar de que REST ya es visiblemente la tendencia en el desarrollo de servicios, sigue existiendo una gran discusión acerca de si SOAP es mejor que REST o al revés, sin embargo, no quiera tocar este tema ahora, pues no es el tema central de este artículo, para eso he creado el artículo “<a href="https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/">SOA vs REST</a>” donde discutimos sobre estas dos tecnologías y sus ventajas y desventajas.</p>



<span id="more-2081"></span>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>NOTA: Este artículo es parte de un tutorial completo para crear API REST con JAX-RS,&nbsp;<a href="https://www.oscarblancarteblog.com/api-rest-java-jax-rs/">si quieres ver el índice completo entra aquí</a>.</p></blockquote>



<p class="wp-block-paragraph">Antes de comenzar, te cuento que puedes descargar el código completo en&nbsp;<a href="https://github.com/oscarjb1/blog-tutorial-jaxrs/tree/master/M%C3%A9todos%20HTTP/api" target="_blank" rel="noopener noreferrer">https://github.com/oscarjb1/blog-tutorial-jaxrs/tree/master/M%C3%A9todos%20HTTP/api</a></p>



<h2 class="wp-block-heading">Configurando el proyecto</h2>



<p class="wp-block-paragraph">Dicho este, pasemos ahora si a implementar un API REST con Java, para esto, será indispensable crear un proyecto de tipo WEB en tu IDE favorito, en este caso, vamos a crear un “Dynamic web project” en Eclipse, para esto nos dirigimos a file -&gt; new -&gt; Other en el menú superior:</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/06/1-dynamic-web-project.jpg" alt="" class="wp-image-2084"/></figure></div>



<p class="wp-block-paragraph">Seleccionamos la opción Dynamic web Project y presionamos Next para iniciar con la configuración de la aplicación:</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/06/2-configure-project.jpg" alt="" class="wp-image-2085"/></figure></div>



<p class="wp-block-paragraph">Una vez aquí, escribimos “<em>api</em>” como nombre del proyecto y seleccionamos nuestro servidor de aplicaciones de preferencia, en nuestro caso, utilizamos Wildfly 11 pero podrías utilizar cualquier otro que tengas disponible. Finalmente, presionamos “<em>Finish</em>” para concluir con la creación del proyecto. El siguiente paso será convertir nuestro proyecto a un proyecto Maven, con la finalidad de administrar más fácilmente nuestras librerías. Para ello, nos posicionaremos sobre el proyecto creado y presionaremos “<em>click derecho</em>“ para abrir las opciones del proyecto, estando allí, nos dirigimos a <em>configure -&gt; convert to Maven Project</em>, tras presionar esto, saldrá una ventana para configurar el proyecto, a lo que simplemente daremos finalizar.</p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/06/3-proyecto-creado.jpg" alt="" class="wp-image-2086"/></figure></div>



<p class="wp-block-paragraph">Tras realizar los pasos anteriores deberás ver el proyecto tal y como se ve en la imagen anterior. Podrás observar una pequeña “M” en el ícono del proyecto, señal de que se trata de un proyecto Maven.</p>



<p class="wp-block-paragraph">El siguiente paso es configurar las librerías de JavaEE y Wildfly con la finalidad de que estén disponibles en nuestro proyecto, por lo que tendremos que ir al archivo pom.xml y agregar las siguientes dos librerías: </p>



<pre class="wp-block-code"><code lang="" class=" line-numbers">&lt;dependency> 
    &lt;groupId>javax&lt;/groupId> 
    &lt;artifactId>javaee-api&lt;/artifactId> 
    &lt;version>7.0&lt;/version> 
    &lt;scope>provided&lt;/scope> 
    &lt;type>jar&lt;/type> 
&lt;/dependency> 
&lt;dependency> 
    &lt;groupId>org.wildfly.core&lt;/groupId> 
    &lt;artifactId>wildfly-server&lt;/artifactId> 
    &lt;version>2.2.0.Final&lt;/version> 
    &lt;scope>provided&lt;/scope> 
&lt;/dependency></code></pre>



<p class="wp-block-paragraph">Guardamos los cambios y tendremos que esperar un momento hasta que Eclipse descarga todas las dependencias necesarias, para esto, verás un indicador de progreso en la parte inferior derecha de Eclipse. Una vez que ha finalizado, estamos listos para empezar a desarrollar.</p>



<h2 class="wp-block-heading">Iniciando el desarrollo</h2>



<p class="wp-block-paragraph">Lo primero que debemos de hacer para iniciar nuestra API REST es indicarle el Path base desde el cual estará respondiendo nuestra API. Este path corresponde a la URL a partir de la cual se expondrá nuestros servicios. Para lograr esto, será necesario crear una clase que extienda de “Application”, esta clase puede llamarse como sea y puede colocarse en cualquier paquete, lo único importante es que extienda de Application y defina la anotación <code>@ApplicationPath</code>. En nuestro caso crearemos la clase <code>RestApplication</code> en el package api. </p>



<pre class="wp-block-code"><code lang="java" class="language-java line-numbers">package api; 

import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 

@ApplicationPath("/") 
public class RestApplication extends Application { 
}</code></pre>



<p class="wp-block-paragraph">Como podemos ver, hemos definido “/” como URL base, es decir que los servicios responderán a partir de la raíz del proyecto, pero tu podrías remplazarla por la URL base que más te guste, como por ejemplo “/api” o “/services”.</p>



<p class="wp-block-paragraph">El siguiente paso será crear nuestro primer servicio, para lo cual deberemos crear una nueva clase, en este caso, crearemos la clase <code>HelloWorldRest</code> en el mismo paquete:</p>



<pre class="wp-block-code"><code lang="java" class="language-java line-numbers">package api; 
import javax.ws.rs.Consumes; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("/helloworld") 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public class HelloWorldRest {               

    @GET  
    public Response sayHello() {     
        return Response.ok("Hello World desde el API REST",MediaType.APPLICATION_JSON).build();   
    } 
}</code></pre>



<p class="wp-block-paragraph">Como podrás observar, esta es una clase común y corriente pero que tiene algunas anotaciones, las cuales serán reconocidas por el servidor de aplicaciones para finalmente exponer el servicio, analicemos para que esta cada una de ellas.</p>



<p class="wp-block-paragraph">La anotación <code>@Path</code> indica la URL en la cual responderá este servicio, cabe mencionar que esta anotación se puede poner a nivel de clase y método, en este caso, al estar a nivel de clase, afecta a todos los servicios que definamos, pero eso lo vamos a analizar más adelante.</p>



<p class="wp-block-paragraph">Las siguientes dos anotaciones son para indicar que tipo de mensaje esperamos como entrada (consumes) y que tipo de mensaje vamos a responder (produces). En este caso, estamos indicando que esperamos JSON como entrada y que vamos a responder igualmente con JSON.</p>



<p class="wp-block-paragraph">Finalmente, siguen los métodos, una clase puede tener más de un método, y cada método se puede exponer como un servicio independiente, sin embargo, en esta primera introducción empezaremos con uno. La anotación <code>@GET</code> le indica al servidor de aplicaciones que el método responde por el método GET únicamente. Adicional tenemos anotaciones para los demás métodos, como <code>@POST</code>, <code>@PUT</code>, <code>@DELETE</code>, etc. pero estos los estaremos analizando más adelante.</p>



<p class="wp-block-paragraph">Podrás observar que el método responde con un tipo llamado Response, esta es una clase de utilidad que nos proporciona el API de JAX-RS para convertir fácilmente un objeto en un JSON en nuestro caso. Esta clase nos proporciona el método ok, el cual nos crea una respuesta con status 200, es decir, respuesta exitosa, la cual recibe el mensaje que queremos responder y el tipo de datos del mensaje, en nuestro caso JSON.</p>



<h2 class="wp-block-heading">Probando nuestro Hello World</h2>



<p class="wp-block-paragraph">En este punto hemos terminado nuestro primer servicio, por lo que solo resta desplegarlo y probarlo. Para desplegarlo, basta con presionar el click derecho sobre el proyecto y presionar Run As -&gt; Run on Server, presionar siguiente y finalizar.</p>



<p class="wp-block-paragraph">Si la aplicación desplego correctamente, podremos probar el servicio en la URL <a href="http://localhost:8080/api-0.0.1-SNAPSHOT/helloworld">http://localhost:8080/api-0.0.1-SNAPSHOT/helloworld</a>, esta URL la podrás ejecutar directamente sobre el navegador:</p>



<p class="wp-block-paragraph">En este punto te estarás preguntando como es que se generó esta URL, por lo que explico a continuación:</p>



<p class="wp-block-paragraph">La URL se forma con la siguiente formula: &lt;server_path&gt;:&lt;port&gt;/&lt;app_context&gt;/&lt;app_path&gt;/&lt;service_path&gt;</p>



<p class="wp-block-paragraph">La sección &lt;server_path&gt; y &lt;port&gt; corresponde al host del servidor y el puerto en el cual responde, esto corresponde a Wildfly.</p>



<p class="wp-block-paragraph">La sección &lt;app_context&gt; corresponde a la URL base que nos asigna el servidor de aplicaciones cuando desplegamos.</p>



<p class="wp-block-paragraph">La sección &lt;app_path&gt; fue la que definimos en la anotación <code>@ApplicationPath</code>. En nuestro caso, al definirla como “/” quiere decir que responderá a partir de la raíz del proyecto.</p>



<p class="wp-block-paragraph">Finalmente, &lt;service_path&gt; corresponde a la URL definida en la anotación <code>@Path</code>, la cual se definió como “helloworld”.<br><br></p>



<div class="wp-block-image"><figure class="aligncenter"><a href="https://codmind.com/courses/api-rest-con-spring-boot" target="_blank" rel="noreferrer noopener"><img loading="lazy" decoding="async" width="800" height="450" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg" alt="" class="wp-image-3146" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-768x432.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></a><figcaption>Te invito a que veas mi curso Mastering API REST con Spring Boot</figcaption></figure></div>



<h2 class="wp-block-heading">Conclusiones</h2>



<p class="wp-block-paragraph">Hasta este punto hemos aprendido a crear un proyecto web y configurarlo para que responda a nuestras solicitudes como un API REST, por lo que en la siguiente sección de esta guía aprenderemos a utilizar los demás métodos (POST, DELETE, PUT) y aprenderemos a configurar nuestras URL para responder a URL más complejas, por lo que te invito a que te suscribas a mi blog para hacerte llegar las actualizaciones.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/06/25/creando-un-api-rest-en-java-parte-1/feed/</wfw:commentRss>
			<slash:comments>60</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2081</post-id>	</item>
		<item>
		<title>Java 9 &#8211; análisis de las novedades</title>
		<link>https://www.oscarblancarteblog.com/2017/10/02/java-9-analisis-las-novedades/</link>
					<comments>https://www.oscarblancarteblog.com/2017/10/02/java-9-analisis-las-novedades/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 02 Oct 2017 18:47:40 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[centripio]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1861</guid>

					<description><![CDATA[Java 9 trae importantes novedades, pero todo sobre sale el sistema de módulos, para conocer todo acerca de java 9, te invito a veas mi articulo &#8220;Java 9 &#8211; Un análisis de las novedades&#8221; que publique en la revista Centripio Magazine, la cual puedes descargar de forma gratuita en aquí.]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1862 " src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/10/Java9-1024x576.png" alt="Java 9 un análisis de las novedades" width="781" height="440" /></p>
<p>Java 9 trae importantes novedades, pero todo sobre sale el sistema de módulos, para conocer todo acerca de java 9, te invito a veas mi articulo &#8220;Java 9 &#8211; Un análisis de las novedades&#8221; que publique en la revista Centripio Magazine, la cual puedes descargar de forma gratuita en aquí.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/10/02/java-9-analisis-las-novedades/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1861</post-id>	</item>
		<item>
		<title>WebSocket con Java</title>
		<link>https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/</link>
					<comments>https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 23 Feb 2017 10:00:41 +0000</pubDate>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[WebSocket]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1427</guid>

					<description><![CDATA[En este artículo aprenderemos a implementar WebSocket con Java, ya que en el pasado ya había dado una completa Introducción a los WebSocket y explicamos que estos fueron introducidos como una mejora en HTML5, pero también dijimos que los WebSocket son ejecutados por el navegador, y estos requieren de dos partes, un WebSocket cliente (Navegador) [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="alignleft wp-image-594 size-thumbnail" src="https://www.oscarblancarteblog.com/wp-content/uploads/2014/07/google-oracle-java1-150x150.jpg" alt="WebSockets con Java" width="150" height="150" />En este artículo aprenderemos a implementar WebSocket con Java, ya que en el pasado ya había dado una completa <a href="https://www.oscarblancarteblog.com/2017/02/20/introduccion-a-lo-websocket/">Introducción a los WebSocket</a> y explicamos que estos fueron introducidos como una mejora en HTML5, pero también dijimos que los WebSocket son ejecutados por el navegador, y estos requieren de dos partes, un WebSocket cliente (Navegador) y un WebSocket Server (Backend). Pues bien, ya habíamos platicado como es que los WebSocket funcionan del lado del navegador, es por eso que ahora hablaremos de la otra cara, los WebSocket Server.</p>
<p>Como el título de este articulo lo dice, hablaremos de cómo implementar los WebSocket utilizado Java como BackEnd, pero cabe mencionar que todos los lenguajes de programación deberían de tener sus propias API’s para soportar conexiones del lado del servidor.  Los WebSocket fueron agregados a apartar de la versión Java EE 7 bajo la especificación JSR 356, es por ello que todos los Application Server certificados para Java EE 7 deberán de tener una implementación estándar de dicha especificación. Basta de charla y pasemos a cómo implementar un WebSocket con Java.</p>
<h2>Implementando un WebSocket con Java</h2>
<p>Para explicar cómo funcionan los WebSocket vamos a implementar un ejemplo muy simple, crearemos una barra de progreso la cual se cargará del valor 0 al 100 simulando que un proceso se está ejecutando en el BackEnd. En el formulario tendremos un botón que iniciara el proceso, cuando el usuario presione el botón, enviaremos un mensaje al BackEnd por medio del WebSocket, en ese momento, el BackEnd iniciara con un proceso de notificaciones el cual enviará por medio del WebSocket un mensaje con las actualizaciones de la barra de progreso. Este ejemplo está desarrollado con Java 8 y Wildfly 9.0.</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1429" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/WebSocket.gif" alt="WebSocket con Java" width="563" height="226" /><span id="more-1427"></span></p>
<p>Este ejemplo está compuesto de 4 archivos:</p>
<ul>
<li><strong>html:</strong> página principal del proyecto, sobre la que mostraremos la barra de progreso.</li>
<li><strong>js:</strong> Archivo de JavaScript en donde está programado el WebSocket y el procesamiento de los mensajes de envío y recepción.</li>
<li><strong>css:</strong> archivo de clases de estilo (opcional).</li>
<li><strong>java</strong>: Clase donde implementamos el WebSocket Server con Java, esta se ejecuta del lado del servidor.</li>
</ul>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-1430" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/WebSocket-con-Java.png" alt="WebSocket con Java" width="683" height="303" /></p>
<p>Todo el código del proyecto lo puedes descargar de GitHub: <a href="https://github.com/oscarjb1/ProgressWebSocket.git">https://github.com/oscarjb1/ProgressWebSocket.git</a></p>
<h2>Index.html</h2>
<p>Primero que nada, veremos el documento index.html para entender como esta armada la pantalla:</p>
<pre class="lang:xhtml decode:true" title="index.hml">&lt;!DOCTYPE html&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;WebSocket Progress&lt;/title&gt;
        &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
        &lt;script type="text/javascript"src="websocket.js"/&gt;&lt;/script&gt;
        &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;section  class="container"&gt;
        &lt;h1&gt;WebSocket Progress&lt;/h1&gt;
        &lt;div&gt;
            &lt;div class="progress-container"&gt;
                &lt;form id="form"&gt;
                    &lt;input id="btnSubmit" type="button" value="start" onclick="formSubmit();"/&gt;
                    &lt;progress id="progress" value="0" max="100"&gt;&lt;/progress&gt;
                    &lt;label for="progress" id="lblProgress"&gt;&lt;/label&gt;
                &lt;/form&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/section&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>Lo primero que hacemos en el Header es importar al archivo <span class="lang:java decode:true crayon-inline">styles.css</span> del cual no hay mucho que decir, salvo que es utilizado para darle una apariencia más agradable a la página, y el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span> del cual hablaremos más adelante.</p>
<p>El siguiente punto importante es el formulario, en el definimos un botón que al presionarlo ejecutara la función <span class="lang:java decode:true crayon-inline">formSubmit()</span> que está definido en el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span>, que iniciara con el proceso de carga del progress bar.</p>
<p>También tenemos un progress, el cual será actualizado a medida que el WebSocket reciba las notificaciones del BackEnd, para lo cual utilizaremos el ID (progress) para identificarlo más adelante. Finalmente, debajo del progress tenemos un label el cual será actualizado con el progreso del progress bar.</p>
<p>Tanto el progress como el label son actualizados por Javascript a medida que el servidor manda los datos por medio del WebSocket.</p>
<h2>Websocket.js</h2>
<p>Por su nombre, podríamos pensar que se trata de una librería o algún script ya desarrollado, pero la realidad es que es un Script totalmente custom y desarrollado a la medida para esta solución.</p>
<pre class="lang:js decode:true " title="websocket.js">var socket = new WebSocket("ws://localhost:8080/ProgressWebSocket-1.0-SNAPSHOT/progress");
socket.onmessage = onMessage;

function onMessage(event) {
    var btnSubmit = document.getElementById("btnSubmit");
    btnSubmit.disabled = true;
    
    var progress = document.getElementById("progress");
    var data = JSON.parse(event.data);
    progress.value = data.value;
    
    var lblProgress = document.getElementById("lblProgress");
    if(data.value &lt; 100){
        lblProgress.innerHTML = 'Progress: ' + data.value + '%';
    }else{
        btnSubmit.disabled = false;
        lblProgress.innerHTML = "Finish";
    }
    
}

function formSubmit() {
    socket.send("{\"start\":\"true\"}");
}</pre>
<p>La primera línea es la más importante, pues en esta se establece la conexión con el servidor, la clase WebSocket es una clase estándar que nos permitirá comunicarnos con el Servidor de una forma simple, esta clase tiene como parámetro la URL sobre la cual escucha el BackEnd, más adelante veremos cómo está formada esta URL, por lo pronto asumamos que existe un WebSocket Server que está escuchando.</p>
<p>En la línea 2 definimos la función que procesara los mensajes entrantes, es decir, cuando el BackEnd envíe un mensaje al navegador, este lo atenderá por medio del método definido, en este caso, establecemos el método <span class="lang:java decode:true crayon-inline">onMessage</span> para procesar los mensajes entrantes.</p>
<p>En la línea 4 definimos el método <span class="lang:java decode:true crayon-inline">onMessage</span> el cual implementa toda la lógica de procesamiento de los mensajes entrantes, el parámetro <span class="lang:java decode:true crayon-inline">event</span> corresponde al evento recibido y mediante event.data es posible recuperar el mensaje que envió el Servidor. Veamos qué es lo que hace. Primero que nada, en las líneas 5-6 obtenemos la referencia el botón y lo deshabilitamos para impedir que se presione mientras esta en procesamiento. En la línea 8 convertimos el mensaje enviado por el Server en un Json para poderlo procesar. En las líneas 10-11 obtenemos una referencia al progress y actualizamos el valor de la barra de progreso, para lo cual establecemos la propiedad value por el valor enviado por el Servidor. En las líneas 13-19 establecemos el valor del label, indicando el progreso recibido por el servidor, en caso de finalizar (100%), la etiqueta cambia a Finish y el botón se habilitado nuevamente.</p>
<p>Finalmente, en las últimas líneas, tenemos el método <span class="lang:java decode:true crayon-inline">formSubmit</span>, el cual es ejecutado por el botón cuando es presionado, este método manda un mensaje dummy al servidor mediante el método send del WebSocket.</p>
<h2>ServerDashboardWebSocket.java</h2>
<p>Esta es la parte principal para implementar un WebSocket con Java, ya que desde aquí es de donde se aceptan las conexiones del navegador y se procesan los mensajes de envío y recepción.</p>
<pre class="lang:java decode:true" title="ServerDashboardWebSocket.java">package com.osb.progresswebsocket.socket;

import java.util.HashSet;
import java.util.Set;
import javax.enterprise.context.ApplicationScoped;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;

/**
 * @author Oscar Blancarte &lt;oscarblancarte3@gmail.com&gt;
 */
@ApplicationScoped
@ServerEndpoint("/progress")
public class ServerDashboardWebSocket {

    private Set&lt;Session&gt; sessions = new HashSet&lt;&gt;();

    @OnOpen
    public void open(Session session) {
        System.out.println("Session opened ==&gt;");
        sessions.add(session);
    }

    @OnMessage
    public void handleMessage(String message, Session session) {
        System.out.println("new message ==&gt; " + message);
        try {
            for (int c = 0; c &lt; 100; c++) {
                for (Session s : sessions) {
                    s.getBasicRemote().sendText("{\"value\" : \"" + (c + 1) + "\"}");
                }
                Thread.sleep(100);
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }

    @OnClose
    public void close(Session session) {
        System.out.println("Session closed ==&gt;");
        sessions.remove(session);
    }

    @OnError
    public void onError(Throwable e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}</pre>
<p>Primero que nada, observemos que esta es una clase común y corriente, no extiende ni implementa ninguna clase, sin embargo, esta anotada con <span class="lang:java decode:true crayon-inline">@ApplicationScope</span> y <span class="lang:java decode:true crayon-inline">@ServerEndpoint</span>. Si ya has trabajado con JavaEE es muy probable que conozcas la primera, la cual no pertenece al API de WebSocket, pero es utilizada para crear un Bean disponible durante toda la vida de la aplicación. La segunda, <span class="lang:java decode:true crayon-inline">@ServerEndpoint</span> es en la que debemos de poner atención, con tan solo marcar una clase con ella, le estamos diciendo al Application Server que esta se trata de un WebSocket Server el cual estará escuchando en la URL <strong>http://&lt;HOST&gt;:&lt;PORT&gt;/&lt;APPLICATION&gt;/progress</strong>, la última parte de la url (/progress) es la que definimos en la anotación <span class="lang:java decode:true crayon-inline">@ServerEndpoint</span> por lo que tenemos que tener cuidado de que coincida con la URL que definimos en el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span>.</p>
<p>También podemos ver que tenemos una Set de <span class="lang:java decode:true crayon-inline">Session</span>. Las Session son objetos que representan las conexiones de los navegadores, por lo que tendremos un Set para no perder la referencia a todas las conexiones.</p>
<p>A continuación, veremos una serie de métodos anotados, estas anotaciones le dicen a Application Server que método debe de ejecutar ante cualquier evento. Veamos los diferentes métodos.</p>
<p><strong>Método open</strong>, está marcado con la anotación <span class="lang:java decode:true crayon-inline">@OnOpen</span> y se ejecutara cada vez que una nueva conexión se establezca con el servidor, el parámetro Session representa la conexión y la almacenamos en el Set de sesiones.</p>
<p><strong>Método close</strong>, esta anotado con <span class="lang:java decode:true crayon-inline">@OnClose</span> y se ejecutara cada vez que una sesión se desconecte. Recibe el objeto Session que se desconectó para poder identificarla.</p>
<p><strong>Método onError</strong>, esta anotado con <span class="lang:java decode:true crayon-inline">@OnError</span>, y se ejecutara ante cualquier error, el error es enviado como parámetro.</p>
<p><strong>Método handleMessage</strong>, anotado con <span class="lang:java decode:true crayon-inline">@OnMessage</span>, será ejecutado cada vez que llegue un nuevo mensaje de alguno de los navegadores. Este recibe como parámetro el mensaje enviado y el objeto Session que mando el mensaje. Este es el método más importante en nuestro ejemplo, porque una vez recibido un mensaje, iniciara una serie de envíos de mensajes al navegador. Observemos que haremos un ciclo del 1 al 100 y en cada interación enviaremos al Navegador un mensaje con el progreso, al finalizar cada interación, dormiremos el hilo 100 milisegundos para apreciar mejor como se llena la barra. Utilizamos el método <span class="lang:java decode:true crayon-inline">getBasicRemote()</span> para que nos regrese una implementación de envío asíncrono y seguido ejecutamos el método <span class="lang:java decode:true crayon-inline">sendText</span>, el cual se utiliza para mandar un mensaje de texto al navegador.</p>
<p><figure id="attachment_3146" aria-describedby="caption-attachment-3146" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/api-rest-con-spring-boot"><img loading="lazy" decoding="async" class="wp-image-3146 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg" alt="Curso Mastering API REST con Spring boot" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2019/08/banner-lg-768x432.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3146" class="wp-caption-text">Te invito a que veas mi curso Mastering API REST con Spring Boot</figcaption></figure></p>
<h2>Resumen:</h2>
<p>Repasemos como funciona todo, cuando entramos a la página, esta carga el archivo <span class="lang:java decode:true crayon-inline">websocket.js</span> y establece conexión inmediata con el Servidor, en este momento el método open de la clase <span class="lang:java decode:true crayon-inline">ServerDashboardWebSocket.java</span> es ejecutado para recibir la nueva sesión. Seguido, el usuario presiona el botón start y envía mediante el función <span class="lang:java decode:true crayon-inline">websocket.send</span> un mensaje al Servidor, el Servidor recibe el mensaje mediante el método <span class="lang:java decode:true crayon-inline">handleMessage</span> de la clase <span class="lang:java decode:true crayon-inline">ServerDashboardWebSocket.java</span>, el cual envía una serie de mensaje como respuesta al navegador, por su parte, el navegador procesa los mensajes entrantes mediante la función <span class="lang:java decode:true crayon-inline">onMessage</span> de JavaScript, en esta función se actualiza la barra de progreso.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/02/23/websocket-con-java/feed/</wfw:commentRss>
			<slash:comments>22</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1427</post-id>	</item>
		<item>
		<title>Java Message Service (JMS)</title>
		<link>https://www.oscarblancarteblog.com/2014/07/25/java-message-service-jms/</link>
					<comments>https://www.oscarblancarteblog.com/2014/07/25/java-message-service-jms/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 25 Jul 2014 17:12:46 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaEE]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JMS]]></category>
		<guid isPermaLink="false">http://javamex.wordpress.com/?p=220</guid>

					<description><![CDATA[En este Post se habla hacer de la especificación de JMS, los patronos de entrega de manejes que soporta como lo son Punto a Punto(P2P) y Publicador/Suscriptor. También hablare sobre los Temas y Colas (Topis and Queues) y los diferentes tipos de suscriptores que soporta la implementación de JMS. Java Message Service es una especificación [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>				<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/queue1.png"><img loading="lazy" decoding="async" class=" wp-image-267 alignleft" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/queue1.png" alt="Queue" width="171" height="100" /></a>En este Post se habla hacer de la especificación de JMS, los patronos de entrega de manejes que soporta como lo son Punto a Punto(P2P) y Publicador/Suscriptor. También hablare sobre los Temas y Colas (Topis and Queues) y los diferentes tipos de suscriptores que soporta la implementación de JMS.</p>
<p>Java Message Service es una especificación de la Java Community Process(JRS 914) la cual fue desarrollada originalmente para permitir a las aplicaciones Java comunicarse con los proveedores MOM o Middleware Orientado a Mensajes la cual buscaba los siguientes objetivos:<span id="more-220"></span></p>
<ul>
<li>Brindas un mecanismo de enrutamiento y entrega de mensajes.</li>
<li>Entrega fiable de mensajes</li>
<li>Soportar los patronos de entrega de mensajes Punto a Punto(P2P) y Publicador/Subscriptor (P/S)</li>
<li>Brindar un mecanismo asíncrono de entrega de mensajes.</li>
</ul>
<p>En el mercado podemos encontrar diferentes proveedores de JMS los cuales se encuentran embebidos en los principales Application Server como el caso de WebSphere, Wildfly, WebLogic, Glassfish, entre otros, sin embargo todos trabajan bajo el mismo estándar lo que permite que la comunicación entre ellos sea totalmente compatible.</p>
<p>La siguiente imagen muestra como JMS permite que las aplicaciones se pueden comunicar por medio de JMS.<a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/archjms1.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-264" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/archjms1.png" alt="ArchJMS" width="632" height="414" /></a></p>
<p>Fig.1: Muestra el proceso por el cual las aplicaciones se comunican a través de JMS.</p>
<p>Aunque JMS es un potente proveedor de Mensajería requiere de la configuración de Colas o Temas para poder depositar lo mensajes de entrada.</p>
<p>Tanto las colas como los temas son muy utilizados en los ambientes distribuidos donde se requerimos una comunicación asíncrona o One Wey(Solo ida) entre los distintos componentes que conforman nuestra infraestructura sin embargo estos se diferencias de los servicios web debido a que los mensajes son colocados en Cola o Temas para luego ser distribuidos a los destinatarios por lo que cambia un poco la forma en que los mensajes son administrados.</p>
<h2><strong>Estructura de un mensaje JMS</strong></h2>
<p>Al igual que todo protocolo de comunicación los mensajes JMS tiene una Taxonomía la cual se debe de respetar para que los mensajes sea enviados y respondidos de forma correcta.Los mensajes JMS tiene la siguiente estructura:</p>
<h3><strong>Header</strong></h3>
<p>El Header o cabecera es la parte que contiene todas las propiedades que son necesarias para JMS pueda operar y procesar lo mensajes de forma correcta, Es en esta sección donde es establece el identificador de la conversación(CorrelationID ),Fecha de expiración(Expiration),Tipo de mensaje(Type), Destino al cual deberán responder el mensaje(ReplyTo) y muchas mas las cuales puedes encontrar en la pagina de <a href="http://docs.oracle.com/cd/E19509-01/820-2239/bpado/index.html">Oracle</a>.</p>
<h3><strong>Body</strong></h3>
<p>Esta sección tiene el PayLoad o carga útil la cual representa el mensaje que queremos enviar, Este mensajes puede ser una Map, Texto plano, XML, un Objeto Java, O un Stream o incluso un mensaje personalizado. Lo importante es que esta sección contiene lo que realmente queremos comunicar al destinatario.</p>
<p>&nbsp;</p>
<p>Una vez explicado a grandes rasgos podemos pasar a explicar que son las Colas(Queue) y Temas(Topics).</p>
<h2><strong>Colas (Queue)</strong></h2>
<p>Las colas son las mas utilizadas ya que los mensajes van dirigidos a un único receptor por lo cual, cuando un cliente se conecta a JMS y solicita el mensaje este es entregado pero es eliminado de la Cola por lo que si otra cliente busca el mensaje ya no lo encontrara. Este patrón es conocido como Punto a Punto(P2P)</p>
<p>Te invito a ver mi artículo <a href="https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/">Estructura de datos Queue</a> para aprender más acerca de las colas.</p>
<h2 class="entry-title"><a href="https://www.oscarblancarteblog.com/2014/08/01/estructura-de-datos-queue-cola/" rel="bookmark">Estructura de datos – Queue (Cola)</a></h2>
<p>En este tipo mensajes hay que tener un cierto cuidad a la hora de solicitar los mensajes ya que si recuperamos un mensaje equivocado el destinatario real ya no lo podrá recibir y pero a un , El remitente jamas recibirá su respuesta.(JMS Permite tener varios clientes solicitando mensajes a la misma Cola)</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/queue1.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-267" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/queue1.png" alt="Queue" width="635" height="372" /></a></p>
<p>Fig.2: Como podemos apreciar en la imagen al único que se le entrega el mensaje  es aquel al que fue dirigido y las demas aplicaciones no son notificadas.</p>
<p>Cuando utilizar Colas:</p>
<p>Las colas son utilices cuando queremos enviar un mensaje a un destinataria único para ser procesado, un ejemplo seria mandar una solicitud de crédito al sistema de crédito(por ponerle un nombre). o simplemente para desacoplar dos sistemas los cuales no queremos que se conozcan sin embargo lo único que conocen los dos es el formato en que se tendrá que hacer la comunicación ( <a title="JMS en la integración" href="http://javamex.wordpress.com/2014/07/15/jms-en-las-integraciones/">Aquí explico esto</a> )</p>
<h2><strong>Temas(Topics)</strong></h2>
<p>Por otra parte tenemos lo temas los cuales trabajan de una forma distinta que las Colas pues estos a diferencia de que el mensaje solo es entregado a un único receptor lo Temas pueden enviar el mensaje a Todos los clientes que estén suscritos al Tema de esta manera los Temas(Topics) Siguen el patrón de Publicador/Subscriptor.</p>
<p><a href="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/topic.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-269" src="http://www.oscarblancarteblog.com/wp-content/uploads/2014/07/topic.png" alt="Topic" width="629" height="379" /></a></p>
<p>Fig.3: Como podemos apreciar todos los suscriptores que estén suscritos al Tema(Topic) recibirán una copia del mensaje.</p>
<p>Cuando utilizar Temas(Topic)</p>
<p>Los Temas son buenos cuando queremos notificar o compartir información a múltiples destinatarios. Por ejemplo, Si tu estas suscrito a mi blog, Cada vez que yo publique un nuevo Post seras notificado por correo electrónico junto con todos los demas que estén suscritos, esto no es precisamente JMS pero es un ejemplo de donde mas de un destinatario reciben la misma notificación.</p>
<p>¿Crees que JMS juega un papel importante en Java o crees que es una herramienta fácilmente sustituida por otras cosas?</p>
<p>&nbsp;</p>
<p>*Recuerda que si te gusto este artículo, compártelo y suscribete al blog para recibir todas las actualizaciones por medio de tu correo electrónico.		</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2014/07/25/java-message-service-jms/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">220</post-id>	</item>
	</channel>
</rss>
