<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Redes de Computadoras - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Redes de Computadoras - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 17 May 2026 04:15:16 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/redes-de-computadoras/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Redes HTTP en JavaScript – Manual para Principiantes ]]>
                </title>
                <description>
                    <![CDATA[ HTTP es la columna vertebral del internet moderno. En este curso basado en texto, aprenderás cómo funciona el protocolo HTTP y cómo se usa en el desarrollo web del mundo real. Todos los ejemplos de código para este curso están en JavaScript, pero los conceptos de redes que aprenderás aquí ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/http-networking-in-javascript-handbook-for-beginners/</link>
                <guid isPermaLink="false">663027a97b1bd304018ef761</guid>
                
                    <category>
                        <![CDATA[ HTTPS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ http ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Redes de Computadoras ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Wed, 29 May 2024 18:08:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/04/HTTP-Networking-in-JavaScript-Book-Cover.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/http-full-course/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">HTTP Networking in JavaScript – Handbook for Beginners</a>
      </p><p>HTTP es la columna vertebral del internet moderno. En este curso basado en texto, aprenderás cómo funciona el protocolo HTTP y cómo se usa en el desarrollo web del mundo real.</p><p>Todos los ejemplos de código para este curso están en JavaScript, pero los conceptos de redes que aprenderás aquí aplican generalmente para todos los lenguajes de código. <em>Si no estás familiarizado con JavaScript todavía, puede ver <a href="https://boot.dev/learn/learn-javascript">mi curso de JS aquí</a></em>.</p><p>He incluido todo el material de aprendizaje que necesitarás aquí en este artículo, pero si te gustaría una experiencia más práctica, puedes tomar la <a href="https://boot.dev/learn/learn-http">versión interactiva de este curso con desafíos de código en Boot.dev aquí</a>. </p><p>También he publicado una versión en vídeo gratuito de este curso en el canal de Youtube de freeCodeCamp (en inglés):</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe width="356" height="200" src="https://www.youtube.com/embed/2JYT5f2isg4?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Full HTTP Networking Course – Fetch and REST APIs in JavaScript" name="fitvid0" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 27.5px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 720px; height: 404.484px;"></iframe>
          </div>
        </div>
      </figure><p>Si te gusta este vídeo, puedes revisar mis otros tutoriales en mi <a href="https://youtube.com/@bootdotdev">canal de Youtube Boot.dev aquí</a>.</p><p>Con eso dicho, ¡comencemos a aprender sobre HTTP!</p><h2 id="tabla-de-contenidos"><strong><strong><strong>Tabl</strong></strong>a<strong><strong> </strong></strong>de<strong><strong> C</strong></strong>ontenidos</strong></h2><ol><li>¿<a href="#why-http">Por qué HTTP?</a></li><li>¿<a href="#what-is-dns">Qué es DNS?</a></li><li>¿<a href="#what-are-uris">Qué son los URIs?</a></li><li><a href="#async-await">Async/Await</a></li><li><a href="#error-handling">Manejo de Errores</a></li><li><a href="#http-headers">Cabeceras de HTTP</a></li><li>¿<a href="#what-is-json">Qué es JSON?</a></li><li><a href="#http-methods">Métodos HTTP</a></li><li><a href="#url-paths-and-params">Rutas URL y Parámetros</a></li><li><a href="#what-is-https">¿Qué es HTTPs?</a></li></ol><!--kg-card-begin: html--><h2 id="why-http">¿Por qué HTTP?</h2><!--kg-card-end: html--><h3 id="comunicando-en-la-web"><strong>Comunicando en la web</strong></h3><p>Instagram sería bastante terrible si tuvieras que copiar manualmente tus fotos al teléfono de tu amigo cuando quisieras compartirlos. Las aplicaciones modernas necesitan ser capaz de comunicar información <em>entre los dispositivos</em> por internet.</p><ul><li>Gmail no solo almacena tus emails en variables en tu computadora, los almacena en computadoras en sus centros de datos.</li><li>No pierdes los mensajes de Slack si tiras tu computadora en un lago – esos mensajes existen en los <a href="https://es.wikipedia.org/wiki/Servidor_web">servidores</a> de Slack.</li></ul><h3 id="-c-mo-funciona-la-comunicaci-n-web"><strong>¿Cómo funciona la comunicación web?</strong></h3><p>Cuando dos computadores se comunican entre ellos, necesitan usar las mismas reglas. Como hablante inglés no me puedo comunicar verbalmente con un hablante japonés, y de forma similar, dos computadoras necesitan hablar el mismo lenguaje para comunicarse.</p><p>Este "lenguaje" que las computadoras usan se llama un <a href="https://es.wikipedia.org/wiki/Protocolo_de_comunicaciones">protocolo</a>. El protocolo más popular para la comunicación web es <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Overview">HTTP</a>, el cual significa Protocolo de Transferencia de Hipertexto.</p><h3 id="interactuando-con-un-servidor"><strong>Interactuando con un servidor</strong></h3><p>En este curso, un montón de ejemplos de código interactuarán con el <a href="https://pokeapi.co/">PokeAPI</a>. Provee datos sobre Pokemón.</p><p>Aquí hay algo de código que devuelve una lista de Pokemón de la PokeAPI:</p><pre><code class="language-javascript">const pokemonResp = await getItemData()

logPokemons(pokemonResp.results)

async function getItemData() {
  const response = await fetch('https://pokeapi.co/api/v2/pokemon/', {
    method: 'GET',
    mode: 'cors',
    headers: {
      'Content-Type': 'application/json'
    }
  })
  return response.json()
}

function logPokemons(pokemons) {
  for (const pokemon of pokemons) {
    console.log(pokemon.name)
  } 
}</code></pre><p>Cuando ejecutas este código, notarás que ninguno de los datos que se imprimen en la consola fue generado, ¡dentro de nuestro código! Eso se debe a que los datos que devolvimos se envían por internet desde nuestros servidores por medio de HTTP. No te preocupes, explicaré más sobre eso más tarde. </p><h3 id="solicitudes-y-respuestas-http"><strong>Solicitudes y Respuestas HTTP</strong></h3><p>El núcleo de HTTP es un simple sistema de solicitud-respuesta. La computadora "solicitando", también conocido como el "<a href="https://es.wikipedia.org/wiki/Cliente_(inform%C3%A1tica)">cliente</a>", le pide a otra computadora algo de información. Esa computadora, el "<a href="https://es.wikipedia.org/wiki/Servidor">servidor</a>" devuelve una respuesta con la información que fue solicitada.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/ReFw6nN.png" class="kg-image" alt="ReFw6nN" width="925" height="297" loading="lazy"></figure><p>Hablaremos sobre las especificaciones de cómo se formatean las "solicitudes" y "respuestas" luego. Por ahora, solo imagínalo como un simple sistema de pregunta-y-respuesta.</p><ul><li>Solicitud: "¿Cuáles son los ítems en el juego Fantasy Quest?"</li><li>Respuesta: Una lista de los ítems en el juego Fantasy Quest</li></ul><h3 id="http-potencia-a-los-sitios-web"><strong>HTTP potencia a los sitios web</strong></h3><p>Como discutimos, <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Overview">HTTP</a>, o el Protocolo de Transferencia de Hipertexto, es un <a href="https://developer.mozilla.org/es/docs/Glossary/Protocol">protocolo</a> diseñado para transferir información entre computadoras.</p><p>Hay otros protocolos para comunicarse por el internet, pero HTTP es el mas popular y es <em>particularmente genial para los sitios web y aplicaciones web</em>.</p><p>Cada vez que visitas un sitio web, tu navegador realiza una solicitud HTTP a ese servidor del sitio web. El servidor responde con todo el texto, imágenes, e información de estilo que tu navegador necesita para renderizar su lindo sitio web.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/EflKJzq.jpg" class="kg-image" alt="EflKJzq" width="1080" height="1080" loading="lazy"></figure><h3 id="urls-http"><strong>URLs HTTP</strong></h3><p>Un URL, o Localizador de Recursos Uniforme, es esencialmente la dirección de otra computadora, o "servidor" en el internet. Parte de la URL específica cómo alcanzar el servidor, y parte de él le dice al servidor qué información queremos - pero mas sobre eso luego.</p><p>Por ahora, es importante entender que una URL representa una pieza de información en otra computadora a la que queremos acceder. Podemos obtener acceso a él haciendo una <em>solicitud</em>, y leyendo la <em>respuesta</em> con el que el servidor responde.</p><h3 id="c-mo-usar-las-urls-en-http"><strong>Cómo usar las URLs en HTTP</strong></h3><p>El <code>http://</code> al principio de una <a href="https://developer.mozilla.org/es/docs/Learn/Common_questions/Web_mechanics/What_is_a_URL">URL de un sitio web</a> específica que el protocolo <code>http</code> será usado para comunicación.</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/6jiaXBn.png" class="kg-image" alt="6jiaXBn" width="368" height="137" loading="lazy"></figure><p>Otros protocolos de comunicación usan URLs también, (por ello "Localizador de Recursos Uniforme"). Por eso necesitamos ser específicos cuando hacemos solicitudes HTTP prefijando la URL con <code>http://</code>.</p><h3 id="repaso-sobre-solicitudes-y-respuestas"><strong>Repaso sobre Solicitudes y Respuestas</strong></h3><ul><li>Un "cliente" es una computadora haciendo una solicitud HTTP</li><li>Un "servidor" es una computadora respondiendo a una solicitud HTTP</li><li>Una computadora puede ser un cliente, un servidor, ambos, o ninguno. "Cliente" y "servidor" son solo palabras que usamos para describir que están haciendo las computadoras dentro de un sistema de comunicación</li><li>Los clientes envían solicitudes y recibe respuestas</li><li>Los servidores reciben solicitudes y envían respuestas</li></ul><h2 id="la-api-fetch-de-javascript"><strong>La API Fetch de JavaScript</strong></h2><p>En este curso, estaremos usando la <a href="https://developer.mozilla.org/es/docs/Web/API/Fetch_API">API fetch</a> incorporada de JavaScript para hacer solicitudes HTTP.</p><p>La función <code>fetch()</code> se pone a nuestra disposición por el lenguaje JavaScript ejecutándose en el navegador. Todo lo que tenemos que hacer es proveerle los parámetros que requiere.</p><h3 id="c-mo-usar-fetch"><strong>Cómo usar<strong><strong> Fetch</strong></strong></strong></h3><pre><code class="language-javascript">const response = await fetch(url, settings)
const responseData = await response.json()
</code></pre><p>Iremos en profundidad sobre las diversas cosas que suceden en esta llamada <code>fetch</code> estándar después, pero cubramos algunas bases por ahora.</p><ul><li><code>response</code> es el dato que es devuelto del servidor</li><li><code>url</code> es la URL a la que le estamos haciendo una solicitud </li><li><code>settings</code> es un objeto que contiene algunas opciones específicas de solicitud</li><li>La palabra clave <code>await</code> le dice a JavaScript que espere hasta que la solicitud vuelva del servidor antes de continuar</li><li><code>response.json()</code> conviertes los datos de respuesta del servidor en un objeto de JavaScript</li></ul><p>Mira si puedes encontrar el problema en este fragmento de código:</p><pre><code class="language-javascript">const pokemonResp = getItemData()

logPokemons(pokemonResp.results)

// el bug (error) está arriba de esta línea

async function getItemData() {
  const response = await fetch('https://pokeapi.co/api/v2/pokemon/', {
    method: 'GET',
    mode: 'cors',
    headers: {
      'Content-Type': 'application/json'
    }
  })
  return response.json()
}

function logPokemons(pokemons) {
  for (const pokemon of pokemons) {
    console.log(pokemon.name)
  } 
}</code></pre><p>Pista: No estamos esperando que los datos sean devueltos por medio de la red.</p><h3 id="los-clientes-web"><strong>Los Clientes Web</strong></h3><p>Un cliente web es un dispositivo realizando solicitudes a un servidor web. Un cliente puede ser de cualquier tipo de dispositivo pero frecuentemente es algo con el que los usuarios interactúan físicamente. Por ejemplo:</p><ul><li>Una computadora de escritorio</li><li>Un teléfono móvil</li><li>Una tablet</li></ul><p>En un sitio web o una aplicación web, le llamamos al dispositivo del usuario el "front-end". Un cliente front-end realiza solicitudes a un servidor back-end.</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/zldXGet.jpg" class="kg-image" alt="zldXGet" width="1920" height="1080" loading="lazy"></figure><h3 id="los-servidores-web"><strong>Los Servidores Web</strong></h3><p>A este punto, la mayoría de los datos con los que has trabajado en tu código han sido simplemente generados y almacenados localmente en variables.</p><p>A medida que siempre usarás variables para almacenar y manipular datos mientras tu programa se ejecuta, la mayoría de los sitios web y aplicaciones usan un servidor web para almacenar, ordenar, y servidor esos datos de esa forma se queda por más tiempo que una sesión única, y pueden ser accedidos por múltiples dispositivos.</p><h3 id="escuchando-y-sirviendo-datos"><strong>Escuchando<strong><strong> </strong></strong>y sirviendo<strong><strong> dat</strong></strong>os</strong></h3><p>Similar a cómo un servidor en un restaurante te trae la comida a la mesa, un <a href="https://es.wikipedia.org/wiki/Servidor_web">servidor web</a> sirve recursos web, tales como páginas, imágenes, y otros datos. El servidor se activa y "escucha" solicitudes entrantes constantemente de esa forma en el segundo que recibe una nueva solicitud, puede enviar una respuesta apropiada.</p><h3 id="el-servidor-es-el-back-end"><strong>El servidor es el back-end</strong></h3><p>Mientras el "front-end" de un sitio web o aplicación web es el dispositivo con el que el usuario interactúa, el "back-end" es el servidor que mantiene todos los datos almacenados en un lugar central. Si todavía estás confundido, <a href="https://blog.boot.dev/backend/frontend-vs-backend-meaning/">mira este artículo comparando el desarrollo front-end y back-end</a>. </p><h3 id="un-servidor-es-solo-una-computadora"><strong>Un servidor es solo una computadora</strong></h3><p>"Servidor" es solo el nombre que le damos a una computadora que está tomando el rol de servidor de servidor datos por medio de una conexión red.</p><p>Un buen servidor se activa y está disponible los 24 horas del día, los 7 días de la semana. Mientras tu laptop <em>puede</em> ser usado como un servidor, tiene mas sentido usar una computadora de un centro de datos que está diseñado para estar activo y ejecutándose constantemente.</p><!--kg-card-begin: html--><h2 id="what-is-dns">¿Qué es DNS?</h2><!--kg-card-end: html--><h3 id="direcciones-web"><strong>Direcciones Web</strong></h3><p>En el mundo real, usamos direcciones para ayudarnos a encontrar donde vive un amigo, dónde se encuentra un negocio, o dónde se está organizando una fiesta.</p><p>En computación, los clientes web encuentran otras computadoras a través de internet usando el <a href="https://es.wikipedia.org/wiki/Protocolo_de_internet">Protocolo de Internet o direcciones</a> IP.</p><p>Una dirección IP es una etiqueta numérica que sirve dos funciones principales:</p><ol><li>Dirección de ubicación</li><li>Identificación de Red</li></ol><h3 id="nombres-de-dominio-y-direcciones-ip"><strong>Nombres de Dominio y Direcciones IP</strong></h3><p>Cada dispositivo conectado al internet tiene una dirección IP única. Cuando buscamos por internet, los dominios a la que navegamos todos están asociados con una dirección IP particular.</p><p>Por ejemplo, this URL de Wikipedia apunta a una página sobre cerdos en miniatura: <a href="https://es.wikipedia.org/wiki/Minicerdo"><code>https://es.wikipedia.org/wiki/Minicerdo</code></a>. La porción de dominio del URL es <code>es.wikipedia.org</code>. <code><a href="https://es.wikipedia.org/wiki/Minicerdo">es.wikipedia.org</a></code> se convierte a una dirección IP específica, y esa dirección IP le dice a tu computadora exactamente a dónde comunicarse con esa página de Wikipedia.</p><p>Cloudflare es una compañía tech que provee un servidor HTTP público interesante que podemos usar para buscar la dirección IP de cualquier dominio. Mira este fragmento de código:</p><pre><code class="language-javascript">async function fetchIPAddress(domain) {
  const resp = await fetch(`https://cloudflare-dns.com/dns-query?name=${domain}&amp;type=A`, {
    headers: {
      'accept': 'application/dns-json'
    }
  })
  const respObject = await resp.json()
  for (const record of respObject.Answer) {
    return record.data
  }
  return null
}

const domain = 'api.boot.dev'
const ipAddress = await fetchIPAddress(domain)
if (!ipAddress) {
  console.log('Algo estuvo mal en fetchIPAddress')
} else {
  console.log(`Direccion IP encontrado para el dominio ${domain}: ${ipAddress}`)
}
</code></pre><p>Para repasar, un "nombre de dominio" es parte de un URL. Es la parte que le dice a la computadora <em>dónde se encuentra el servidor en el internet siendo convertido en una dirección IP numérica</em>.</p><p>Cubriremos cómo es usado exactamente una dirección IP por tu computadora para encontrar una ruta al servidor en un curso de redes después. Por ahora, es importante entender que una dirección IP es lo que tu computadora está usando en un nivel bajo para comunicarse en una red.</p><p>Desplegar un sitio web real al internet es en realidad bastante sencillo. Involucra solamente un par de pasos:</p><ol><li>Crear un servidor que hospeda tus archivos del sitio web y conectarlo al internet</li><li>Adquirir un nombre de dominio</li><li>Conectar el nombre de dominio a la dirección IP de tu servidor</li><li>¡Tu servidor es accesible por medio de internet!</li></ol><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/vjjPt2a.png" class="kg-image" alt="vjjPt2a" width="310" height="163" loading="lazy"></figure><p>Como discutimos, el "nombre de dominio" o "nombre de hospedaje" es parte de una URL. Llegaremos a las otras partes de un URL luego.</p><p>Por ejemplo, la URL <code>https://example.com/path</code> tiene un nombre de host de <code>example.com</code>. Las porciones <code>https://</code> y <code>/path</code> no son parte del mapeo <code>nombre de dominio -&gt; dirección IP</code> que hemos estado aprendiendo.</p><h3 id="usando-la-api-url-en-javascript"><strong>Usando la API URL en JavaScript</strong></h3><p>La API <code>URL</code> está incorporado en JavaScript. Puedes crear un <a href="https://developer.mozilla.org/es/docs/Web/API/URL/URL">nuevo objeto URL</a> como esto:</p><pre><code class="language-js">const urlObj = new URL('https://example.com/example-path')</code></pre><p>Y luego puedes <a href="https://developer.mozilla.org/es/docs/Web/API/URL">extraer solo el nombre de host</a>:</p><pre><code class="language-js">const urlObj.hostname</code></pre><h3 id="repaso-de-dns"><strong>Repaso de DNS</strong></h3><p>Así que hemos hablado sobre nombres de dominio y cuál es su propósito, pero no hemos hablado sobre el sistema que es usado para hacer esa conversión.</p><p><a href="https://www.freecodecamp.org/news/what-is-dns/">DNS</a>, o el "Sistema de Nombre de Dominio", es el directorio de teléfono del internet. Los humanos se conectan a los sitios web a través de <a href="https://es.wikipedia.org/wiki/Dominio_de_internet">nombres de dominio</a>, como <a href="https://boot.dev/">Boot.dev</a>.</p><p>El DNS "resuelve" estos nombres de dominio para encontrar las <a href="https://es.wikipedia.org/wiki/Protocolo_de_internet">direcciones IP</a> asociadas de esa forma los clientes web pueden cargar los recursos para la dirección específica. </p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/yvfSbVL.png" class="kg-image" alt="yvfSbVL" width="1024" height="512" loading="lazy"></figure><h3 id="-c-mo-funciona-el-dns"><strong>¿Cómo funciona el DNS?</strong></h3><p>Iremos en mas detalle sobre DNS en un futuro curso, pero para darte una idea simplificada de cómo funciona, introduzcamos ICANN. <a href="https://www.icann.org/">ICANN</a> es una organización sin fines de lucro que gestiona el DNS para todo el internet.</p><p>Cuando tu computadora intenta resolver un nombre de dominio, contacta con uno de los "<a href="https://es.wikipedia.org/wiki/Servidor_ra%C3%ADz">servidores raíz</a>" de ICANN cuyo dirección está incluida en tu configuración de red de la computadora.</p><p>Desde ahí, el servidor puede reunir los registros de dominio para un nombre de dominio específico desde su base de datos de DNS distribuido.</p><p>Si ves al DNS como una guía telefónica, ICANN sería el editor que mantiene la guía telefónica en impresión y disponible.</p><h3 id="sub-dominios"><strong>Sub-dominios</strong></h3><p>Aprendimos cómo un nombre de dominio se traduce a una dirección IP, el cual es solo una computadora en una red - frecuentemente el internet.</p><p>Un sub-dominio prefija un nombre de dominio, permitiendo a un dominio encaminar el tráfico de red a muchos servidores y recursos distintos.</p><p>Por ejemplo, el sitio web <a href="https://boot.dev/">Boot.dev</a> está hospedado en una computadora distinta de nuestro blog. Nuestro blog, encontrado en <a href="https://blog.boot.dev/">blog.boot.dev</a> está hospedado en nuestro sub-dominio "blog".</p><!--kg-card-begin: html--><h2 id="what-are-uris">¿Qué son los URIs?</h2><!--kg-card-end: html--><p>Brevemente tocamos los URLs anteriormente, pero ahora indaguemos un poco más profundo en el tema.</p><p>Un <a href="https://es.wikipedia.org/wiki/Identificador_de_recursos_uniforme">URI</a>, o <em>Identificador</em> de Recursos Uniforme, es una secuencia de caracteres única que identifica a un recurso que es (casi siempre) accedido por medio del internet.</p><p>Así como JavaScript tiene reglas de sintaxis, de la misma forma los URIs. Estas reglas ayudan en asegurar la uniformidad así cualquier programa puede interpretar el significado de la URI de la misma forma.</p><p>Los URIs vienen en dos tipos principales:</p><ul><li><a href="https://es.wikipedia.org/wiki/Localizador_de_recursos_uniforme">URLs</a></li><li><a href="https://es.wikipedia.org/wiki/Nombre_de_Recurso_Uniforme">URNs</a></li></ul><p>Nos enfocaremos específicamente en los URLs en este curso, pero es importante saber que los URLs son solamente un tipo de URI.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/VzqzckC.png" class="kg-image" alt="VzqzckC" width="500" height="394" loading="lazy"></figure><p>Los URLs tienen bastante secciones, algunas de las cuales son requeridos, otros no. Usemos la <a href="https://developer.mozilla.org/es/docs/Web/API/URL/URL">API URL</a> para convertir una URL e imprimir todas las distintas partes. Aprenderemos mas sobre cada parte luego, por ahora, separemos y mostremos un URL.</p><pre><code class="language-js">function printURLParts(urlString) {
  const urlObj = new URL(urlString)
  console.log(`protocolo: ${urlObj.protocol}`)
  console.log(`nombre de usuario: ${urlObj.username}`)
  console.log(`contraseña: ${urlObj.password}`)
  console.log(`nombre de host: ${urlObj.hostname}`)
  console.log(`puerto: ${urlObj.port}`)
  console.log(`nombre de la ruta: ${urlObj.pathname}`)
  console.log(`buscar: ${urlObj.search}`)
  console.log(`hash: ${urlObj.hash}`)
}

const fantasyQuestURL = 'http://dragonslayer:pwn3d@fantasyquest.com:8080/maps?sort=rank#id'
printURLParts(fantasyQuestURL)</code></pre><h3 id="disecci-n-adicional-de-un-url"><strong>Disección adicional de un URL</strong></h3><p>Hay 8 partes principales de un URL, aunque no todas las secciones están presentes siempre. Cada pieza juega un rol específico en ayudar a los cliente localizar el recurso especificado.</p><p>Las 8 secciones son:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/iI3sUVh.png" class="kg-image" alt="iI3sUVh" width="1280" height="720" loading="lazy"></figure><ul><li>El protocolo es requerido</li><li>Los nombres de usuarios y contraseñas son opcionales</li><li>Un dominio es requerido</li><li>El puerto predeterminado para un protocolo dado es usado si uno no fue provisto</li><li>La ruta ( <code>/</code> ) predeterminada es usada si uno no es provisto</li><li>Una solicitud es opcional</li><li>Un fragmento es opcional</li></ul><h3 id="no-te-obsesiones-en-memorizar-esto"><strong>No te obsesiones en memorizar esto</strong></h3><p>Ya que los nombres para las diferentes secciones son usados con frecuencia indistintamente, y ya que no todas las partes del URL están siempre presentes, puede ser difícil mantener las cosas en orden.</p><p>¡No te preocupes en memorizar esto! Intenta familiarizarte con estos conceptos de URL desde un alto nivel. Como cualquier buen desarrollador, puedes buscarlo nuevamente la próxima vez que necesites saber más. </p><h3 id="el-protocolo"><strong>El Protocolo</strong></h3><p>El "protocolo", también referido como el "esquema", es el primero componente de un URL. Su finalidad es definir las reglas mediante los cuales se muestran los datos que se comunican, se codifican, o se formatean.</p><p>Algunos ejemplos de distintos protocolos de URL:</p><ul><li>http</li><li>ftp</li><li>mailto</li><li>https</li></ul><p>Por ejemplo:</p><ul><li><code>http://example.com</code></li><li><code>mailto:noreply@fantasyquest.app</code></li></ul><h3 id="no-todos-los-esquemas-requieren-un-"><strong>No todos los esquemas requieren un "//"</strong></h3><p>El "http" en un URL siempre es seguido por <code>://</code>. Todos los URLs tienen el dos puntos, pero la parte <code>//</code> se incluye solamente para los esquemas que tienen un <a href="https://www.rfc-editor.org/rfc/rfc3986#section-3.2">componente de autoridad</a>.</p><p>Como puedes ver arriba, el esquema <code>mailto</code> no usa un componente de autoridad, ya que no necesita las barras. </p><h3 id="puertos-de-url"><strong>Puertos de URL</strong></h3><p>El puerto en un URL es un punto de virtual donde las conexiones de red son hechas. Los puertos son manejados por un sistema operativo de la computadora y son enumerados desde <code>0</code> a <code>65,535</code>.</p><p>Cada vez que te conectas a otra computadora por medio de una red, te estás conectando a un puerto específico en esa computadora, el cual está siendo escuchado por una pieza de software específica en esa computadora. Un puerto puede ser usado solamente por un programa a la vez, por eso hay demasiados puertos posibles. </p><p>El componente puerto de un URL no es visible frecuentemente cuando se navega en sitios normales en internet, porque el 99% del tiempo estás usando los puertos predeterminados para los esquemas HTTP y HTTPS: <code>80</code> y <code>443</code>, respectivamente.</p><p>Cada vez que no estés usando un puerto predeterminado, necesitas especificarlo en el URL. Por ejemplo, el puerto <code>8080</code> es usado frecuentemente por desarrolladores web cuando están ejecutando su servidor en "modo en prueba" de esa forma no usan el puerto "80" de "producción".</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/h3kBsRC.png" class="kg-image" alt="h3kBsRC" width="625" height="129" loading="lazy"></figure><h3 id="rutas-de-url"><strong>Rutas de URL</strong></h3><p>En los primeros días de internet, la ruta de un URL con frecuencia era un reflejo de la ruta del archivo en el servidor al recurso que el cliente estaba solicitando.</p><p>Por ejemplo, si el sitio web <code>https://exampleblog.com</code> tendría un servidor web ejecutándose en su directorio <code>/home</code>, entonces una solicitud al URL <code>https://exampleblog.com/site/index.html</code> podría esperar que el archivo <code>index.html</code> desde dentro del directorio <code>/home/site</code> sea devuelto.</p><p>Los sitios web solían ser muy sencillos. Eran solo una colección de documentos de texto almacenados en un servidor. Un simple servidor de software podría manejar solicitudes HTTP entrantes y responder con los documentos de acuerdo al componente ruta de las URLs.</p><h3 id="en-estos-d-as-no-siempre-es-sobre-el-sistema-de-archivos"><strong>En estos días, no siempre es sobre el sistema de archivos</strong></h3><p>En muchos servidores web modernos, una ruta de URL no es un reflejo de la jerarquía del sistema de archivos del servidor. Las rutas en las URLs son esencialmente otro tipo de parámetro que puede ser pasado al servidor cuando se hace una solicitud.</p><p>Convencionalmente, dos rutas de URL distintas deberían denotar diferentes recursos. Por ejemplo, distintas páginas en un sitio web, o tal vez diferentes tipos de datos desde un servidor de juegos.</p><h3 id="par-metros-de-solicitud"><strong>Parámetros de Solicitud</strong></h3><p>Los parámetros de Solicitud en un URL <em>no</em> siempre están presentes. En el contexto de los sitios web, los parámetros de solicitud con frecuencia son usados para hacer analíticas de marketing o para cambiar una variable en la página web. Con los URLs de sitios web, los parámetros de solicitud <em>raramente</em> cambian que página estás viendo, aunque frecuentemente cambiarán el contenido de la página.</p><p>Con eso dicho, los parámetros de solicitud pueden ser usados para cualquier cosa que el servidor elija, tal como la ruta de URL.</p><h3 id="c-mo-usa-google-los-par-metros-de-solicitud"><strong>Cómo usa Google los parámetros de solicitud</strong></h3><ol><li>Abre una nueva pestaña y ve a <a href="https://google.com/">google.com</a></li><li>Busca "hello world"</li><li>Mira a tu URL actual. Debería comenzar con <code>https://www.google.com/search?q=hello+world</code></li><li>Cambia el URL para que diga <code>https://www.google.com/search?q=hello+universe</code></li><li>Presiona "enter"</li></ol><p>Deberías ver nuevos resultados de búsqueda para la solicitud "hello universe". Google eligió usar los parámetros de solicitud para representar el valor de tu solicitud de buśqueda. Esto tiene sentido - cada página de resultado de búsqueda es <em>esencialmente</em> la misma página en lo que respecta la estructura y el formato - solo te muestra diferentes resultados basado en la solicitud de búsqueda.</p><!--kg-card-begin: html--><h2 id="async-await">Async/Await</h2><!--kg-card-end: html--><p>Probablemente estés familiarizado con código <a href="https://developer.mozilla.org/es/docs/Glossary/Synchronous">síncrono</a>, el cual significa código que se <em>ejecuta en secuencia</em>. Cada línea de código se ejecuta en orden, uno después del otro.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/03FFGu0.png" class="kg-image" alt="03FFGu0" width="587" height="335" loading="lazy"></figure><p><br>Ejemplo de código síncrono:</p><pre><code class="language-js">console.log("Me imprimo primero");
console.log("Me imprimo segundo");
console.log("Me imprimo tercero");
</code></pre><p>El Código asíncrono o async se ejecuta en <em>paralelo</em>. Esto significa que el código mas abajo se ejecuta <em>al mismo tiempo que una línea de código anterior todavía se está ejecutando</em>. Una buena forma de visualizar esto es con la función <a href="https://developer.mozilla.org/es/docs/Web/API/setTimeout">setTimeout()</a> de JavaScript.</p><p><code>setTimeout</code> acepta una función y un número de milisegundos como entradas. Espera hasta que el número de milisegundos ha transcurrido, y luego ejecuta la función que le fue dada.</p><p>Ejemplo de código asíncrono:</p><pre><code class="language-js">jsconsole.log("Me imprimo primero");
setTimeout(() =&gt; console.log("Me imprimo tercero porque estoy esperando 100 milisegundos"), 100);
console.log("Me imprimo segundo");
</code></pre><p>Intenta alterar los tiempos de espera en el código asíncrono abajo para que se impriman los mensajes en el orden correcto:</p><pre><code class="language-js">const craftingCompleteWait = 0
const combiningMaterialsWait = 0
const smeltingIronBarsWait = 0
const shapingIronWait = 0

// No toques nada debajo de esta línea

setTimeout(() =&gt; console.log('Iron Longsword Complete!'), craftingCompleteWait)
setTimeout(() =&gt; console.log('Combining Materials...'), combiningMaterialsWait)
setTimeout(() =&gt; console.log('Smelting Iron Bars...'), smeltingIronBarsWait)
setTimeout(() =&gt; console.log('Shaping Iron...'), shapingIronWait)

console.log('Firing up the forge...')

await sleep(2500)
function sleep(ms) {
  return new Promise((resolve) =&gt; setTimeout(resolve, ms))
}
</code></pre><p>Orden esperado:</p><ol><li>Firing up the forge..</li><li>Smelting Iron Bars...</li><li>Combining Materials...</li><li>Shaping Iron...</li><li>Iron Longsword Complete!</li></ol><h3 id="-por-qu-queremos-c-digo-as-ncrono"><strong>¿Por qué queremos código asíncrono?</strong></h3><p>Intentamos mantener la mayoría de nuestro código síncrono porque es mas fácil de entender, y por lo tanto frecuentemente tiene menos errores. pero a veces <em>necesitamos </em>que nuestro código sea asíncrono.</p><p>Por ejemplo, cada vez que actualices tus opciones de usuario en un sitio web, tu navegador necesitará comunicar esas nuevas opciones al servidor. El tiempo que toma tu solicitud de HTTP para que viaje físicamente a través de todo el cableado del internet es usualmente cerca de los 100 milisegundos. Sería una experiencia muy pobre si tu sitio web se fuera a congelar mientras esperas que la solicitud de red finalice. ¡Inclusive no serías capaz de mover el mouse mientras esperas!</p><p>Haciendo solicitudes de red <em>de manera asíncrona</em>, le permitimos a la página web que ejecute otro código mientras espera la respuesta HTTP que regrese. Esto mantiene a la experiencia de usuario ágil y amigable.</p><p>Como regla general, solamente deberíamos usar código asíncrono cuando lo necesitamos por razones de rendimiento. Código síncrono es mas sencillo.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://i.imgur.com/03FFGu0.png" class="kg-image" alt="03FFGu0" width="587" height="335" loading="lazy"></figure><h3 id="promesas-en-javascript"><strong>Promesas en JavaScript</strong></h3><p>Una Promesa en JavaScript es muy similar a hacer una promesa en el mundo real. Cuando hacemos una promesa, estamos haciendo un compromiso para algo.</p><p>Por ejemplo, <em>Te prometo explicarte las promesas de JavaScript</em>. Mi promesa para ti tiene dos salidas potenciales: o está concluida, lo que significa que eventualmente te expliqué las promesas, o está rechazada, lo que significa que fallé en mantener mi promesa y no te expliqué las promesas.</p><p>El <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise">Objeto Promesa</a> representa la eventual conclusión o rechazo de nuestra promesa y mantiene los valores resultantes. Por el momento, mientras esperamos que la promesa se cumpla, nuestro código continúa ejecutándose.</p><p>Las promesas son la forma moderna más popular para escribir código asíncrono en JavaScript. </p><h3 id="c-mo-declarar-una-promesa"><strong>Cómo declarar una Promesa</strong></h3><p>Aquí hay un ejemplo de una promesa que resolverá y devolverá la cadena "resuelto!" o rechazara y regresará la cadena "rechazado!" después de 1 segundo.</p><pre><code class="language-javascript">const promise = new Promise((resolve, reject) =&gt; {
  setTimeout(() =&gt; {
    if (getRandomBool()) {
      resolve("resuelto!")
    } else {
      reject("rechazado!")
    }
  }, 1000)
})

