<?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/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>API REST &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/api-rest/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Sun, 16 Aug 2020 20:53:10 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.12</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>API REST &#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>Valores por defecto con @DefaultValue</title>
		<link>https://www.oscarblancarteblog.com/2019/01/21/valores-por-defecto-con-defaultvalue/</link>
					<comments>https://www.oscarblancarteblog.com/2019/01/21/valores-por-defecto-con-defaultvalue/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 21 Jan 2019 14:00:34 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2748</guid>

					<description><![CDATA[<p>Es habitual que algunos de los parámetros de nuestros servicios sean opcionales para el cliente, lo que provocaría la llega de estos valores en null para nuestra API, lo que puede resultar un problema para algunos parámetros que son requeridos para el correcto funcionamiento del API y que al menos debemos de tener un valor [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/21/valores-por-defecto-con-defaultvalue/">Valores por defecto con @DefaultValue</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/defaultvalues-1024x575.jpg" alt="Default Values con @DefaultValues" class="wp-image-2749"/></figure>



<p>Es habitual que algunos de los parámetros de nuestros servicios sean opcionales para el cliente, lo que provocaría la llega de estos valores en null para nuestra API, lo que puede resultar un problema para algunos parámetros que son requeridos para el correcto funcionamiento del API y que al menos debemos de tener un valor por defecto en caso de no enviarse.<br></p>



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



				
<blockquote class="wp-block-quote"><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><br>Mediante la anotación <code>@DefaultValue</code> podemos establecer un valor por default a algunos de nuestros parámetros que son opcionales para el cliente, lo que evita que tengan un valor nulo al llegar al API. Esta característica es especialmente buena en casos en los que el API necesita que estos parámetros tengan algún valor a pesar que el cliente no lo envíe, pues dejarlos en null puede provocar el fallo del servicio.</p>



<p>Imaginemos el siguiente ejemplo, tenemos que construir un servicios de consulta de clientes que permita paginar los resultados, por lo que el servicio deberá proporcionar la página actual y el número de registros esperados por página. En este ejemplo, podríamos imagina que si los valores no se definen, entonces el API debería de retornar todo, pero esto puede provocar un problema de performance, por que hay muchísimos clientes y cada cliente tiene una serie de objetos asociados que deberán ser retornados también, provocando una gran carga sobre la base de datos, es por ello, que debemos asegurarnos de que si el API no recibe estos parámetros entonces deberemos establecer un valor por default. Veamos el siguiente ejemplo:</p>



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

import java.util.*;
import javax.ws.rs.core.*;

@Path("customers")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class CustomersService {
	
	@GET
	public Response getCustomers(
			@DefaultValue("1") @QueryParam("currentPage") int currentPage, 
			@DefaultValue("10") @QueryParam("pageSize") int pageSize) {
		
		//Validate input
		if(currentPage &lt; 1 || pageSize &lt; 1) {
			return Response.ok("Invalid params").build();
		}
		
		//ccreate Dataset 
		List&lt;String> customers = new ArrayList&lt;>();
		for(int c = 1 ; c&lt;=100 ; c++) {
			customers.add("Customer " + c);
		}
		
		//Calculate sublist range
		int startIndex = (currentPage-1) * pageSize;
		int endIndex = startIndex + pageSize;
		
		//No more results
		if(startIndex >=customers.size()) {
			return Response.ok(new Object[0]).build();
		}
		
		//Prevent ArrayIndexOutOfBoundsException
		if(endIndex > customers.size()) {
			endIndex = customers.size();
		}
		
		//Getting sublist of elements
		List&lt;String> filters = customers.subList(startIndex, endIndex);
		
		return Response.ok(filters)
				.header("x-size", customers.size())
				.header("x-startIndex", startIndex)
				.header("x-endIndex", endIndex)
				.build();
	}	
}</code></pre>



<p><br>Para este ejemplo hemos definido que si el cliente no envía la página actual (<code>currentPage</code>) le daremos el valor de 1 por default, y para el tamaño de la página (<code>pageSize</code>) hemos definido el valor de 10. Esto quiere decir que en caso de que el cliente no envíe estos parámetros, regresaremos los 10 primeros registros.</p>



<p>También hemos retornado los headers <code>x-size</code>, <code>x-startIndex</code>, <code>x-endIndex</code> como metadato para el cliente, para que sepa el total de los elementos, el index del primer registro y el último respectivamente.</p>



<p>Veamos algunos ejemplos. En primer lugar probaremos ejecutar el servicio sin ninguno de los parámetros, para comprobar los valores por default:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/test-sin-parametros.jpg" alt="probando los Default Values " class="wp-image-2751"/></figure>



<p>Podemos comprobar que se han retornado los primeros 10 resultados. </p>



<p>Hora probaremos únicamente con el parámetro pageSize=3, lo que establecerá la página por default en 1, regresando los primeros 3 resultados:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/test-pagesize.jpg" alt="probando los Default Values 2" class="wp-image-2752"/></figure>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Los valores por default son una excelente opción para lidiar con valores requeridos por el API, pero que nos obligatorios para el cliente, sin embargo, el echo de que tengamos valores por default, no significa que no debemos validar los parámetros, pues el cliente siempre podrá enviar valores no esperados por el API que provoquen una falla o en el peor de los casos, hacer una <a href="https://www.oscarblancarteblog.com/2016/11/15/sql-injection/">inyección SQL</a>.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/21/valores-por-defecto-con-defaultvalue/">Valores por defecto con @DefaultValue</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/01/21/valores-por-defecto-con-defaultvalue/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2748</post-id>	</item>
		<item>
		<title>Bean Params con @BeanParam</title>
		<link>https://www.oscarblancarteblog.com/2019/01/17/bean-params/</link>
					<comments>https://www.oscarblancarteblog.com/2019/01/17/bean-params/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 18 Jan 2019 00:17:13 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2735</guid>

					<description><![CDATA[<p>Los bean params hacen referencia a la capacidad de JAX-RS para recibir como parámetro objetos complejos definidos por una clase, esta clase puede ser vista como un Data Transfer Object (DTO), la cual contiene una serie de propiedades recuperadas de varias partes del request, como el header, query, path y formulario. Los Beans params no [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/17/bean-params/">Bean Params con @BeanParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/beanparam-1024x575.jpg" alt="Bean Params con @BeanParam" class="wp-image-2736"/></figure>



<p>Los bean params hacen referencia a la capacidad de JAX-RS para recibir como parámetro objetos complejos definidos por una clase, esta clase puede ser vista como un <a href="https://www.oscarblancarteblog.com/2018/11/30/data-transfer-object-dto-patron-diseno/">Data Transfer Object</a> (DTO), la cual contiene una serie de propiedades recuperadas de varias partes del request, como el header, query, path y formulario.<br><br></p>



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



				
<blockquote class="wp-block-quote"><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><br>Los Beans params no es una característica nativa del protocolo HTTP o la arquitectura REST, si no que JAX-RS la agrega para poder mapear todos los tipos de parámetros en una sola clase, la cual podríamos ver como un DTO que concentra en un solo punto todos los parámetros esperados. </p>



<p>Para comprender mejor como funcionan los Beans params, imaginemos que tenemos un formulario para registrar nuevos clientes, este formulario enviara al servicio todos los campos al API por medio de <code>@FormParams</code>, también enviaremos como un header un token de autenticación, para identificar al usuario que está realizando la invocación, imaginemos que el cliente llego por medio de una campaña promocional, por lo que necesitamos saber si llego por facebook, google, etc. por lo que enviaremos un <code>@QueryParam</code> para saber de donde llego el cliente. </p>



<p>Este caso, podríamos crear un parámetro en Java para uno de los parámetros esperados o podríamos crear una clase como la siguiente:</p>



<pre class="wp-block-code"><code>package api.services;

import javax.ws.rs.*;

public class CustomerDTO {
	@CookieParam("token") 
	private String token;

	@FormParam("firstname") 
	private String firstname; 
	
	@FormParam("lastname") 
	private String lastname;
	
	@FormParam("status") 
	private String status;
	
	@QueryParam("source")
	private String source;

	/* GET and SET */
}</code></pre>



<p><br>La clase <code>CustomerDTO</code> es en realidad una composición de variables que son recuperadas de varias partes de la petición. Solo en este caso hemos recuperado parámetros de las cookies (<code>@CookieParam</code>), form (<code>@FormParam</code>), query (<code>@QueryParam</code>), sin embargo, la idea de los <code>@BeanParam</code> es que se pueden utilizar cualquiera de las @xxxParam, lo que quiere decir que podemos utilizar:</p>



<ul><li><a href="https://www.oscarblancarteblog.com/2018/12/17/path-params-con-pathparam/">@PathParam</a></li><li>@QueryParam</li><li>@MatrixParam</li><li>@CookieParam</li><li>@HeaderParam</li></ul>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>El siguiente paso es crear un método REST que reciba el <code>@BeanParam</code>:</p>



<pre class="wp-block-code"><code>package api.services;

import java.util.Map;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("customers")
public class CustomersService {
	
	@POST
	@Produces(MediaType.APPLICATION_JSON)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public Response saveCustomer(@BeanParam CustomerDTO customer) {
		
		String result = String.format("firstname = %s, lastname = %s, status = %s, token = %s, source = %s", 
				new Object[]{customer.getFirstname(), 
						customer.getLastname(),
						customer.getStatus(), 
						customer.getToken(),
						customer.getSource()});
		
		return Response.ok(result).build();
	}	
}
</code></pre>



<p><br>El formulario con el que invocaremos el servicio REST es el siguiente:</p>



<pre class="wp-block-code lang:xhtml decode:true"><code>&lt;!DOCTYPE html>
&lt;html>
	&lt;body>
		&lt;p>Customer form&lt;/p>
	
		&lt;form action="http://localhost:8080/api-0.0.1-SNAPSHOT/customers?source=google" method="post">
			&lt;div>
				&lt;label for="firstname" style="display:inline-block; width: 100px;">Nombre&lt;/label>
				&lt;input id="firstname" type="text" name="firstname" />
			&lt;/div>
			&lt;div>
				&lt;label for="lastname" style="display:inline-block; width: 100px;">Apellido&lt;/label>
				&lt;input id="lastname" type="text" name="lastname" />
			&lt;/div>
			&lt;div>
				&lt;label for="status" style="display:inline-block; width: 100px;">Estatus&lt;/label>
				&lt;select id="status" name="status" >
					&lt;option value="active">Activo&lt;/option>
  					&lt;option value="inactive">Inactivo&lt;/option>
				&lt;/select>
			&lt;/div>
			&lt;br/>
			&lt;input type="submit" value="Guardar" />
		&lt;/form>
	&lt;/body>
&lt;/html></code></pre>



<p>Observemos que hemos agregado el query param en el <code>action</code> del <code>&lt;form&gt;</code>, por lo que será enviado al servidor al momento del submit.</p>



<p>Adicional, agregaremos la cookie token directamente desde el inspector de chrome:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/test-3-1024x502.jpg" alt="@BeanParam cookie" class="wp-image-2739"/></figure>



<p><br>Y obtendremos el siguiente resultado:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/result-1.jpg" alt="@BeanParam test result" class="wp-image-2741"/></figure>



<h2>Conclusiones</h2>



<p>Como hemos podido validar, los <code>@BeanParam</code> son una excelente estrategia para realizar una composición de una serie de parámetros en una sola fuente de datos, los cuales podríamos fácilmente reutilizar para más de un servicio. Además, nos evita tener que definir una serie de parámetros para poder recuperar cada uno de los valores esperados.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator"/>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/17/bean-params/">Bean Params con @BeanParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/01/17/bean-params/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2735</post-id>	</item>
		<item>
		<title>Cookie params con @CookieParam</title>
		<link>https://www.oscarblancarteblog.com/2019/01/15/cookie-params-con-cookieparam/</link>
					<comments>https://www.oscarblancarteblog.com/2019/01/15/cookie-params-con-cookieparam/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 15 Jan 2019 19:14:39 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2727</guid>

					<description><![CDATA[<p>Las cookies son hasta la fecha una de las formas más utilizadas que tenemos para persistir valores del lado del cliente, las cuales pueden ser recuperadas por el servidor para identificar a un usuario, darle seguimiento o simplemente para guardar algún valor que utilizaremos después. Todas las cookies que guardemos en el cliente serán transmitidas [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/15/cookie-params-con-cookieparam/">Cookie params con @CookieParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/cookieparam-1024x575.jpg" alt="Cookie params con @CookieParam" class="wp-image-2728"/></figure>



<p>Las cookies son hasta la fecha una de las formas más utilizadas que tenemos para persistir valores del lado del cliente, las cuales pueden ser recuperadas por el servidor para identificar a un usuario, darle seguimiento o simplemente para guardar algún valor que utilizaremos después.<br><br></p>



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



				
<blockquote class="wp-block-quote"><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><br>Todas las cookies que guardemos en el cliente serán transmitidas al servidor de forma automática al servidor en los request posteriores, lo que puede ser de grán ayuda para identificar la sesión del usuario, el estado o incluso, guardar tokens de autenticación para identificar al usuario en cada llamada.</p>



<p>Las cookies no es algo que podamos ver a simple vista, pues solo se pueden ver con ayuda de herramientas que monitoren el tráfico HTTP, como es el caso del inspector de elementos de Chrome u otras herramientas especializadas como es el caso de Restlet, SOAPUI, postman, etc.</p>



<p>Desde chrome podemos ver todas las cookies que una página ha dejado en nuestro equipo, e incuso, podríamos agregar algunas manualmente para realizar algunas pruebas. Para verlas, solo basta abrir el inspector de elementos, dirigirse a la pestaña de Application y seleccionar la opción de cookies, tal como podemos ver en la siguiente imagen:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/cookies-chrome.jpg" alt="cookies Inspector de elementos con Chorme" class="wp-image-2729"/></figure>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Recuperar las Cookies con JAX-RS</h2>



<p>Mediante el API de JAX-RS es muy fácil de recuperar las cookies del lado del servidor, ya que solo es necesario anotar con <code>@CookieParam</code> alguno de los parámetros del método Java en la cual queremos inyectar el valor de una cookie. Veamos el siguiente ejemplo que espera una cookie de autenticación llamado token:</p>



<pre class="wp-block-code"><code>package api.services;

import java.util.Map;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("customers")
public class CustomersService {

	@POST
	@Produces(MediaType.TEXT_PLAIN)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public Response saveCustomer(
			@CookieParam("token") String token) {
		
		if("1234".equals(token)) {
			return Response.ok("OK").build();
		}else {
			return Response.ok("UNAUTHORIZED").status(Response.Status.UNAUTHORIZED).build();
		}
	}
}</code></pre>



<p>En este ejemplo estamos el header <code>token</code>, el cual deberá tener el valor <code>1234</code>, de lo contrario, mandaremos un error de autenticación.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Establecer una nueva Cookie</h2>



<p>Otra cosa que podemos hacer es establecer una nueva cookie en el cliente, por ejemplo, podríamos agregar el token en caso de que este no tenga uno, veamos cómo quedaría:</p>



<pre class="wp-block-code"><code>package api.services;

import java.util.Map;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("customers")
public class CustomersService {

	@POST
	@Produces(MediaType.TEXT_PLAIN)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public Response saveCustomer(
			@CookieParam("token") String token) {
		
		if(token == null) {
			NewCookie newToken = new NewCookie("token", "1234");
			return Response.ok("OK").cookie(newToken).build();
		}
		
		return Response.ok("OK").build();
	}	
}</code></pre>



<p>Utilizamos la clase <code>NewCookie</code> para definir una nueva cookie que deberá ser creada en el cliente, demás, utilizamos el método <code>cookie</code> de la clase Response para enviarla al cliente.</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/newtoken.jpg" alt="nuevo cookie" class="wp-image-2730"/></figure>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>A pesar de que las cookies han sido la forma tradicional de guardar los datos en el cliente, la llegada de HTML5 nuevas alternativas, como lo es el Local Storage y el Session Storage, de los cuales no hablaremos en esta ocasión, pero las menciono por si quieres investigar un poco más al respecto.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator"/>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/15/cookie-params-con-cookieparam/">Cookie params con @CookieParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/01/15/cookie-params-con-cookieparam/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2727</post-id>	</item>
		<item>
		<title>Header params con @HeaderParam</title>
		<link>https://www.oscarblancarteblog.com/2019/01/10/header-params-con-headerparam/</link>
					<comments>https://www.oscarblancarteblog.com/2019/01/10/header-params-con-headerparam/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 11 Jan 2019 05:30:38 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2709</guid>

					<description><![CDATA[<p>Los header son utilizados en REST para enviar metadatos asociados a la petición o la respuesta, los cuales van desde el formato y tamaño del payload, nombre del servidor del servidor de aplicaciones, fecha de invocación, caducidad de un recurso, versión y nombre del sistema operativo, tipo de navegador, dispositivo, lenguaje y hasta headers para [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/10/header-params-con-headerparam/">Header params con @HeaderParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/headerpram-1024x575.jpg" alt="Header params con @HeaderParam" class="wp-image-2720"/></figure>



<p>Los header son utilizados en REST para enviar metadatos asociados a la petición o la respuesta, los cuales van desde el formato y tamaño del payload, nombre del servidor del servidor de aplicaciones, fecha de invocación, caducidad de un recurso, versión y nombre del sistema operativo,  tipo de navegador, dispositivo, lenguaje y hasta headers para la seguridad.<br><br></p>



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



				
<blockquote class="wp-block-quote"><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><br>Los headers es una sección adicional al payload de una solicitud, la cual no puede ser vista a simple vista, si no que requiere de un analizador HTTP para poderlos ver, sin embargo, todas las solicitudes llevan por default una serie de headers, incluso si nosotros no  las establecemos. Los headers enviados por default varían de cliente a cliente y de servidor a servidor, por lo que en este artículo aprenderemos a analizar los headers.</p>



<p>Uno de los principales usos de los header es para enviar los tokens de  <br>autenticación, como es el caso de<a href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/"> JSON Web Token</a> (JWT), el cual lo establecemos en el header <code>Authorization</code>, dicho lo anterior, veremos como recuperar este header mediante el API JAX-RS de Java.</p>



<pre class="wp-block-code"><code>package api.services;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("security")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class Security {
	
	@GET
	public Response authenticate(@HeaderParam("authorization") String token) {
		return Response.ok("token="+token).build();
	}
}</code></pre>



<p>Los header pueden ser recuperados anotando los parámetros con <code>@HaderParam</code>, por lo que vamos a requerir un parámetro en Java por cada header que esperamos recibir en el API.</p>



<p>Si ejecutamos el ejemplo anterior, podemos ver el siguiente resultado:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/test-1-1024x625.jpg" alt="JAX-RS @HeaderParam recuperar un query param" class="wp-image-2721"/></figure>



<p>En la parte superior podemos ver los header que definimos en el request y en la parte de abajo los header que nos retorno el servidor; en la respuesta podemos ver el token que le hemos enviado.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Otra de las formas de recuperar los header es por medio de la clase <code>HttpHeaders</code>, la cual podemos inyectar a nuestro método mediante la anotación <code>@Context</code>. La ventaja evidente de esté método es que podemos recuperar cualquier header, sin importar si lo esperábamos o no y nos evita tener que definir una grán cantidad de parámetros si esperamos muchos headers. Veamos un nuevo ejemplo con este método:</p>



<pre class="wp-block-code"><code>package api.services;

import java.util.Map;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("security")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public class Security {
	
	@GET
	public Response authenticate (@Context HttpHeaders headers) {
		String result = "";
		for(Map.Entry entry: headers.getRequestHeaders().entrySet() ) {
			result += entry.getKey() + "=" + entry.getValue() + ", ";
		}
		
		return Response.ok(result).build();
	}
}</code></pre>



<p><br>Ahora veamos una ejecución de prueba:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/test-2-1024x679.jpg" alt="JAX-RS @HeaderParam recuperar todos los query params" class="wp-image-2722"/></figure>



<p>En este caso, podemos observar que hemos recibido muchos más parámetros de los que enviamos, y esto se debe a lo que mencionamos al inicio, y es que cada cliente agrega una serie de headers para identificarlo.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Agregar headres en la respuesta</h2>



<p>Ademas de recibir headers, también podemos enviar headers a los clientes del API; los headers los podemos agregar directamente al objeto Response, mediante una serie de claves-valor, veamos un ejemplo:</p>



<pre class="wp-block-code"><code>package api.services;

import java.util.Map;
import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("security")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public class Security {
		
	@GET
	public Response authenticate (@Context HttpHeaders headers) {
		String result = "";
		for(Map.Entry entry: headers.getRequestHeaders().entrySet() ) {
			result += entry.getKey() + "=" + entry.getValue() + ", ";
		}
		
		Response.ResponseBuilder response = Response.ok(result);
		response.header("my-header1", "value 1");
		response.header("my-header2", "value 2");
		
		return response.build();
	}
}</code></pre>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>No debemos de confundirnos al momento de utilizar los headers, pues no se deben de utilizar como una forma de enviar parámetros a nuestro API, si no como metadatos que complementen el request y que ayuden al servidor/cliente como tratar la solocitud/respuesta.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator"/>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/10/header-params-con-headerparam/">Header params con @HeaderParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/01/10/header-params-con-headerparam/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2709</post-id>	</item>
		<item>
		<title>Path params con @FormParam</title>
		<link>https://www.oscarblancarteblog.com/2019/01/07/path-params-con-formparam/</link>
					<comments>https://www.oscarblancarteblog.com/2019/01/07/path-params-con-formparam/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 07 Jan 2019 20:22:07 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2699</guid>

					<description><![CDATA[<p>Una de las cosas que pocos saben, es que REST nos permite crear servicios que se integren a la perfección con los formularios HTML, de tal forma que podemos lugar una etiqueta &#60;form&#62; directamente con un servicio REST. para ello, JAX-RS nos proporciona la anotación @FormParam. La diferencia fundamental que tienen los form params con [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/07/path-params-con-formparam/">Path params con @FormParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/formparam-1024x575.jpg" alt="" class="wp-image-2701"/></figure>



<p>Una de las cosas que pocos saben, es que REST nos permite crear servicios que se integren a la perfección con los formularios HTML, de tal forma que podemos lugar una etiqueta <code>&lt;form&gt;</code> directamente con un servicio REST. para ello, JAX-RS nos proporciona la anotación <code>@FormParam</code>.</p>



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



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



				
<blockquote class="wp-block-quote"><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>
		


<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>La diferencia fundamental que tienen los form params con respecto a los demás, es que se obtiene directamente los campo asociados al formulario desde el cual se ejecuta, pero para entender mejor, veamos el siguiente ejemplo:</p>



<pre class="wp-block-code lang:xhtml decode:true"><code>&lt;html>
	&lt;body>
		&lt;p>Customer form&lt;/p>
		&lt;form action="http://localhost:8080/api-0.0.1-SNAPSHOT/customers" method="post">
			&lt;div>
				&lt;label for="firstname" style="display:inline-block; width: 100px;">Nombre&lt;/label>
				&lt;input id="firstname" type="text" name="firstname" />
			&lt;/div>
			&lt;div>
				&lt;label for="lastname" style="display:inline-block; width: 100px;">Apellido&lt;/label>
				&lt;input id="lastname" type="text" name="lastname" />
			&lt;/div>
			&lt;div>
				&lt;label for="status" style="display:inline-block; width: 100px;">Estatus&lt;/label>
				&lt;select id="status" name="status" >
					&lt;option value="active">Activo&lt;/option>
  					&lt;option value="inactive">Inactivo&lt;/option>
				&lt;/select>
			&lt;/div>
			&lt;br/>
			&lt;input type="submit" value="Guardar" />
		&lt;/form>
	&lt;/body>
&lt;/html></code></pre>



<p>En este ejemplo debemos poner atención en la etiqueta <code>&lt;form&gt;</code>, la cual está apuntando a un servicios REST mediante la etiqueta <code>action</code>, con lo cual le estamos diciendo al navegador que envíe el formulario a nuestro servicio REST.</p>



<p>Otra de las cosas a tomar en cuenta son los campos dentro del form, como lo son el nombre, apellido y estatus, los cuales serán los que sean enviados al servicio REST.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Una vez explicado lo anterior, pasemos a la implementación en JAX-RS para recuperar estos parámetros:</p>



<pre class="wp-block-code"><code>package api.services;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("customers")
public class CustomersService {

	@POST
	@Produces(MediaType.TEXT_PLAIN)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public Response saveCustomer(
			@FormParam("firstname") String firstname, 
			@FormParam("lastname") String lastname, 
			@FormParam("status") String status) {
		
		String result = String.format("firstname = %s, lastname = %s, status = %s", new String[]{firstname, lastname, status});
		return Response.ok(result).build();
	}
}</code></pre>



<p>Veamos como hemos definido una anotación <code>@FormParam</code> para cada uno de los parámetros esperados del formulario, los cuales serán mapeados a cada uno de los parámetros del método en Java.</p>



<p>Las anotaciones @Consumes la utilizamos definir que esperamos el payload como un formulario.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Probando el servicio</h2>



<p>Lo primero será abrir el la página HTML para verlo de la siguiente manera:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/index.jpg" alt="" class="wp-image-2704"/></figure>



<p>Una vez capturado el formulario, la damos grabar, lo que detonará el submit del formulario y la ejecución del servicio REST, lo que dará como resultado lo siguiente:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/response.jpg" alt="" class="wp-image-2705"/></figure>



<p>Podemos ver como el servicio REST ha recibido todos los parámetros y los ha regresado como una cadena de texto.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Mediante la anotación <code>@FormParam</code> es fácil recuperar los valores de un formulario, pues los mapeamos a una parámetro especifico del método Java, sin embargo, esta forma tiene la limitación de que requerimos N parámetros en Java para mapear los N form params, lo que puede llegar a ser complicado en formularios grandes o donde los nombres de los parámetros pudieran variar, en tales casos, podemos implementarlos de la siguiente manera para recuperar todos los form params como un colección:</p>



<pre class="wp-block-code"><code>package api.services;

import java.util.Map;

import javax.ws.rs.*;
import javax.ws.rs.core.*;

@Path("customers")
public class CustomersService {
	
	@POST
	@Produces(MediaType.TEXT_PLAIN)
	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
	public Response getFormDataUsingMultivaluedMap(MultivaluedMap&lt;String, String> formParams) {
		String result = "";
		for(Map.Entry entry: formParams.entrySet() ) {
			result += entry.getKey() + "=" + entry.getValue() + ", ";
		}
		
		return Response.ok(result).build();
	}
}</code></pre>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Los <code>@FormParam</code> pueden ser una buena alternativa cuando queremos ligar directamente un formulario con servicios REST, evitando tener que construir un request especifico. </p>



<p>Como inconveniente, tenemos que el servicio REST deberá retornar la estructura HTML de la siguiente página que verá el usuario, o en su defecto, podemos redireccionar al usuario a la siguiente página.</p>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/07/path-params-con-formparam/">Path params con @FormParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/01/07/path-params-con-formparam/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2699</post-id>	</item>
		<item>
		<title>Query params con @QueryParam</title>
		<link>https://www.oscarblancarteblog.com/2019/01/03/java-query-param/</link>
					<comments>https://www.oscarblancarteblog.com/2019/01/03/java-query-param/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 03 Jan 2019 16:00:44 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2683</guid>

					<description><![CDATA[<p>Otra de las formas que tenemos para enviar parámetros al API REST son los Query Params, los cuales son una serie de clave-valor que se agregan al final de la URL, justo después del signo de interrogación (?). Para comprender mejor que es un Query param a analizar la siguiente URL para consultar los clientes [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/03/java-query-param/">Query params con @QueryParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[
				
<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/queryparam-1024x575.jpg" alt="" class="wp-image-2684"/></figure>



<p>Otra de las formas que tenemos para enviar parámetros al API REST son los Query Params, los cuales son una serie de clave-valor que se agregan al final de la URL, justo después del signo de interrogación (<code>?</code>).</p>



<p><br><br></p>



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



				
<blockquote class="wp-block-quote"><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><br><br>Para comprender mejor que es un Query param a analizar la siguiente URL para consultar los clientes por medio del nombre:</p>



<p><em>http://myapi.com/customers?<strong>name=oscar</strong></em></p>



<p><br>El query param es la clave valor <code>name=oscar</code> que vemos al final de la URL, y como regla, siempre deberán estar después del símbolo de interrogación. Además, una URL puede tener N query params, cómo el siguiente ejemplo:</p>



<p>http://myapi.com/customers?<strong>firstname=oscar</strong>&amp;l<strong>astname=blancarte</strong>&amp;<strong>status=active</strong></p>



<p><br>Esta URL la podemos utilizar para buscar a todos los clientes donde su nombre es oscar, su apellido es blancarte y su estatus es activo. Cuando utilizamos más de un Query param, es importante separar cada uno mediante el simbolo <code>&amp;</code>.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Recuperar los Query params con JAX-RS</h2>



<p>Una vez explicado lo anterior, vamos a pasar a explicar como podemos recuperar los query params mediante el API JAX-RS de Java.</p>



<p>La forma más simple de recuperar un Query param es anotar los parámetros de los métodos con <code>@QueryParam</code>, de tal forma que deberemos tener un parámetro por cada query param esperado. Veamos el siguiente ejemplo:</p>



<pre class="wp-block-code"><code>@GET
@Path("customers")
public Response getCustomers(
		@QueryParam("firstname") String firstname, 
		@QueryParam("lastname") String lastname, 
		@QueryParam("status") String status) {
	String result = String.format("firstname = %s, lastname = %s, status = %s", new String[]{firstname, lastname, status});
	return Response.ok(result).build();
}</code></pre>



<p><br>Podemos observar que hemos definido la anotación <code>@QueryParam</code> en cada parámetro sobre el cual queremos mapear el parámetro. </p>



<p>Veamos ahora un ejemplo del ejecución de este método:</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/invoke-1-1024x652.jpg" alt="" class="wp-image-2694"/></figure>



<p>Como resultado podemos ver que hemos recibido los parámetros desde Java y devueltos como parte de la respuesta, lo que demuestra que hemos logrado mapear los query params con los parámetros del método Java.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<p>El ejemplo anterior es la forma más simple de recuperar los query params, sin embargo, tiene el inconveniente de que debemos definir un parámetro en Java para cada query param que esperamos recibir, lo que puede ser complicado si tenemos muchos o los nombre de los query params pueden variar, pues no tendremos forma de predecirlos para mapearlos a un parámetro en Java. </p>



<p>Para solucionar estos casos tenemos la clase <code>UriInfo</code>, la cual debemos de inyectar al método en lugar de los <code>@QueryParam</code>, veamos el siguiente ejemplo:</p>



<pre class="wp-block-code"><code>@GET
@Path("customers2")
public Response getCustomers(
		@Context UriInfo uriInfo) {
	String result = "";
	for(Map.Entry entry: uriInfo.getQueryParameters().entrySet() ) {
		result += entry.getKey() + "=" + entry.getValue() + ", ";
	}
	return Response.ok(result).build();
}</code></pre>



<p><br>En este nuevo ejemplo podemos apreciar que hemos inyectado la clase UriInfo mediante la anotación <code>@Context</code> y por medio de esta clase podemos recuperar todos los query params, sin importar la cantidad que nos envíen e incluso si lo esperamos o no. La ventaja de este método es que podemos recuperar todos los query params como un <code>Set</code> e iterar todos los query params enviados.</p>



<figure class="wp-block-image"><img src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/12/invoke2-1024x599.jpg" alt="" class="wp-image-2695"/></figure>



<p>Observemos en esta última prueba que hemos enviado los query params de siempre y hemos agregado el param date.</p>



<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>



<h2>Conclusiones</h2>



<p>Hemos comprobado lo fácil que es recuperar los query params con <code>@QueryParam</code>, he incluso, recuperarlos mediante la clase <code>UriInfo</code>, pero hay que tener cuidado al momento de utilizarlos, pues en muchos de los casos, podríamos pasar los parámetros mediante <code>@PathParam</code>. </p>



<p>Por lo general, los <code>@QueryParam</code> se utilizan para complementar las búsquedas y los <code>@PathParam</code> para establecer el contexto de la búsqueda, es decir, mediante <code>@PathParam</code> decimos lo que estamos buscando y los <code>@QueryParam</code> como los queremos o los filtros de la selección.</p>



<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>



<hr class="wp-block-separator"/>
		<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2019/01/03/java-query-param/">Query params con @QueryParam</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2019/01/03/java-query-param/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2683</post-id>	</item>
		<item>
		<title>Qué es API REST? &#8211; 🚀Y por que es importante aprenderlo 🚀[VIDEO]</title>
		<link>https://www.oscarblancarteblog.com/2018/08/28/api-rest-%f0%9f%9a%80y-importante-aprenderlo-%f0%9f%9a%80video/</link>
					<comments>https://www.oscarblancarteblog.com/2018/08/28/api-rest-%f0%9f%9a%80y-importante-aprenderlo-%f0%9f%9a%80video/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 28 Aug 2018 14:56:47 +0000</pubDate>
				<category><![CDATA[REST]]></category>
		<category><![CDATA[API REST]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2268</guid>

					<description><![CDATA[<p>API REST no es una moda y llego para quedarse, solo basta ver las tendencias de Google Trends para darnos cuenta que REST ha superado por creces a los servicios tradicionales SOAP y desde hace ya un tiempo. API REST ha tenido un enorme éxito debido a tecnologías tan populares como JavaScript y IoT, las [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/28/api-rest-%f0%9f%9a%80y-importante-aprenderlo-%f0%9f%9a%80video/">Qué es API REST? &#8211; 🚀Y por que es importante aprenderlo 🚀[VIDEO]</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/RbBPuMlgdUU?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>API REST no es una moda y llego para quedarse, solo basta ver las tendencias de Google Trends para darnos cuenta que REST ha superado por creces a los servicios tradicionales SOAP y desde hace ya un tiempo. API REST ha tenido un enorme éxito debido a tecnologías tan populares como JavaScript y IoT, las cuales tienes un comunicación casi nativa y con bajos consumos.</p>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/08/28/api-rest-%f0%9f%9a%80y-importante-aprenderlo-%f0%9f%9a%80video/">Qué es API REST? &#8211; 🚀Y por que es importante aprenderlo 🚀[VIDEO]</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/08/28/api-rest-%f0%9f%9a%80y-importante-aprenderlo-%f0%9f%9a%80video/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2268</post-id>	</item>
		<item>
		<title>Construir un API REST con NodeJS (Tercera parte)</title>
		<link>https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 15 Jan 2018 10:00:42 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[express]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1989</guid>

					<description><![CDATA[<p>Este artículo es la tercera parte del articulo original (Segunda parte), en la cual hablamos de los HTTP Verbs, su importancia, funcionalidad y cómo implementarla en nuestro API utilizando NodeJS + Express. En esta tercera parte, hablaremos acerca de los URL paths, cómo es posible crear URL parametrizadas y la forma de recuperar los parámetros [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/">Construir un API REST con NodeJS (Tercera parte)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter size-full wp-image-1991" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/banner.png" alt="Construir un API REST con NodeJS - Tercera parte" width="723" height="404" />Este artículo es la tercera parte del articulo original (<a href="https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/">Segunda parte</a>), en la cual hablamos de los HTTP Verbs, su importancia, funcionalidad y cómo implementarla en nuestro API utilizando <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a> + Express. En esta tercera parte, hablaremos acerca de los URL paths, cómo es posible crear URL parametrizadas y la forma de recuperar los parámetros del objeto request.<span id="more-1989"></span></p>
<h2>URL Paths</h2>
<p>Uno de los aspectos más importantes de un servicio REST, es su URL, primero que nada, porque es la <strong>forma en que podemos consumir el servicio</strong>, pero también es importante por le da al usuario una <strong>pista significativa acerca de su funcionalidad</strong>. Una URL bien definida, podría decirle al usuario para que sirve con una precisión muy acertada, sin tener que recurrir a la documentación.</p>
<p>Para que una URL tenga un significado real, es necesario complementarlo con método (o verb) al que responde, pues el método nos dice el tipo de operación que va a realizar, mientras que la URL nos dice que es lo que va hacer. Analicemos las siguientes URL:</p>
<table  class=" table table-hover" >
<tbody>
<tr>
<td width="75">GET</td>
<td width="491">/users/oscar/avatar</td>
</tr>
<tr>
<td width="75">PUT</td>
<td width="491">/users/oscar/avatar</td>
</tr>
<tr>
<td width="75">DELETE</td>
<td width="491">/users/oscar</td>
</tr>
<tr>
<td width="75">POST</td>
<td width="491">/users</td>
</tr>
</tbody>
</table>
<p>Quiero que te tomes solo un momento para analizar las URL anteriores… te aseguro que sin ser un experto pudiste adivinar con gran certeza que hace cada una de estas operaciones. Si no, te recomiendo ver la segunda parte de este artículo para refrescar un poco la memoria.</p>
<p>Como sea, vamos a explicar que hace cada una, en la primera URL, sabemos que el GET se utiliza para consultas y la URL habla de usuarios, luego un nombre y finalmente un avatar, por lo que podemos deducir que este servicio está realizando la consulta del Avatar del usuario oscar, ¿vez que fácil?</p>
<p>En la segunda URL, sabemos que PUT se utiliza para realizar updates, por lo tanto, le estamos diciendo que actualice el Avatar del usuario oscar.</p>
<p>En la tercera URL, sabemos que DELETE se utiliza para borrar un registro, por lo que está de más decir que lo que hace es borrar el usuario oscar.</p>
<p>En la cuarta URL, sabemos que POST se utiliza para crear un nuevo registro y está invocando solamente <em>/users</em>, esto me dice que el servicio está creando un nuevo usuario.</p>
<p>Con Express es realmente fácil implementar estas URL, tan solo hay que definir los Routers con el método adecuado y con el URL al que debe procesar, veamos cómo quedaría:</p>
<pre class="lang:js decode:true">app.get('/users/oscar/avatar', (req, res) =&gt; {
  res.send('Hello GET:/users/oscar/avatar')
})

app.put('/users/oscar/avatar', (req, res) =&gt; {
  res.send('Hello PUT:/users/oscar/avatar')
})

app.delete('/users/oscar', (req, res) =&gt; {
  res.send('Hello DELETE:/users/oscar')
})

app.post('/users', (req, res) =&gt; {
  res.send('Hello POST:/users')
})</pre>
<p>Los paths siempre deben de representar exactamente lo que hacen, y el método debe de corresponder con la acción que realizará, pues no hacerlo, puede confundir a los desarrolladores.</p>
<h2>Prioridad de los paths</h2>
<p>Un error al momento de iniciar con Express es pensar que el orden en que se definen los Routers es irrelevante, como si de una función se tratara, la cual puede ser llamada desde donde sea y siempre se ejecuta la correcta, sin embargo, esto no es cierto. Por este motivo, Express evaluar los Router en el orden en que están definidos.</p>
<p>Existe ocasiones en que más de una URL puede colisionar y entrar en el Path equivocado, por ejemplo, las siguientes dos URL:</p>
<p><span class="lang:default decode:true crayon-inline">GET: /*</span></p>
<p><span class="lang:default decode:true crayon-inline ">GET:/login</span></p>
<p>La primera acepta cualquier URL, porque tiene un comodín (*), mientras que la segunda, solo acepta la URL <em>/login</em>. En este caso, como <em>/*</em> esta primero, entonces atenderá las peticiones que lleguen a <em>/login</em>, porque el path <em>/*</em> cumple con el patrón, en tal caso, tendríamos que invertir el orden de los Routers de la siguiente manera:</p>
<p><span class="lang:default decode:true crayon-inline ">GET:/login </span></p>
<p><span class="lang:default decode:true crayon-inline ">GET: /* </span></p>
<p>De esta forma, cuando llegue una petición a <em>/login</em>, la tomará el primer Router y para todos los demás path será <em>/*</em> quien procese la solicitud.</p>
<h2>URL Params</h2>
<p>Una de las características de REST, es la posibilidad de convertir ciertas partes de una URL en parámetro, de tal forma que nos ahorra tener que escribir una URL para cada registro que necesitemos.</p>
<p>Regresando al ejemplo de los servicios para usuarios GET: <em>/users/oscar</em>, podemos apreciar que “oscar” esta fija en la URL, lo que provocaría que tuviéramos que tener un Router para cada usuario registrado. Por suerte, Express nos permite escribir URL Params. Para convertir una sección de la URL en URL param, solo tendremos que anteponer dos puntos (:) antes, por ejemplo:</p>
<p><span class="lang:default decode:true crayon-inline ">/users/:username </span></p>
<p><span class="lang:default decode:true crayon-inline ">/users/:username/:field </span></p>
<p>En la primera URL podríamos recibir consultas para todos los usuarios, por ejemplo:</p>
<p><span class="lang:default decode:true crayon-inline ">/users/oscar</span> , <span class="lang:default decode:true crayon-inline ">/users/juan</span> , <span class="lang:default decode:true crayon-inline ">/users/pedro</span></p>
<p>Mientras que en la segunda URL podríamos consultar cualquier campo del usuario, por ejemplo:</p>
<p><span class="lang:default decode:true crayon-inline ">/users/oscar/avatar</span>  o <span class="lang:default decode:true crayon-inline ">/users/juan/banner</span></p>
<p>Para recuperar los URL Params, tan solo es necesario recuperarlos del objeto request de la siguiente manera: <em>req.params.&lt;name&gt;</em>. Veamos algunos ejemplos:</p>
<p><img loading="lazy" class="aligncenter wp-image-1993" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/API-REST-url-params.png" alt="API REST - URL Params" width="921" height="220" /></p>
<h2></h2>
<h2>Query params</h2>
<p>Los query params son lo más conocidas, y son todos aquellos que van al final de la URL seguido del símbolo de interrogación (?). Se pueden enviar cuantos Query params se requiere, siempre y cuando no excedamos el límite máximo de caracteres para un URL. Cada parámetro deberá está separado un el símbolo de ampersand (&amp;). Algunos ejemplos:</p>
<p><span class="lang:default decode:true crayon-inline ">/cources?coupon=FREE&amp;Source=Google</span></p>
<p>Este tipo de parámetros es muy común en campañas publicitarias, pues el param coupon determina que el curso a comprar es gratis (free), mientras que el param Source nos dice de donde llego el cliente (google).</p>
<p>Para recuperar un Query param en Express se usa la siguiente sentencia, <em>req.query.&lt;parama-name&gt;</em>. Veamos cómo implementarlo en Express.</p>
<pre class="lang:js decode:true ">app.get('/cources', (req, res) =&gt; {
  var coupon = req.query.coupon
  var source = req.query.source
  res.send("Coupo: " + coupon + ", Source: " + source)
})</pre>
<p>Si ejecutamos la URL <em>/cources?coupon=FREE&amp;Source=Google</em>  obtendremos el siguiente resultado:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-1994" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/query-params.png" alt="API REST - query params" width="733" height="293" /></p>
<p><figure id="attachment_2293" aria-describedby="caption-attachment-2293" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" class="wp-image-2293 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/11/react-banner-1024x394.jpg" alt="" width="648" height="249" /></a><figcaption id="caption-attachment-2293" class="wp-caption-text">¿Te gustaría aprender las técnicas más avanzadas para crear API REST con NodeJS? Te invito a que veas mi libro “Aplicaciones reactivas con React, NodeJS &amp; MongoDB”, donde aprenderás a crear una API REST completo, desde exponer los servicios hasta habilitar la seguridad con JSON Web Token (JTW)</figcaption></figure></p>
<h2>Body params</h2>
<p>El tercer y último tipo de parámetro que podemos enviarle a un servicio REST, es el payload (o body), el cual puede ser un mensaje largo que no se puede ver a simple vista. No todos los métodos HTTP soportan el envío de un payload, por lo que hay que tener eso en cuenta.</p>
<p>De los métodos más utilizados que soportan el envío de un payload son: POST, PUT, PATCH, DELETE. Observa que el método GET no lo soporta.</p>
<p>Recuperar el body del request no está simple como parecería, pues en realidad, este parámetro es un InputStream, lo que quiere decir, que se recibe como los datos poco a poco y no todo de una. Esto nos obliga a procesar el payload a medida que va llegando. Este proceso lo podemos simplificar con ayuda del módulo body-parser, el cual instalamos en la primera parte de este artículo (<em>npm install &#8211;save body-parser</em>).</p>
<p>Mediante este módulo, es posible convertir el payload en varios formatos, pero el que nos interesa es JSON, pues es el estándar para REST. Configurarlo, solo tendremos que importarlo y agregar un middleware (los analizaremos más adelante).</p>
<p><img loading="lazy" class="aligncenter wp-image-1995 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/API-REST-Body-param.png" alt="API REST - Body param" width="925" height="734" /></p>
<p>Finalmente, existe una última forma de recibir información para el API, la cual es a través de Header, sin embargo, esta parte la dejaremos para la siguiente parte, en la cual hablaremos de la autenticación mediante JSON Web Tokens (JWT).		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/">Construir un API REST con NodeJS (Tercera parte)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1989</post-id>	</item>
		<item>
		<title>Construir un API REST con NodeJS (Segunda parte)</title>
		<link>https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Fri, 12 Jan 2018 10:00:25 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[express]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1967</guid>

					<description><![CDATA[<p>Este artículo es la segunda parte del articulo original (Primera parte), en el cual hablamos de cómo crear un proyecto, instalar las dependencias necesarias y montar nuestro primer servidor con Express. Si no tienes experiencia en NodeJS y Express, te recomiendo que te des una vuelta a la primera del artículo. En esta segunda parte, [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/">Construir un API REST con NodeJS (Segunda parte)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>				<img loading="lazy" class="aligncenter size-full wp-image-1970" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Construir-un-API-REST-con-NodeJS.png" alt="" width="724" height="405" />Este artículo es la segunda parte del articulo original (<a href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/">Primera parte</a>), en el cual hablamos de cómo crear un proyecto, instalar las dependencias necesarias y montar nuestro primer servidor con Express. Si no tienes experiencia en <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a> y Express, te recomiendo que te des una vuelta a la primera del artículo. En esta segunda parte, hablaremos de los HTTP Verbs, su importancia, funcionalidad y cómo implementarla en nuestro API utilizando NodeJS + Express.<span id="more-1967"></span></p>
<blockquote><p>También puedes ver como implementar los <a href="https://www.oscarblancarteblog.com/2018/12/03/metodos-http-rest/">verbs con Java</a> en mi guía de <a href="https://www.oscarblancarteblog.com/api-rest-java-jax-rs/">implementación de un API REST con Java</a>.</p></blockquote>
<h2>Verbs</h2>
<p>Uno de los conceptos más importantes cuando trabajamos con REST, son los Verbs (o también llamados métodos), los cuales conocemos como GET, POST, DELETE, PATCH, PULL, etc. determinan la acción que deseamos hacer sobre un determinado recurso. En REST, cada método tiene un significado para el API, pues una misma URL puede tener diferente significado dependiendo sobre el método se ejecutó.</p>
<p>Por ejemplo, la URL /user/oscar sobre el método GET, representa una consulta para el API, mientras que la misma URL sobre el método DELETE, representa una instrucción de borrar al usuario.</p>
<p>Los métodos (o verbs) más utilizados en un API REST son:</p>
<ul>
<li><strong>GET</strong>: Se utiliza para realiza consultas (Select)</li>
<li><strong>POST</strong>: Se utiliza para crear nuevos registros (Insert)</li>
<li><strong>DELETE</strong>: Se utiliza para borrar un registro (Delete)</li>
<li><strong>PUT</strong>: Se utiliza para actualizar total o parcialmente un registro existente (Update)</li>
<li><strong>PATCH</strong>: Se utiliza para actualiza solo una pequeña parte de un registro existente (Update)</li>
</ul>
<p>Puedes ver la lista completa de método soportados en la siguiente en la <a href="http://expressjs.com/es/api.html#routing-methods">documentación oficial de Express</a>.</p>
<h2>Utilizando los verbs con Express</h2>
<p>En express es realmente fácil crear servicio que atienda peticiones en los diferentes métodos, ya que proporciona una función para cada uno de ellos, el cual se define de la siguiente manera:</p>
<p>express.&lt;verb&gt;(&lt;path&gt;, &lt;callback&gt;)</p>
<p>El &lt;verb&gt; representa el método HTTP soportado por express en minúscula, el &lt;path&gt; es la ruta en la cual escucha las peticiones y el &lt;callback&gt; es la función que procesará las peticiones, la cual recibe dos parámetros, el primero es un objeto que representa el request y el segundo es el objeto que representa la respuesta, por ejemplo:</p>
<pre class="lang:js decode:true " title="server.js">var express = require('express')
var http = require('http')
var app = express()

var users = ['oscar', 'juan', 'marcos']

app.get('/users', (req, res) =&gt; {
  res.send(users)
})

app.get('/', (req, res) =&gt; {
  res.status(200).send("Welcome to API REST")
})

http.createServer(app).listen(8001, () =&gt; {
  console.log('Server started at http://localhost:8001');
});</pre>
<p>Veamos las líneas 5 y 9, hemos definido dos Routers, los cuales atienden peticiones GET, sin embargo, las dos atienden en diferente path, por lo que si ejecutamos la URL <a href="http://localhost:8001/users">http://localhost:8001/users</a> tendremos un resultado diferente que ejecutar simplemente <a href="http://localhost:8001/">http://localhost:8001</a>.</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-1969" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/get-method.png" alt="" width="1809" height="439" /></p>
<p>Al igual que tenemos Router para procesar peticiones GET, podemos agregar otros métodos, como, por ejemplo:</p>
<pre class="lang:js decode:true">app.post('/users', (req, res) =&gt; {
  users.push('User ' + users.length)
  res.send("New user add")
})</pre>
<p>Este nuevo Router atiende peticiones POST en el path /users, y tiene como funcionalidad agregar un nuevo usuario a la lista actual de usuario y retorna un mensaje al cliente. Desde luego que este servicio no lo podemos probar desde el navegador, por lo que utilizaremos el plugin Restlet de Chrome para probarlo, el resultado es el siguiente:</p>
<p><img loading="lazy" class="aligncenter wp-image-1973" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/POST-test.png" alt="" width="661" height="660" /></p>
<p>De esta forma, podemos agregar tantos métodos necesitemos para nuestra API, por ejemplo:</p>
<pre class="lang:js decode:true">app.patch('/users',(req, res) =&gt; {
  res.send('PATCH method')
})

app.delete('/users',(req, res) =&gt; {
  res.send('DELETE method')
})</pre>
<p><figure id="attachment_2259" aria-describedby="caption-attachment-2259" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb" target="_blank" rel="noopener"><img loading="lazy" class="wp-image-2259 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/08/banner-react-1024x345.jpg" alt="" width="648" height="218" /></a><figcaption id="caption-attachment-2259" class="wp-caption-text">¿Te gustaría aprender las técnicas más avanzadas para crear API REST con NodeJS? Te invito a que veas mi libro &#8220;Aplicaciones reactivas con React, NodeJS &amp; MongoDB&#8221;, donde aprenderás a crear una API REST completo, desde exponer los servicios hasta habilitar la seguridad con JSON Web Token (JTW)</figcaption></figure></p>
<p>Como hemos visto hasta ahora, es posible definir una serie de Router capaces de atender en los diferentes métodos que ofrece Express, también hemos visto que es posible definir más de un Router con el mismo método para atender diferentes URL.</p>
<p>En la siguiente parte de este artículo hablaremos acerca de los paths y como parametrizarlos para atender en URL dinámicas.</p>
<p style="text-align: center;"><a class="btn btn-default" href="https://www.oscarblancarteblog.com/2018/01/15/construir-api-rest-nodejs-tercera-parte/"> Continuación (Tercera parte)<i class="fa fa-chevron-right" aria-hidden="true"></i></a></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/">Construir un API REST con NodeJS (Segunda parte)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/12/construir-api-rest-nodejs-segunda-parte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1967</post-id>	</item>
		<item>
		<title>Como construir un API REST con NodeJS (Primera parte)</title>
		<link>https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 11 Jan 2018 21:27:09 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[API REST]]></category>
		<category><![CDATA[express]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1957</guid>

					<description><![CDATA[<p>Hoy en día, es más notable la necesidad de construir API’s para nuestras aplicaciones, las cuales nos permitan integrar nuestras aplicaciones con otras aplicaciones, o simplemente, con una serie de servicio alojado en el servidor. Desde el nacimiento de SOA, han surgido varias propuestas para satisfacer la necesidad de construir servicios para nuestras aplicaciones, tal [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/">Como construir un API REST con NodeJS (Primera parte)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter size-full wp-image-1986" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/1-Construir-un-API-REST-con-NodeJS-Primera-parte.png" alt="Construir un API REST con NodeJS - Primera parte" width="723" height="407" />Hoy en día, es más notable la necesidad de construir API’s para nuestras aplicaciones, las cuales nos permitan integrar nuestras aplicaciones con otras aplicaciones, o simplemente, con una serie de servicio alojado en el servidor. Desde el nacimiento de <a href="https://www.oscarblancarteblog.com/2014/07/23/que-es-service-oriented-architecture-soa/">SOA</a>, han surgido varias propuestas para satisfacer la necesidad de construir servicios para nuestras aplicaciones, tal es el caso de los servicios <a href="https://www.oscarblancarteblog.com/2017/03/06/soap-vs-rest-2/">SOAP y REST</a>, pero también han surgido nuevos conceptos como <a href="https://www.oscarblancarteblog.com/2018/06/18/backend-as-service-baas/">Backend as a Service</a> (BaaS) y nuevas tecnologías como GraphQL. Sin embargo, una de las grandes constantes de las aplicaciones más importantes, es proporcionar un API REST, debido a que se ha convertido en la forma más simple para integrar al Backend con las aplicaciones modernas basada en JavaScript, como lo es <a href="https://www.oscarblancarteblog.com/2017/05/02/introduccion-react-js/">React</a>, Angular, etc.<span id="more-1957"></span></p>
<p>Si no sabes muy bien que es un API REST, te invito a que veas mi video un Youtube donde lo explico &#8220;<a href="https://youtu.be/RbBPuMlgdUU">Qué es API REST? &#8211; 🚀Y por que es importante aprenderlo 🚀</a>&#8221;</p>
<p><iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/RbBPuMlgdUU?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p>Construir un API REST es realmente simple, y más aún, si cuentas con las tecnologías adecuadas. En este sentido, <a href="https://www.oscarblancarteblog.com/2017/05/29/introduccion-a-nodejs-2/">NodeJS</a> + Express, se ha convertido en la combinación perfecta para realizar esta tarea, pues es posible construir y levantar un API REST en cuestión de segundos.</p>
<h2>Preparando el proyecto</h2>
<p>Lo primero será crear un nuevo proyecto desde el cual estaremos trabajando, para ello, crearemos una nueva carpeta en cualquier parte y nos ubicaremos en ella a por medio de la línea de comandos. Una vez allí, ejecutaremos el comando <span class="lang:default decode:true crayon-inline">npm init</span> , el cual nos solicitará algunos datos referentes al proyecto, al finalizar, nos habrá creado el archivo <span class="lang:default decode:true crayon-inline">package.json</span> y una carpeta llamada <em>node_modules</em>, la cual contiene todas las librerías estándar de NodeJS.</p>
<p>En este punto, tendremos que instalar los módulos de NPM que vamos a requerir, para ello, ejecutaremos los comandos:</p>
<ul>
<li>npm install &#8211;save express</li>
<li>npm install &#8211;save body-parser</li>
</ul>
<p><em>Express</em> es el módulo más popular para desarrollos web en NodeJS y además, es especialmente útil para la construcción de API’s, por otra parte, el Middleware <em>body-parse</em>, que anteriormente era parte de Express, nos ayudará a procesar el payload (o body) del request, el cual nos lo dejar listo y en el formato que lo necesitamos, en este caso, en JSON.</p>
<p>En este punto, tendremos un archivo <span class="lang:default decode:true crayon-inline ">package.json</span>  muy parecido al siguiente:</p>
<pre class="lang:js decode:true" title="package.json">{
  "name": "api-rest",
  "version": "1.0.0",
  "description": "Mi primer API REST",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" &amp;&amp; exit 1"
  },
  "keywords": [
    "API",
    "REST",
    "NodeJS"
  ],
  "author": "Oscar Blancarte",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.2"
  }
}
</pre>
<h2>Levantando un servidor</h2>
<p>El siguiente paso será montar un servidor usando NodeJS + Express, para lo cual, tendremos que crear un nuevo archivo llamado <span class="lang:default decode:true crayon-inline ">server.js</span>  directamente sobre la raíz del proyecto, el cual se verá de la siguiente manera:</p>
<pre class="lang:js decode:true " title="server.js">var express = require('express')
var http = require('http')
var app = express()

app.get('/', (req, res) =&gt; {
  res.status(200).send("Welcome to API REST")
})

http.createServer(app).listen(8001, () =&gt; {
  console.log('Server started at http://localhost:8001');
});</pre>
<p>Con estas simples líneas, hemos creado un servidor web capaz de servir peticiones web, sobre el cual montaremos nuestra API REST. Antes de ejecutar este código, vamos a analizar qué está pasando. Lo primero que podemos apreciar, es que importamos el módulo <em>Express</em> del que ya hablamos y el módulo <em>Http</em>, el cual es parte del estándar NodeJS, por lo que hace falta instalarlo con NPM. Este segundo módulo es utiliza para crear oyentes capases de escuchar peticiones HTTP en un determinado puerto. El segundo paso será crear una instancia de Express, como podemos observar en la línea 3.</p>
<p>Una vez hechos con la instancia de Express, solo nos resta crear los <em>Routers</em>, los cuales son las reglas por medio de las cuales Express sabrá como procesar las diferentes peticiones en diferentes URL’s, para lo cual, Express proporcionar una serie de funciones para procesar los diferentes métodos que soporta HTTP, como es <em>GET</em>, <em>POST</em>, <em>DELETE</em>, <em>PUT</em>, etc. En este caso, hemos creado un router para atender las peticiones que lleguen a la raíz del servidor. Es por eso la importancia de la línea 5, la cual responderá con la frase “Welcome to API REST” al recibir una petición GET a la raíz del servidor.</p>
<p>Al igual que tenemos la función GET, tenemos todas las demás, por ejemplo, POST, DELETE, PUSH, PUT, etc. las cuales se definen de la misma forma que GET, pero solo es necesario cambiar la función con la del método HTTP deseado, por ejemplo: <em>app.post()</em>, <em>app.delete()</em>, <em>app.push()</em>,<em> app.put()</em>. Todas estas variantes, reciben dos parámetros, el primero es la URL en la cual responden y el segundo es una función (Callback) la cual será ejecutada una vez que una petición sea recibida.</p>
<p>Finalmente, y una vez que tenemos todas las reglas de routeo (<em>routers</em>), tendremos que crear un oyente para recibir las peticiones, para ello nos apoyamos del módulo <em>Http</em> como podemos ver en la línea 9. El server Http lo creamos (<em>createServer</em>) pasando como parámetro la instancia de Express para finalmente levantar el servidor con la función <em>listener</em>. Esta última, recibe el puerto en el que escucha y una callback que se ejecuta una vez levantado el server.</p>
<p><figure id="attachment_2259" aria-describedby="caption-attachment-2259" style="width: 648px" class="wp-caption aligncenter"><a href="https://reactiveprogramming.io/books/applicaciones-reactivas-con-react-nodejs-mongodb"><img loading="lazy" class="wp-image-2259 size-large" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/08/banner-react-1024x345.jpg" alt="" width="648" height="218" /></a><figcaption id="caption-attachment-2259" class="wp-caption-text">¿Te gustaría aprender las técnicas más avanzadas para crear API REST con NodeJS? Te invito a que veas mi libro &#8220;Aplicaciones reactivas con React, NodeJS &amp; MongoDB&#8221;, donde aprenderás a crear una API REST completo, desde exponer los servicios hasta habilitar la seguridad con JSON Web Token (JTW)</figcaption></figure></p>
<h2>Probando el servidor</h2>
<p>Una vez que tenemos una primera versión de nuestro servidor, solo nos queda probarla para asegurarnos de que todo funciona bien, por lo cual, regresamos la línea de comandos y ejecutamos node <span class="lang:js decode:true crayon-inline ">server.js</span> , como resultado tendremos lo siguiente:</p>
<p><img loading="lazy" class="aligncenter wp-image-1959 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/start-nodejs.png" alt="API REST - start nodejs" width="606" height="92" /></p>
<p>Una vez tenemos la confirmación de que nuestro server esta arriba, procedemos con probarlo con el navegador, por lo que entramos a la URL <a href="http://localhost:8001">http://localhost:8001</a> y veremos el siguiente resultado:</p>
<p><img loading="lazy" class="aligncenter wp-image-1960 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/test-server.png" alt="API REST - test server" width="449" height="208" /></p>
<p>Si ves esto, es porque nuestro servidor ya está listo. No es gran cosa, pero al menos ya es avance para construir nuestra API REST.</p>
<p>Ya con esto, tenemos todo preparado para iniciar con la construcción de nuestros servicios, pero esto lo dejaremos para la segunda parte de este artículo.</p>
<p style="text-align: center;"><a class="btn btn-default" href="/2018/01/12/construir-api-rest-nodejs-segunda-parte/"> Continuación (Segunda parte)<i class="fa fa-chevron-right" aria-hidden="true"></i></a></p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/">Como construir un API REST con NodeJS (Primera parte)</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1957</post-id>	</item>
	</channel>
</rss>
