<?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>express &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/express/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.5</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>express &#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>Implementar JSON Web Tokens con NodeJS</title>
		<link>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/</link>
					<comments>https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 16 Jan 2018 10:00:32 +0000</pubDate>
				<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[express]]></category>
		<category><![CDATA[jwt]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=2003</guid>

					<description><![CDATA[<p>JSON Web Tokens o simplemente JTW, es una herramienta que nos permite autenticarnos con el servidor mediante Tokens de una forma simple y segura. Los Tokens son una cadena de alfanumérica, que es generada por el servidor y es enviada al cliente para autenticaciones futuras, evitando tener que enviar credenciales en cada invocación. Te recomiendo [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/">Implementar JSON Web Tokens con NodeJS</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-2009" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/implementando-JSON-Web-Tokens-con-NodeJS-Cuarta-parte.png" alt="implementando JSON Web Tokens con NodeJS - Cuarta parte" width="724" height="406" />JSON Web Tokens o simplemente JTW, es una herramienta que nos permite autenticarnos con el servidor mediante Tokens de una forma simple y segura. Los Tokens son una cadena de alfanumérica, que es generada por el servidor y es enviada al cliente para autenticaciones futuras, evitando tener que enviar credenciales en cada invocación.<span id="more-2003"></span></p>
<p><em>Te recomiendo que te des una venta a mi artículo <a href="https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/"><strong>Autenticación con JSON Web Tokens</strong></a>, el cual abordo toda la teoría, por si no estás familiarizado con el concepto de Tokens y la forma de trabajar.</em></p>
<p><em>Este artículo es parte de una colección de artículo en donde explico cómo <a href="https://www.oscarblancarteblog.com/2018/01/11/construir-api-rest-nodejs-primera-parte/"><strong>Construir un API REST con NodeJS</strong></a>, por lo que si estas interesado puede regresar desde el comienzo.</em></p>
<h2>Implementando JWT en un API REST</h2>
<p>Lo primero será instalar el módulo de JWT, para lo cual, ejecutaremos el comando <span class="lang:default decode:true crayon-inline">npm install &#8211;save jsonwebtoken body-parser</span> , una vez hecho esto, tendremos que implementar un servicio de autenticación tradicional, el cual reciba usuario y contraseña y nos regrese un token en caso de éxito. El servicio quedaría de la siguiente manera:</p>
<pre class="lang:js decode:true ">var jwt = require('jsonwebtoken')
var bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json({limit:'10mb'}))

app.post('/login', (req, res) =&gt; {
  var username = req.body.user
  var password = req.body.password

  if( !(username === 'oscar' &amp;&amp; password === '1234')){
    res.status(401).send({
      error: 'usuario o contraseña inválidos'
    })
    return
  }

  var tokenData = {
    username: username
    // ANY DATA
  }

  var token = jwt.sign(tokenData, 'Secret Password', {
     expiresIn: 60 * 60 * 24 // expires in 24 hours
  })

  res.send({
    token
  })
})</pre>
<p>La función login recibe como parámetro el usuario (<span class="lang:default decode:true crayon-inline ">req.body.user</span> ) y el password (<span class="lang:default decode:true crayon-inline ">req.body.password</span> ), los cuales los tendremos que validar contra nuestros usuarios, sin embargo, en este caso, para hacerlo más simple, lo hemos validado contra el usuario oscar/1234, si la autenticación falla, entonces regresamos un error al cliente. Por otra parte, si todo sale bien, creamos un token al usuario, el cual tiene una vigencia de 24 horas, para finalmente retornarlo.</p>
<p>Veamos un ejemplo de autenticación:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2004" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Creando-el-Token-JWS.png" alt="Creando el Token JWS" width="938" height="762" /></p>
<p>En la imagen pasada hemos enviado las credenciales correctas para que nos genere un token, sin embargo, no se puede ver correctamente debido a su longitud, es por ello que lo ponemos por a continuación:</p>
<pre class="lang:js decode:true">{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Im9zY2FyIiwiaWF0IjoxNTE2MDY4OTI4LCJleHAiOjE1MTYxNTUzMjh9.zucLW085AiZ8VWojwNFFcMz0yv1H4RbeCMQy7lVjS7s"
}</pre>
<p>Este token deberá ser guardado por el usuario para futuras invocaciones al API.</p>
<h2>Autenticándonos mediante Tokens</h2>
<p>El siguiente paso será crear un servicio protegido que valida la existencia del token, de lo contrario, evitará el acceso, para ello crearemos un servicio de prueba llamado secure:</p>
<pre class="lang:js decode:true">app.get('/secure', (req, res) =&gt; {
    var token = req.headers['authorization']
    if(!token){
        res.status(401).send({
          error: "Es necesario el token de autenticación"
        })
        return
    }

    token = token.replace('Bearer ', '')

    jwt.verify(token, 'Secret Password', function(err, user) {
      if (err) {
        res.status(401).send({
          error: 'Token inválido'
        })
      } else {
        res.send({
          message: 'Awwwww yeah!!!!'
        })
      }
    })
})</pre>
<p>Como podemos observar, lo primero que tenemos que hacer, es recuperar el header correspondiente al token, es decir, el token “<span class="lang:default decode:true crayon-inline ">authorization</span> ”, si este header no se encuentra, entonces retornamos un código 401 (No autorizado) y regresamos el motivo del error.</p>
<p>El siguiente paso es algo confuso, pues al token hay que retirarla el substring “<span class="lang:default decode:true crayon-inline ">Baerer </span> “, este String es parte de las especificaciones de HTTP, y es agredo de forma automática, por lo que no entraremos en detalles, simplemente lo retiramos.</p>
<p>Finalmente, validamos el token mediante el método verify, el cual validará que el token sea válido y además que no esté caducado, en cualquiera de estos dos casos, un error 401 es retornado junto con el mensaje de error. Finalmente, si todo sale bien, procedemos con la operación de negocio.</p>
<p>El siguiente request es enviado son el header, retornando un error 401 y su mensaje de error correspondiente:</p>
<p><img loading="lazy" class="aligncenter size-full wp-image-2005" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Validacion-fallida-del-token-JWT.png" alt="Validacion fallida del token JWT" width="926" height="651" /></p>
<p>Este nuevo request es enviado con el header ‘<span class="lang:default decode:true crayon-inline ">authorization</span> ’ el cual corresponde a un token válido generado por el servicio de login:<img loading="lazy" class="aligncenter size-full wp-image-2006" src="https://www.oscarblancarteblog.com/wp-content/uploads/2018/01/Validacion-exitosa-del-token-JWT.png" alt="" width="926" height="661" /></p>
<p>NOTA: Siempre será mejor usar un middleware para validar el token, de esta forma, evitamos tener que validar el token en cada invocación, sin embargo, lo hemos hecho así para hacer más fácil el ejemplo.		</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2018/01/16/implementar-json-web-tokens-nodejs/">Implementar JSON Web Tokens con NodeJS</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/16/implementar-json-web-tokens-nodejs/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2003</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>
<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>
<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>
<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>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>
<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>
<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>