function getRandomBool(){
  return Math.random() &lt; .5
}</code></pre><h3 id="c-mo-usar-una-promesa"><strong>Cómo usar una Promesa</strong></h3><p>Ahora que hemos creado una promesa, ¿cómo lo usamos?</p><p>El objeto <code>Promise</code> tiene .then y .catch lo cual hace más fácil el trabajo. Imagínate a <code>.then</code> como el seguimiento <em>esperado</em> a una promesa, y <code>.catch</code> como el seguimiento "algo estuvo mal".</p><p>Si una promesa <em>resuelve, </em>su función <code>.then</code> se ejecutará. Si la promesa rechaza, su método <code>.catch</code> se ejecutará.</p><p>Aquí hay un ejemplo de usar <code>.then</code> y <code>.catch</code> con la promesa que hicimos arriba:</p><pre><code class="language-js">promise.then((message) =&gt; {
    console.log(`La promesa ${message} finalmente`)
}).catch((message) =&gt; {
    console.log(`La promesa ${message} finalmente`)
})

// imprime:
// La promesa se resolvio finalmente!
// o
// la promesa se rechazo finalmente!</code></pre><h3 id="-por-qu-las-promesas-son-tiles"><strong>¿Por qué las Promesas son útiles?</strong></h3><p>Las Promesas son la forma mas limpia (pero no la única) para manejar el escenario común donde necesitamos realizar solicitudes a un servidor, que es típicamente hecho por medio de una solicitud HTTP. De hecho, la función <a href="https://developer.mozilla.org/es/docs/Web/API/Fetch_API">fetch()</a> que estuvimos usando anteriormente en el curso, ¡devuelve una promesa!</p><h3 id="i-o-o-input-output"><strong>I/O, o "input/output"</strong></h3><p>Casi cada vez que usas una promesa en JavaScript será para manejar algo de I/O. I/O, o input/output, se refiere a cuando nuestro código necesita interactuar con sistema fuera (relativamente) del sencillo mundo de las variables y funciones locales.</p><p>Ejemplos comunes de I/O incluyen:</p><ul><li>Solicitudes HTTP</li><li>Leer archivos desde el disco duro</li><li>Interactuar con un dispositivo Bluetooth</li></ul><p>Las Promesas nos ayudan realizar I/O sin forzar a todo nuestro programa que se congele mientras esperamos una respuesta.</p><h3 id="las-promesas-y-la-palabra-clave-await"><strong>Las Promesas y la palabra clave "await"</strong></h3><p>Hemos usado la palabra clave <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Operators/await">await</a> unas pocas veces en este curso, así que es tiempo que finalmente entendamos que está pasando por debajo.</p><p>La palabra clave <code>await</code> se usa para <em>esperar a </em>una promesa que se resuelva. Una vez que se ha resuelto, la expresión <code>await</code> devuelve el valor de la <code>Promise</code> resuelta. &nbsp;</p><h3 id="ejemplo-con-el-callback-then"><strong>Ejemplo con el callback .then</strong></h3><pre><code class="language-js">promise.then((message) =&gt; {
  console.log(`Resuelto con ${message}`)
}).</code></pre><h3 id="ejemplo-de-una-promesa-con-await"><strong>Ejemplo de una promesa con await</strong></h3><pre><code class="language-js">const message = await promise
console.log(`Resuelto con ${message}`)</code></pre><h3 id="la-palabra-clave-async"><strong>La palabra clave async</strong></h3><p>Ya que la palabra clave <code>await</code> puede ser usado en lugar de <code>.then()</code> para <em>resolver </em>una promesa, la palabra clave <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/async_function">async</a> puede ser usado en lugar de <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise">new promise()</a> para <em>crear </em>una nueva promesa.</p><p>Cuando una función es prefijado con la palabra clave <code>async</code>, <em>automáticamente </em>devuelve una promesa. Esa promesa resuelve con el valor que código devuelve desde la función. Puedes imaginarte a <code>async</code> como que "envuelve" tu función dentro de una promesa.</p><p>Estos son equivalentes:</p><h3 id="new-promise-"><strong>new Promise()</strong></h3><pre><code class="language-js">function getPromiseForUserData(){
  return new Promise((resolve) =&gt; {
    fetchDataFromServerAsync().then(function(user){
      resolve(user)
    })
  })
}

const promise = getPromiseForUserData()</code></pre><h3 id="async"><strong>Async</strong></h3><pre><code class="language-js">async function getPromiseForUserData(){
  const user = await fetchDataFromServer()
  return user
}

const promise = getPromiseForUserData()</code></pre><h3 id="-then-vs-await"><strong>.then() vs await</strong></h3><p>En los primeros días de los navegadores web, las promesas y la palabra clave <code>await</code> no existían, así que la única forma de hacer algo de manera asíncrona era usar los callbacks.</p><p>Una "función callback" es una función que le pasas a otra función. Esa función luego llama a tu callback. La función <a href="https://developer.mozilla.org/es/docs/Web/API/setTimeout">setTimeout</a> que hemos usado atrás es un buen ejemplo.</p><pre><code class="language-js">function callbackFunction(){
  console.log("calling back now!")
}
const milliseconds = 1000
setTimeout(callbackFunction, milliseconds)</code></pre><p>Mientras que inclusive la sintaxis <code>.then()</code> es generalmente más fácil de usar que los callbacks sin la API <code>Promise</code>, la sintaxis <code>await</code> los hace aun mas fácil de usar. Deberías usar <code>async</code> y <code>await</code> en vez de <code>.then</code> y <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise">new Promise()</a> como regla general.</p><p>Para demostrar, ¿cuáles de estos es más fácil de entender?</p><pre><code class="language-js">fetchUser.then(function(user){
  return fetchLocationForUser(user)
}).then(function(location){
  return fetchServerForLocation(location)
}).then(function(server){
  console.log(`El servidor es ${server}`)
});</code></pre><pre><code class="language-js">const user = await fetchUser()
const location = await fetchLocationForUser(user)
const server = await fetchServerForLocation(location)
console.log(`El servidor es ${server}`)</code></pre><p>Ambos hacen la misma cosa, pero el ejemplo segundo es, ¡mucho mas fácil de entender! Las palabras claves <code>async</code> y <code>await</code> no fueron lanzados sino hasta <em>después</em> de la API <code>.then</code>, lo cual es la razón de por que hay todavía mucho código <code>.then</code> obsoleto por ahí afuera.</p><!--kg-card-begin: html--><h2 id="error-handling">Manejo de Errores</h2><!--kg-card-end: html--><p>Cuando algo sale mal mientras un programa se ejecuta, JavaScript usa el paradigma <code>try/catch</code> para manejar esos errores. Try/catch es bastante común, y <a href="https://boot.dev/learn/learn-python">Python</a> usa un mecanismo similar.</p><h3 id="primero-se-lanza-un-error"><strong>Primero, se lanza un error</strong></h3><p>Por ejemplo, digamos que intentamos acceder a un propiedad de una variable no definida. JavaScript automáticamente "lanzará" un error.</p><pre><code class="language-js">const speed = car.speed
// El codigo se rompe con el siguiente error:
// "ReferenceError: car no está definido"</code></pre><h3 id="intentando-y-capturando-errores"><strong>Intentando y capturando errores</strong></h3><p>Al envolver ese código en un bloque try/catch, podemos manejar el caso donde <code>car</code> todavía no es definido.</p><pre><code class="language-js">try {
  const speed = car.speed
} catch (err) {
  console.log(`Un error se disparó: ${err}`)
  // el codigo imprime de forma clara:
  // "Un error se disparó: ReferenceError: car no está definido"
}</code></pre><h3 id="bugs-vs-errores"><strong>Bugs vs Errores</strong></h3><p>Manejar errores por medio de try/catch no es lo mismo que depurar. Igualmente, los errores no son lo mismo que los bugs.</p><ul><li>Un buen código sin bugs todavía puede producir errores que son manejados de manera cuidadosa</li><li>Los Bugs son, por definición, pedazitos de código que no están funcionando como se esperaba</li></ul><h3 id="-qu-es-depurar"><strong>¿Qué es Depurar?</strong></h3><p>"Depurar" un programa es el proceso de revisar tu código para encontrar donde no se está comportando como se espera. Depurar es un proceso manual realizado por el desarrollador.</p><p>Ejemplos de depuración:</p><ul><li>Agregar un parámetro faltante a una llamada de función</li><li>Actualizar un URL roto el cual una llamada HTTP estaba intentando de alcanzar</li><li>Arreglar un componente selector de fechas en una aplicación que no se estaba mostrando apropiadamente</li></ul><h3 id="-qu-es-el-manejo-de-errores"><strong>¿Qué es el Manejo de Errores?</strong></h3><p>"Manejo de errores" es código que puede manejar casos específicos <em>esperados</em> en tu programa. El Manejo de Errores es un proceso automatizado que diseñamos en nuestro código de producción para protegerlo de cosas como conexiones de internet débiles, mala entrada de usuario, o bugs en el código de otras personas con los que tenemos que interactuar.</p><p>Ejemplos de manejos de errores:</p><ul><li>Usando un bloque try/catch para detectar un problema con entradas de usuario</li><li>Usando un bloque try/catch para que falle de manera segura cuando no hay una conexión de internet disponible</li></ul><h3 id="brevemente-no-uses-try-catch-para-intentar-manejar-bugs"><strong>Brevemente, no uses try/catch para intentar manejar bugs</strong></h3><p>Si tu código tiene un bug, try/catch no te ayudará. Necesitas ir a encontrar el <a href="https://es.wikipedia.org/wiki/Error_de_software">bug</a> y arreglarlo.</p><p>Si algo que está fuera de tu control puede producir problemas en tu código, deberías usar try/catch u otra lógica de manejo de errores para tratarlo.</p><p>Por ejemplo, podría haber un mensaje en un juego para los usuarios para que se escriba un nuevo nombre de personaje, pero no queremos que usen puntuación. Validar sus entradas y mostrar un mensaje de error si algo está mal sería una forma de "manejar errores".</p><h3 id="async-await-hace-el-manejo-de-errores-mas-f-cil"><strong>async/await hace el manejo de errores mas fácil</strong></h3><p><code>try</code> y <code>catch</code> son la forma estándar de manejar errores en Javascript, el problema es, que la API Promise original con <code>.then</code> no nos permitió hacer uso de los bloques <code>try</code> y <code>catch</code>.</p><p>Afortunadamente, las palabras claves <code>async</code> y <code>await</code> <em>sí</em> lo permite - aún otra razón para elegir la nueva sintaxis.</p><h3 id="el-callback-catch-en-las-promesas"><strong>El callback .catch() en las promesas</strong></h3><p>El método <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch">.catch()</a> funciona de manera similar al método .then(), pero se dispara cuando un promesa es <em>rechazada </em>en vez de resuelta. </p><h3 id="ejemplo-con-los-callbacks-then-y-catch"><strong>Ejemplo con los callbacks .then y .catch</strong></h3><pre><code class="language-js">fetchUser().then(function(user){
  console.log(`usuario buscado: ${user}`)
}).catch(function(err){
  console.log(`un error fue disparado: ${err}`)
});</code></pre><h3 id="ejemplo-de-una-promesa-con-await-1"><strong>Ejemplo de una promesa con await</strong></h3><pre><code class="language-js">try {
  const user = await fetchUser()
  console.log(`usuario buscado: ${user}`)
} catch (err) {
  console.log(`un error fue disparado: ${err}`)
}</code></pre><p>Como puedes ver, la versión <code>async/await</code> se parece como un <code>try/catch</code> normal de JavaScript.</p><!--kg-card-begin: html--><h2 id="http-headers">Cabeceras de HTTP</h2><!--kg-card-end: html--><p>Una <a href="https://developer.mozilla.org/en-US/docs/Glossary/HTTP_header">cabecera de HTTP</a> permite a los clientes y servidor que pasen información <em>adicional</em> con cada solicitud o respuesta. Las cabeceras son <a href="https://en.wikipedia.org/wiki/Name%E2%80%93value_pair">pares de clave-valor</a> que no distinguen entre mayúsculas y minúsculas que pasan <a href="https://es.wikipedia.org/wiki/Metadatos">metadatos</a> adicionales sobre la solicitud o respuesta.</p><p>Las solicitudes HTTP de un navegador web llevan consigo muchas cabeceras, incluyendo pero no limitado a:</p><ul><li>El tipo de cliente (por ejemplo Google Chrome)</li><li>El Sistema Operativo (por ejemplo Windows)</li><li>El idioma preferido (por ejemplo Inglés US)</li></ul><p>Como desarrolladores, también podemos definir cabeceras personalizadas en cada solicitud.</p><h3 id="la-api-headers"><strong>La API Headers</strong></h3><p>La API <a href="https://developer.mozilla.org/es/docs/Web/API/Headers">Headers</a> nos permite realizar varias acciones en nuestras cabeceras de solicitud y de respuesta tales como devolverlos, establecerlos, y removerlos. Podemos acceder a las cabeceras del objeto a través de las propiedades <code>Request.headers</code> y <code>Response.headers</code>.</p><h3 id="c-mo-usar-las-herramientas-de-desarrollo-del-navegador"><strong>Cómo usar las Herramientas de Desarrollo del Navegador</strong></h3><p>Los navegadores web modernos le ofrecen a los desarrolladores un conjunto poderoso de <em>herramientas de desarrollado</em>. Las Herramientas de Desarrollo son el mejor amigo de los desarrolladores web front-end. Por ejemplo, usando las herramientas de desarrollo puedes:</p><ul><li>Ver la salida en consola de JavaScript de la página web</li><li>Inspeccionar el código HTML, CSS y JavaScript de la página</li><li>Ver solicitudes red y respuestas, juntamente con sus cabeceras</li></ul><p>El método para acceder las herramientas de desarrollo de navegador a navegador. Si estás en Chrome, puedes hacer clic derecho en cualquier parte dentro de una página web y hacer clic en la opción "inspect". Sigue este enlace para mas información en <a href="https://developer.mozilla.org/es/docs/Learn/Common_questions/Tools_and_setup/What_are_browser_developer_tools">cómo acceder a las herramientas de desarrollo</a>.</p><h3 id="la-pesta-a-red"><strong>La pestaña red</strong></h3><p>Mientras todas las pestañas dentro de las herramientas de desarrollo son muy útiles, nos estaremos enfocando en la <em>pestaña de Red</em> en este capitulo así podemos jugar con las cabeceras de HTTP.</p><p>La pestaña Red monitorea la actividad de red del navegador y registrar todas las solicitudes y respuestas que el navegador hace, incluyendo cuanto tiempo toma cada una de esas solicitudes y respuestas para que se procese completamente.</p><p>Si navegas a la pestaña Red y no ves ninguna solicitud aparecer, intenta refrescar la pagina.</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/STKdceG.png" class="kg-image" alt="STKdceG" width="580" height="372" loading="lazy"></figure><h3 id="-por-qu-las-cabeceras-son-tiles"><strong>¿Por qué las cabeceras son útiles?</strong></h3><p>Las cabeceras son útiles por varias razones, desde el diseño a la seguridad. Pero mas frecuentemente las cabeceras son usadas como <a href="https://es.wikipedia.org/wiki/Metadatos">metadatos</a> o datos <em>sobre </em>la solicitud.</p><p>Así que, por ejemplo, digamos que queríamos pedir un nivel de jugador de un servidor de juegos. Necesitamos enviar el ID del jugador al servidor de esa forma sabe de qué jugador devuelve la información. Ese ID <em>es mi solicitud</em>, no es información <em>sobre mi solicitud.</em> </p><p>Un buen ejemplo de un caso de uso para las cabeceras es <a href="https://auth0.com/es/intro-to-iam/what-is-authentication">autenticación</a>. Con frecuencia las credenciales de un usuario son incluidas en las cabeceras de solicitud. Las credenciales no tienen que ver mucho con la solicitud <em>en sí misma,</em> sino simplemente autoriza al solicitador ser admitido de hacer la solicitud en cuestión.</p><!--kg-card-begin: html--><h2 id="what-is-json">¿Qué es JSON?</h2><!--kg-card-end: html--><p>Notación de Objeto de JavaScript, o <a href="https://developer.mozilla.org/es/docs/Learn/JavaScript/Objects/JSON">JSON</a>, es un estándar para representar datos <em>estructurados</em> basado en la sintaxis de objetos de JavaScript.</p><p>JSON es comúnmente usado para transmitir datos en aplicaciones web usando HTTP. Las solicitudes HTTP con <code>fetch()</code> que estuvimos usando en este curso han estado devolviendo datos como JSON.</p><h3 id="sintaxis-de-json"><strong>Sintaxis de JSON </strong></h3><p>Porque ya entendimos cómo lucen los objetos de JavaScript, entender JSON es fácil. JSON es solo un objeto de JavaScript en cadenas. Lo siguiente son datos en JSON válidos:</p><pre><code class="language-json">{
    "movies": [
        {
            "id": 1,
            "genre": "Action",
            "title": "Iron Man",
            "director": "Jon Favreau"
        },
        {
            "id": 2,
            "genre": "Action",
            "title": "The Avengers",
            "director": "Joss Whedon"
        }
    ]
}</code></pre><h3 id="c-mo-convertir-respuestas-http-a-json"><strong>Cómo convertir Respuestas HTTP a JSON</strong></h3><p>JavaScript nos provee algunas herramientas fáciles para ayudarnos a trabajar con JSON. Después de hacer una solicitud HTTP con la <a href="https://developer.mozilla.org/es/docs/Web/API/Fetch_API">API fetch()</a>, obtenemos un <a href="https://developer.mozilla.org/es/docs/Web/API/Response">objeto Response</a>. Ese objeto respuesta nos ofrece algunos métodos que nos ayudan en interactuar con la respuesta.</p><p>Un método como tal es el método .json(). El método <code>.json()</code> toma el <a href="https://es.wikipedia.org/wiki/Streaming">stream</a> respuesta devuelto por una solicitud con fetch y devuelve una <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise">Promesa</a> que se convierte en un objeto JavaScript desde el cuerpo JSON de la respuesta HTTP.</p><pre><code class="language-js">const resp = await fetch(...)
const javascriptObjectResponse = await resp.json()</code></pre><p>Es importante notar que el resultado del método <code>.json()</code> <em>NO</em> es JSON. Es el resultado de tomar datos JSON desde el cuerpo de la respuesta HTTP y convertir la entrada en un Objeto JavaScript.</p><h3 id="revisi-n-de-json"><strong>Revisión de JSON</strong></h3><p>JSON es una <em>representación en cadena</em> de un objeto JavaScript, lo cual lo hace perfecto para guardar en un archivo o enviarlo en una solicitud HTTP.</p><p>Recuerda, un objeto JavaScript es algo que existe solamente dentro de tus variables del programa. Si queremos enviar un objeto fuera de nuestro programa, por ejemplo, a través de internet en una solicitud HTTP, necesitamos convertirlo a JSON primero.</p><h3 id="no-es-usado-solo-en-javascript"><strong>No es usado solo en JavaScript</strong></h3><p>Solo porque JSON significa Notación de Objeto de <em>JavaScript</em> no significa que ¡solamente es usado por JavaScript! JSON es un estándar común que es reconocido y soportado por todos los lenguajes principales de programación.</p><p>Por ejemplo, aunque la API back-end de Boot.dev está escrito en <a href="https://www.boot.dev/learn/learn-golang">Go</a>, todavía usamos <a href="https://blog.boot.dev/golang/json-golang/">JSON</a> como el formato de comunicación entre el front-end y el back-end.</p><p>A propósito, este curso ha tratado sobre interactuar con servidores back-end desde una perspectiva de front-end. Pero si estás interesado sobre cómo te puedes convertir en un ingeniero back-end, <a href="https://blog.boot.dev/backend/become-backend-developer/">mira esta guía que he preparado</a>. Como referencia, le toma a la mayoría de gente <a href="https://blog.boot.dev/backend/how-long-to-become-backend-dev/">entre 6-18 meses</a> para aprender lo suficiente para tener su primer <a href="https://blog.boot.dev/backend/backend-job-description/">trabajo de back-end</a>.</p><h3 id="casos-de-uso-de-json-comunes"><strong>Casos de uso de JSON Comunes</strong></h3><ul><li>En solicitudes HTTP y cuerpos de respuesta</li><li>Como formatos para archivos de texto. Archivos <code>.json</code> son usados frecuentemente como archivos de configuración</li><li>En bases de datos NoSQL como MongoDB, ElasticSearch, y Firestore</li></ul><h3 id="c-mo-pronunciar-json"><strong>Cómo pronunciar JSON</strong></h3><p>Lo pronuncio "Yey-sawn", pero también he oído a la gente pronunciarlo "Yason", justo como su nombre.</p><h3 id="c-mo-enviar-json"><strong>Cómo enviar JSON</strong></h3><p>JSON no es algo que obtenemos del servidor, también podemos <em>enviar</em> datos JSON.</p><p>En JavaScript, dos de los métodos principales a los que tenemos acceso son <code>JSON.parse()</code>, y <code>JSON.stringify()</code>.</p><h4 id="json-stringify-"><strong><code>JSON.stringify()</code></strong></h4><p><code>JSON.stringify()</code> es útil particularmente <em>para</em> enviar JSON.</p><p>Como podrías esperar, el método <code>stringify()</code> de JSON hace lo opuesto de convertir. Toma un objeto JavaScript o un valor como entrada y lo convierte en una cadena. Esto es útil cuando necesitamos serializar los objetos en cadenas para enviarlos a nuestro servidor o almacenarlos en una base de datos.</p><p>Aquí hay un fragmento de código que envía una <a href="https://es.wikipedia.org/wiki/Carga_%C3%BAtil_(inform%C3%A1tica)">carga útil</a> (payload en inglés) JSON a un servidor remoto:</p><pre><code class="language-javascript">async function sendPayload(data, headers) {
  const response = await fetch(url, {
    method: 'POST',
    mode: 'cors',
    headers: headers,
    body: JSON.stringify(data)
  })
  return response.json()
}
</code></pre><h3 id="c-mo-convertir-json"><strong>Cómo convertir JSON</strong></h3><p>El método <a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse">JSON.parse()</a> toma una cadena JSON como entrada y construye el valor/objeto JavaScript descrito por la cadena. Esto nos permite trabajar con el JSON como si fuese un objeto JavaScript normal.</p><p>Viendo que los objetos JSON tienen una estructura tipo árbol, puede ser útil para saber cómo <a href="https://blog.boot.dev/javascript/how-to-recursively-traverse-objects/">recorrerlos recursivamente</a> si es necesario.</p><pre><code class="language-js">const json = '{"title": "Avengers Endgame", "Rating":4.7, "inTheaters":false}';
const obj = JSON.parse(json)

console.log(obj.title)
// Avengers Endgame</code></pre><h3 id="xml"><strong>XML</strong></h3><p>No podemos hablar sobre JSON sin mencionar a <a href="https://es.wikipedia.org/wiki/Extensible_Markup_Language">XML</a>. Lenguaje de Marcado Extensible, o <code>XML</code> es un formato basado en texto para representar información estructurada, así como JSON - solo que se ve un poco distinto.</p><p>XML es un lenguaje de marcado como <a href="https://es.wikipedia.org/wiki/HTML">HTML</a>, pero es mas generalizado en el hecho de que <em>no</em> usa etiquetas predefinidas. Así como las claves de objetos JSON puede ser llamados de cualquier forma, las etiquetas XML también pueden tener cualquier nombre.</p><pre><code class="language-xml">&lt;root&gt;
  &lt;id&gt;1&lt;/id&gt;
  &lt;genre&gt;Action&lt;/genre&gt;
  &lt;title&gt;Iron Man&lt;/title&gt;
  &lt;director&gt;Jon Favreau&lt;/director&gt;
&lt;/root&gt;</code></pre><p>Los mismos datos en formato JSON:</p><pre><code class="language-json">{
  "id": "1",
  "genre": "Action",
  "title": "Iron Man",
  "director": "Jon Favreau"
}</code></pre><h3 id="-por-qu-usar-xml"><strong>¿Por qué usar XML?</strong></h3><p>XML y JSON ambos logran tareas similares, así que, ¿cuál deberías usar?</p><p>XML solía ser usado para las mismas cosas que JSON hoy en día es usado. Archivos de configuración, cuerpos HTTP, y otros casos de uso de transferencia de datos pueden funcionar sin problemas usando JSON o XML. Este es mi consejo: hablando de forma general, si JSON funciona, deberías preferirlo por sobre XML en estos días. JSON es mas liviano, mas fácil de leer, y tiene mejor soporte en la mayoría de lenguajes de programación modernos.</p><p>Hay algunos casos donde XML podría ser lo mejor, o tal vez inclusive la opción necesaria, pero esos casos serán raros.</p><!--kg-card-begin: html--><h2 id="http-methods">Métodos HTTP</h2><!--kg-card-end: html--><p>HTTP define un conjunto de <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Methods">métodos</a> que usamos cada vez que hacemos una solicitud. Hemos usado algunos de estos métodos en ejercicios previos, pero es tiempo de profundizarlos para entender las diferencias y casos de uso que hay por detrás de los distintos métodos.</p><h3 id="el-m-todo-get"><strong>El método GET</strong></h3><p>El <a href="https://www.freecodecamp.org/news/javascript-get-request-tutorial/">método GET</a> se usa para "obtener" una representación de un recurso especificado. No estás quitando los datos del servidor, sino que obtienes una representación, o copia, del recurso en su estado actual.</p><p>Una solicitud get es considerado un método <a href="https://developer.mozilla.org/en-US/docs/Glossary/Safe/HTTP">seguro</a> para llamar mútiples veces porque no altera el estado del servidor.</p><h3 id="como-hacer-una-solicitud-get-usando-la-api-fetch"><strong>Como hacer una Solicitud GET usando la API Fetch</strong></h3><p>El método fetch() acepta un parámetro objeto <code>init</code> opcional como su segundo argumento que podemos usar para definir cosas como:</p><ul><li><code>method</code>: El método HTTP de la solicitud, como <code>GET</code></li><li><code>headers</code>: Las cabeceras para enviar</li><li><code>mode</code>: Usado para seguridad, hablaremos sobre esto en cursos futuros</li><li><code>body</code>: El cuerpo de la solicitud. Frecuentemente codificado como JSON</li></ul><p>Ejemplo de una solicitud <code>GET</code> usando fetch:</p><pre><code class="language-js">await fetch(url, {
  method: 'GET',
  mode: 'cors',
  headers: {
    'sec-ch-ua-platform': 'macOS'
  }
})</code></pre><h3 id="-por-qu-usamos-m-todos-http"><strong>¿Por qué usamos métodos HTTP?</strong></h3><p>Como mencionamos antes, el propósito primario de los métodos HTTP es indicar al servidor lo que queremos hacer con el recurso que intentamos interactuar.</p><p>Al final del día, un método HTTP es solo una cadena, como <code>GET</code>, <code>POST</code>, <code>PUT</code>, o <code>DELETE</code>. Pero por <em>convención,</em> los desarrolladores back-end casi siempre escribe su código de servidor de manera que los métodos corresponden con diferentes acciones "CRUD".</p><p>Las acciones "CRUD" son:</p><ul><li>Create (Crear)</li><li>Read (Leer)</li><li>Update (Actualizar)</li><li>Delete (Eliminar)</li></ul><p>La mayor parte de la lógica en la mayoría de las aplicaciones web es la lógica "CRUD". La interfaz web permite a los usuarios crear, leer, actualizar y eliminar varios recursos.</p><p>Imagínate un sitio de red social - los usuarios básicamente crean, leen, actualizan y eliminar sus post sociales. También están creando, leyendo, actualizando y eliminando sus cuentos de usuario. ¡Es CRUD hasta el final!</p><p>Como sucede, los 4 métodos HTTP mas comunes se mapean muy bien a las acciones CRUD:</p><ul><li><code>POST</code> = crear</li><li><code>GET</code> = leer</li><li><code>PUT</code> = actualizar</li><li><code>DELETE</code> = eliminar</li></ul><h3 id="solicitudes-post"><strong>Solicitudes POST</strong></h3><p>Una <a href="https://www.freecodecamp.org/news/javascript-post-request-how-to-send-an-http-post-request-in-js/">solicitud POST HTTP</a> envía datos a un servidor, típicamente para crear un nuevo recurso. El <code>body</code> de la solicitud es el <em>payload </em>que está siendo enviado al servidor con la solicitud. Su tipo es indicado por la cabecera <code>Content-Type</code>.</p><h3 id="c-mo-agregar-un-body"><strong>Cómo agregar un </strong><code><strong>body</strong></code></h3><p>El <code>body</code> de la solicitud es el <em>payload</em> que está siendo enviado al servidor con la solicitud. Su tipo es indicado por la cabecera <code>Content-Type</code> - para nosotros, eso va a ser JSON.</p><p>Las solicitudes <code>POST</code> <em>no </em>son generalmente seguros para llamar múltiples veces, porque altera el estado del servidor. No querrías crear accidentalmente 2 cuentas para el mismo usuario, por ejemplo. </p><pre><code class="language-js">await fetch(url, {
  method: 'POST',
  mode: 'cors',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify(data)
})</code></pre><h3 id="c-digos-de-estado-http"><strong>Códigos de Estado HTTP</strong></h3><p>Ahora que entendemos cómo escribir solicitudes HTTP desde cero, necesitamos aprender cómo asegurar que el servidor está haciendo lo que queremos.</p><p>Anteriormente en el curso, aprendimos cómo acceder a las <em>herramientas de desarrollo</em> del navegador y usar esas herramientas para inspeccionar las solicitudes HTTP. Podemos usar el mismo proceso para verificar las solicitudes que estamos haciendo y verificar lo que están haciendo así podemos abarcar problemas potenciales.</p><p>Cuando se mira a las solicitudes, podemos ver el <code>Código de Estado</code> de la solicitud para obtener alguna información si la solicitud fue exitosa o no.</p><ul><li><code>100-199</code>: Respuestas informativas. Estos son muy raros</li><li><code>200-299</code>: Respuestas exitosas. Con suerte, ¡la mayoría de las respuestas son 200's!</li><li><code>300-399</code>: Mensajes de redirección. Estos sin típicamente invisibles porque el navegador o el cliente HTTP automáticamente hará la redirección</li><li><code>400-499</code>: Errores de cliente. Verás a estos frecuentemente, especialmente cuando intentes depurar una aplicación cliente</li><li><code>500-599</code>: Errores de servidor. Verás a estos a veces, usualmente solo si hay un error en el servidor</li></ul><p>Aquí hay algunos de los códigos de estado mas comunes, pero puedes ver una <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Status">lista completa aquí</a> si estás interesado.</p><ul><li><code>200</code> - OK. Este es de lejos el código mas común, significa que todo funcionó como se esperaba.</li><li><code>201</code> - Creado. Esto significa que un recurso fue creado exitosamente. Típicamente en respuesta a una solicitud <code>POST</code>.</li><li><code>301</code> - Movido permanentemente. Esto significa que el recurso fue movido a un nuevo lugar, y la respuesta incluirá donde se encuentra ese nuevo lugar. Los sitios web frecuentemente usan redirecciones <code>301</code> cuando cambian su nombre de domino, por ejemplo.</li><li><code>400</code> - Mala solicitud. Un error general indicando al cliente que cometió un error en la solicitud.</li><li><code>403</code> - No autorizado. Esto significa que el cliente no tiene los permisos correctos. Tal vez no incluyeron una cabecera de autorización requerida, por ejemplo.</li><li><code>404</code> - No encontrado. Verás esto en sitios web con bastante frecuencia. Significa que el recurso no existe.</li><li><code>500</code> - Error de servidor Interno. Esto significa que algo estuvo mal en el servidor, posiblemente un error en su final.</li></ul><h3 id="no-necesitas-memorizarlos"><strong>No necesitas memorizarlos</strong></h3><p>Necesitas saber lo básico, como "2XX está bien", "4XX es un error de cliente", y "5XX es un error de servidor". Con eso dicho, no necesitas memorizar todos los códigos, son fáciles de buscar.</p><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/FJl2z9O.jpg" class="kg-image" alt="FJl2z9O" width="549" height="454" loading="lazy"></figure><p>¡Miremos algunos códigos de estado!</p><p>La propiedad <code>.status</code> en un objeto Response te dará el código. Aquí hay un ejemplo:</p><pre><code class="language-js">async function getStatusCode(url, headers) {
  const response = await fetch(url, {
    method: 'GET',
    mode: 'cors',
    headers: headers
  })
  return response.status
}</code></pre><h3 id="m-todo-put"><strong>Método PUT</strong></h3><p>El <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Methods/PUT">método PUT HTTP</a> crea un nuevo recurso o reemplaza una representación del recurso objetivo con los contenidos del <code>body</code> de la solicitud. En corto, actualiza la propiedad de una solicitud.</p><pre><code class="language-js">await fetch(url, {
   method: 'PUT',
   mode: 'cors',
   headers: {
   'Content-Type': 'application/json'
   },
   body: JSON.stringify(data)
})</code></pre><h3 id="post-vs-put"><strong>POST vs PUT</strong></h3><p>Tal vez estás pensando que <code>PUT</code> es similar a <code>POST</code> o <code>PATCH</code>, y francamente, tendrías razón. La principal diferencia es que PUT está destinado a ser <a href="https://developer.mozilla.org/en-US/docs/Glossary/Idempotent">idempotente</a>, significa que múltiples solicitudes PUT idénticos deberían tener el mismo efecto en el servidor.</p><p>En contraste, varias solicitudes <code>POST</code> idénticas tendrían efectos secundarios adicionales, tales como crear múltiples copias del recurso.</p><h3 id="patch-vs-put-http"><strong>Patch vs PUT HTTP </strong></h3><p>Podrías encontrarte con los métodos <a href="https://developer.mozilla.org/es/docs/Web/HTTP/Methods/PATCH">PATCH</a> de vez en cuando. Si bien no es tan común como los otros métodos, como <code>PUT</code>, es importante conocerlo y saber qué hace. El método <code>PATCH</code> pretende modificar <em>parcialmente</em> un recurso.</p><p>Larga historia corta, <code>PATCH</code> no es tan popular como <code>PUT</code>, y muchos servidores, inclusive si permiten actualizaciones parciales, aún usará el método <code>PUT</code> para eso. </p><h3 id="http-delete"><strong>HTTP Delete </strong></h3><p>El método <code>DELETE</code> hace exactamente lo que esperarías: es usado convencionalmente eliminar un recurso especificado.</p><pre><code class="language-js">// Esto elimina la ubicación con ID: 52fdfc07-2182-454f-963f-5f0f9a621d72
const url = 'https://example-api.com/locations/52fdfc07-2182-454f-963f-5f0f9a621d72'

await fetch(url, {
  method: 'DELETE',
  mode: 'cors'
})</code></pre><!--kg-card-begin: html--><h2 id="url-paths-and-params">Rutas URL y Parámetros</h2><!--kg-card-end: html--><p>La Ruta URL viene justo después del dominio (o puerto si uno es provisto) en una cadena URL.</p><p>En esta URL, la rua es <code>/root/next</code>: <code>http://testdomain.com/root/next</code>.</p><h3 id="qu-significaban-las-rutas-en-el-internet-primitivo"><strong>Qué significaban las rutas en el internet primitivo</strong></h3><p>En los primeros días del internet, y a veces aún hoy en día, muchos servidores web simplemente servían archivos sin procesar desde el sistema de archivos del servidor.</p><p>Por ejemplo, si quería ser capaz de acceder algunos documentos de texto, podría comenzar un servidor web en mi directorio <code>documentos</code>. Si hacías una solicitud a mi servidor, serías capaz de acceder a distintos documentos usando la ruta que coincidía con mi estructura de archivos local.</p><p>Si tendría un archivo en mi <code>/documentos/hello.txt</code> local, podrías accederlo haciendo una solicitud <code>GET</code> a <code>http://example.com/documentos/hello.txt</code>.</p><h3 id="c-mo-son-usados-las-rutas-hoy-en-d-a"><strong>Cómo son usados las rutas hoy en día</strong></h3><p>La mayoría de los servidores web modernos no usan ese simple mapeo de <code>ruta URL</code> -&gt; <code>ruta de archivo</code>. Técnicamente, una ruta URL es solo una cadena con el que el servidor web puede hacer lo que quiera, y los sitios web modernos toman ventaja de esa flexibilidad.</p><p>Algunos ejemplos comunes de para qué se usan las rutas incluyen:</p><ul><li>La jerarquía de las páginas en un sitio web, si refleja o no una estructura de archivos del servidor</li><li>Los parámetros se pasan en una solicitud HTTP, como un ID de un recurso</li><li>La versión de la API</li><li>El tipo de recurso siendo solicitado</li></ul><h3 id="apis-restful"><strong>APIs RESTful </strong></h3><p><a href="https://developer.mozilla.org/es/docs/Glossary/REST">Transferencia de Estado Representacional, o REST</a>, es una convención popular que el servidor HTTP sigue. No todas las APIs HTTP son "APIs REST", o "RESTful", pero es <em>muy</em> común.</p><p>Los servidores RESTful siguen un conjunto de reglas flexibles que facilita construir APIs web predecibles y confiables. REST es más o menos un conjunto de convenciones sobre cómo HTTP <em>debería</em> ser usado.</p><h3 id="separado-y-agn-stico"><strong>Separado y agnóstico</strong></h3><p>La gran idea detrás de REST es que los recursos son transferidos por medio de interacciones de cliente/servidor reconocidas y agnósticas del lenguaje. </p><p>Un estilo RESTful significa que la implementación del cliente y del servidor puede ser hecho independientemente el uno del otro, siempre y cuando algunos estándares sencillos, como los nombres de los recursos disponibles, han sido establecidos.</p><h3 id="sin-estado"><strong>Sin estado</strong></h3><p>Una arquitectura RESTful es sin estado. Esto significa que el servidor no necesita saber en qué estado está el cliente, ni el cliente necesita saber en qué estado está el servidor.</p><p>Statelessness en REST es re-asegurado al interactuar con recursos en vez de comandos. Ten en mente, esto no significa que las aplicaciones son sin estado - al contrario, ¿qué significaría "actualiza un recurso" si el servidor no mantenía registro de su estado?</p><h3 id="las-rutas-en-rest"><strong>Las Rutas en REST</strong></h3><p>En una API RESTful, la última sección del <code>path</code> de un URL debería especificar cuál recurso está siendo accedido. Luego, como hablamos en la sección "métodos", dependiendo en si la solicitud es un <code>GET</code>, <code>POST</code>, <code>PUT</code> o <code>DELETE</code>, el recurso es leído, creado, actualizado, o eliminado.</p><p>Por ejemplo, en el <a href="https://pokeapi.co/">PokeAPI</a>:</p><ul><li><a href="https://pokeapi.co/api/v2/pokemon/"><code>https://pokeapi.co/api/v2/pokemon/</code></a></li><li><a href="https://pokeapi.co/api/v2/pokemon/"><code>https://pokeapi.co/api/v2/location/</code></a></li></ul><p>La primer parte de la ruta especifica que estamos interactuando con una API en vez de un sitio web. La siguiente parte especifica la versión, en este caso, versión 2, o <code>v2</code>.</p><p>Finalmente, la última parte denota qué recurso está siendo accedido, sea un <code>location</code> o <code>pokemon</code>.</p><h3 id="par-metros-de-solicitud-url"><strong>Parámetros de Solicitud URL</strong></h3><p>Los parámetros de solicitud de URL aparecen después en la estructura URL pero <em>no</em> siempre están presentes - son opcionales. Por ejemplo:</p><p><a href="https://www.google.com/search?q=boot.dev">https://www.google.com/search?q=boot.dev</a></p><p><code>q=boot.dev</code> es un parámetro de solicitud. Como las cabeceras, los parámetros de solicitud son pares <code>clave / valor</code>. En este caso, <code>q</code> es la clave y <code>boot.dev</code> es el valor.</p><h3 id="la-documentaci-n-de-un-servidor-http"><strong>La Documentación de un Servidor HTTP</strong></h3><p>Te estarás preguntando:</p><blockquote>¿Cómo se supone que memorice cómo funcionan todos estos servidores distintos???</blockquote><p>Las buenas noticias es que <em>no lo necesitas</em>. Cuando trabajas con un servidor back-end, es la responsabilidad de los desarrolladores del servidor que te provean con instrucciones, o <em>documentación</em> que explica cómo interactuar con él. </p><p>Por ejemplo, la documentación debería decirte:</p><ul><li>El dominio del servidor</li><li>Los recursos con los que interactuas (rutas HTTP)</li><li>Los parámetros de solicitud soportados</li><li>Los métodos HTTP soportados</li><li>Cualquier otra cosa que necesitarás saber para trabajar con el servidor</li></ul><figure class="kg-card kg-image-card"><img src="https://i.imgur.com/GIlWhYF.jpg" class="kg-image" alt="GIlWhYF" width="500" height="553" loading="lazy"></figure><h3 id="el-servidor-tiene-control"><br><strong>El servidor tiene control</strong></h3><p>Como mencionamos antes, el servidor tiene control total sobre cómo la ruta en un URL es interpretado y usado en una solicitud. Lo mismo es para los parámetros de solicitud.</p><p>No todos los servidores soportan parámetros de solicitud para cada tipo de solicitud, depende, así que necesitarás consultar la documentación.</p><h3 id="m-ltiples-par-metros-de-solicitud"><strong>Múltiples Parámetros de Solicitud</strong></h3><p>Mencionamos que los parámetros de solicitud son pares <code>clave/valor</code> - que significa que podemos tener múltiples pares.</p><p><code>http://example.com?firstName=lane&amp;lastName=wagner</code></p><p>En el ejemplo de arriba:</p><ul><li><code>firstName</code> = <code>lane</code></li><li><code>lastName</code> = <code>wagner</code></li></ul><p>El <code>?</code> separa los parámetros de solicitud del resto del URL. El <code>&amp;</code> luego es usado para separar <em>cada par</em> de parámetros solicitud después de eso.</p><p>Por ejemplo, haz que esta solicitud que limite el número de Pokemons devuelto del PokeAPI a <code>2</code>:</p><pre><code>https://pokeapi.co/api/v2/location/?limit=2</code></pre><!--kg-card-begin: html--><h2 id="what-is-https">¿Qué es HTTPs?</h2><!--kg-card-end: html--><p>el protocolo de Transferencia de Hipertexto <em>Seguro</em> o <a href="https://www.freecodecamp.org/news/what-is-https-http-vs-https-meaning-and-how-it-works/">HTTPS</a> es una extensión del protocolo HTTP. HTTPS protege la transferencia de datos entre el cliente y el servidor <a href="https://developer.mozilla.org/es/docs/Glossary/Encryption">encriptando</a> toda la comunicación.</p><p>HTTPS permite a un cliente para que comparta información sensitiva sin peligro con el servidor a través de una solicitud HTTP, tales como información de tarjeta de crédito, contraseñas, o números de cuentas de banco.</p><p>HTTPS requiere que el cliente use <a href="https://developer.mozilla.org/en-US/docs/Glossary/SSL">SSL</a> o <a href="https://www.freecodecamp.org/news/what-is-tls-transport-layer-security-encryption-explained-in-plain-english/">TLS</a> para proteger las solicitudes y el tráfico encriptando la información en la solicitud. HTTPS es solo HTTP con seguridad extra.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://i.imgur.com/iOkQUdG.png" class="kg-image" alt="iOkQUdG" width="517" height="487" loading="lazy"><figcaption>HTTP vs HTTPS</figcaption></figure><h3 id="https-mantiene-tus-mensajes-privados-pero-no-tu-identidad"><strong>HTTPS mantiene tus mensajes privados, pero no tu identidad</strong></h3><p>No cubriremos <em>cómo</em> funciona la encriptación en este curso, pero lo haremos en próximos cursos. Por ahora, es importante notar que mientras HTTPS encripta <em>lo que estás diciendo</em>, no protege necesariamente <em>quién eres</em>. Herramientas como <a href="https://nordvpn.com/es-mx/what-is-a-vpn/">VPNs</a> son necesarios para permanecer en línea de manera anónima.</p><h3 id="https-se-asegura-que-est-s-hablando-a-la-persona-correcta-o-servidor-"><strong>HTTPS se asegura que estás hablando a la persona correcta (o servidor)</strong></h3><p>Además de encriptar la información dentro de una solicitud, HTTPS usa <a href="https://es.wikipedia.org/wiki/Firma_digital">firmas digitales</a> para probar que te estás comunicando con el servidor con el que piensas.</p><p>Si un hacker fuera a interceptar una solicitud HTTPS tocando un cable de red, no serían capaz de pretender exitosamente que son el servidor web de tu banco.</p><p>Asumiendo que un servidor soporta HTTPs, lo usas para cambiar simplemente el protocolo en tu su URL de solicitud: <code>https://boot.dev</code></p><h3 id="-quieres-poner-en-pr-ctica-lo-que-has-aprendido-con-un-proyecto"><strong>¿Quieres poner en práctica lo que has aprendido con un proyecto?</strong></h3><p>Mira esta <a href="https://www.boot.dev/learn/build-web-crawler-javascript">guía de proyecto donde construirás un web crawler en JavaScript</a> desde cero. Te hará usar la API Fetch y convirtiendo datos JSON, ¡como un pro! No necesitas construir el proyecto, pero es una excelente forma de practicar lo que has aprendido.</p><h2 id="-felicidades-en-llegar-hasta-el-final-"><strong>¡Felicidades en llegar hasta el final!</strong></h2><p>Si estás interesado en hacer las asignaciones de código interactivos y cuestionarios para este curso puedes revisar el <a href="https://www.boot.dev/learn/learn-object-oriented-programming">curso de Aprender HTTP</a> en <a href="https://boot.dev/">Boot.dev</a>.</p><p>Este curso es una parte de mi <a href="https://boot.dev/tracks/backend">trayectoria profesional desarrollador full back-end</a>, hecho de otros cursos y proyectos si te interesa verlos.</p><p>Si quieres ver otro contenido que creo relacionado al desarrollo web, mira algunos de mis enlaces abajo:</p><ul><li><a href="https://twitter.com/wagslane">Lane en Twitter</a></li><li><a href="https://youtube.com/@bootdotdev">Lane en YouTube</a></li><li><a href="https://wagslane.dev/">Sitio Personal de Lane</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es una red LAN? La Red de Area Local Explicada en un Español Sencillo ]]>
                </title>
                <description>
                    <![CDATA[ La red de área local (LAN) es nada más  una estructura para organizar y proteger las comunicaciones en red para todos los dispositivos conectados dentro de una casa u oficina. Déjame analizar eso un poco. Cuando digo, dentro de una casa u oficina, me refiero a todos los dispositivos conectados ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-una-red-lan-explicada-en-espanol/</link>
                <guid isPermaLink="false">5fd595048c7cd154bb974f67</guid>
                
                    <category>
                        <![CDATA[ Redes de Computadoras ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Hugo Avila ]]>
                </dc:creator>
                <pubDate>Wed, 16 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/server-311338_640-1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>La red de área local (LAN) es nada más &nbsp;una estructura para organizar y proteger las comunicaciones en red para todos los dispositivos conectados dentro de una casa u oficina.</p><p>Déjame analizar eso un poco. Cuando digo, <em>dentro de una casa u oficina</em>, me refiero a todos los dispositivos conectados a un enrutador, ya sea a través de una conexión física o inalámbrica. El enrutador podría ser un enrutador de punto de acceso WiFi independiente, o el modem que te dio tu proveedor de servicio de internet.</p><p>Por <em>organizar</em>, me refiero a que a cada dispositivo le es otorgada una dirección de identificación y a su vez un acceso al internet más allá de la definición de tu red de área local.</p><p>Y por <em>proteger</em>, me refiero a que, generalmente, las peticiones de tráfico direccionadas a tu dispositivo desde redes externas, serán escanadas y filtradas para ayudar a prevenir accesos no autorizados y potencialmente peligrosos.</p><p>Basado en parte en el libro <a href="https://www.amazon.com/gp/product/1617294934/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1617294934&amp;linkCode=as2&amp;tag=projemun-20&amp;linkId=1a460c0cd9a39e01821133b90632cba8">Linux in Action</a>, intentaré explicar como funciona todo esto funciona.</p><h1 id="direccionamiento-ipv4">Direccionamiento IPv4</h1><p>A continuación un ejemplo de como podría verse. El enrutador en esta imagen tiene una dirección IP publica número 183.23.100.34, con la cual, todo el tráfico de entrada y salida está asociado.</p><p>Al mismo tiempo, el enrutador opera con el servidor de Protocolo de Configuración Huesped Dinámico (DHCP), asignando una dirección de IP privada a todas las PCs, laptops, teléfonos inteligentes y servidores en la casa. Los dispositivos usarán esas direcciones cuando se comunican entre ellos.‌</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2020/12/imagen-9.png" class="kg-image" alt="imagen-9" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2020/12/imagen-9.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2020/12/imagen-9.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2020/12/imagen-9.png 1502w" sizes="(min-width: 720px) 720px" width="1502" height="901" loading="lazy"></figure><p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Topología de una red de área local típica.</p><p>Observar que todos los dispositivos locales están descritos como utilizando algo llamado "NAT IP address". NAT significa Traducción de Direcciones de Red, y es el método utilizado para organizar dispositivos dentro de una LAN privada.</p><p>Pero ¿porqué? ¿Qué hay de malo con darle a todos los dispositivos el mismo tipo de dirección IP publica que tiene el enrutador?</p><p>En un principio, estaba IPv4. Las direcciones IPv4 son números de 32-bit formados por cuatro octetos de 8-bit separados por puntos. Así se ven:</p><pre><code>192.168.1.10</code></pre><h1 id="notaci-n-de-sub-red">Notación de Sub-red</h1><p>Debido a que es críticamente importante que los sistemas estén seguros de conocer a que sub-red pertenece cierta dirección, necesitamos una notación estándar que pueda definir de forma precisa cuales octetos son parte de una red y cuales están disponibles para dispositivos.</p><p>Hay dos estandar comunmente utilizados: Rutéo Entre-Dominios Sin Clase (CIDR) y máscara de red.</p><p>Utilizando CIDR, una red podría ser representada como 192.168.1.0/24. El /24 te indica que los primeros tres octetos (8x3=24) definen la porción de red, dejando solo el cuarto octeto para direcciones de red de dispositivos. La segunda red (o sub-red), en CIDR sería descrita como 192.168.2.0/24.</p><p>Estas mismas dos redes podrían describirse por medio de una mascara de red 255.255.255.0. Esto significa que todos los 8 bits de los primeros 3 octetos son usados por la red, pero ninguno del cuarto octeto.</p><h1 id="entendiendo-las-redes-privadas">Entendiendo las Redes Privadas</h1><p>En teoría, el protocolo IPv4 permite alrededor de cuatro billones de direcciones únicas, en el rango desde 1.0.0.0 hasta 255.255.255.255.</p><p>Pero aún si todos los cuatro billones de esas direcciones estuvieran disponibles en la práctica, &nbsp;ni se acercaría a cubrir todos y cada uno de los billones de teléfonos celulares, billones de laptops y computadoras de escritorio, y billones más de vehículos conectados, accesorios, y dispositivos de Internet de las Cosas que ya se encuentran por ahí. Sin decir nada de los millones que están por venir.</p><p>Entonces, los ingenieros de red establecieron tres rangos de direcciones de red IPv4 para ser utilizadas exclusivamente en redes privadas. Los dispositivos usando cualquier dirección de estos rangos, no serán directamente alcanzables desde el internet público y no serán capaces de acceder a recursos de internet. Estos son los rangos:</p><pre><code>Entre 10.0.0.0 y 10.255.255.255
Entre 172.16.0.0 y 172.31.255.255
Entre 192.168.0.0 y 192.168.255.255</code></pre><p>¿Recuerdas que significaba la "T" de NAT?, Era "Traducción". Lo que esto significa es que un enrutador con NAT-habilitado tomará la dirección IP que la red privada utiliza para el tráfico entre la LAN y el internet y la <em>traduce</em> a la dirección pública del enrutador. El enrutador, fiel a su nombre, <em>enrutará</em> esas peticiones a los destinos apropiados.</p><p>Este simple rediseño de direccionamiento de red ahorró muchos billones de direcciones para usarse en dispositivos - como los celulares - que no eran parte de la red privada. Todos esas laptops, PCs, y otros dispositivos funcionando en esas casas y oficinas convenientemente (y sin problemas) compartirán la direcciones IP públicas de su enrutador.</p><p>¿Problema Resuelto? Bueno, no del todo. Como viste, aún y con el uso eficiente de las direcciones IPv4, no son suficiente para la explosión de dispositivos de cara a la red pública que se están poniendo en línea. Para manejar este problema, a los ingenieros de red se les ocurrió el protocolo IPv6. Así es como se ve una dirección IPv6:</p><pre><code>2002:0df6:0001:004b:0100:6c2e:0370:7234</code></pre><p>Eso se ve horrible, ¿no es verdad? Y se ve como un número mucho más grande a comparación con el ejemplo del debilucho IPv4 visto anteriormente.</p><p>Si y si. Tengo muy bien memorizadas algunas direcciones IPv4, pero pero nunca he intentado "descargar" alguno de esos monstruos.</p><p>Por alguna razón, es hexadecimal, lo que significa que utiliza números entre el 0 y el 9 y las primeras seis letras del alfabeto (a-f)! Aunado a esto, tiene ocho octetos en lugar de 4 y la dirección es de 128-bit en lugar de 32-bit.</p><p>Todo esto significa que, una vez que el protocolo esté implementado completamente, no estaremos en riesgo de que se acaben las direcciones por mucho, mucho tiempo (significando: para siempre). Y lo que so significa es que, desde la perspectiva de la distribución de direcciones, no habrá más necesidad de las redes privadas NAT.</p><p>Sin embargo, por consideraciones de seguridad, aún te conviene dar alguna protección a tus dispositivos dentro de tu LAN.</p><p>Traducido del artículo de <strong><a href="https://www.freecodecamp.org/news/author/david/">David Clinton</a> - <a href="https://www.freecodecamp.org/news/what-is-a-lan-local-area-network-explained-in-plain-english/">What is a LAN? The Local Area Network Explained in Plain Englis</a></strong></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
