No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Convierte tus certificados en títulos universitarios en USA

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

18 Días
14 Hrs
9 Min
22 Seg

Consumiendo API

21/26
Recursos

Aportes 48

Preguntas 22

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

📀 𝗖𝗹𝗮𝘀𝗲 #𝟭𝟴: 𝗖𝗼𝗻𝘀𝘂𝗺𝗶𝗲𝗻𝗱𝗼 𝗔𝗣𝗜 𝟭𝟴/𝟮𝟭 📀
.
🔧 Continuando con la lógica de la landing:
.

  • Entra a https://rapidapi.com/ y creamos una cuenta al dar click en Sign Up y seguir los pasos.
  • El profesor usará la API de youtube, así que en el buscador puedes colocar la API que quieras usar. La versión de la API de youtube que vamos a usar es YouTube V3.
  • Una vez seleccionada la API, nos mostrará 3 columnas con los servicios y herramientas que están disponibles para la API, para el ejemplo se selecciona Channel Videos para obtener los últimos vídeos publicados. En la columna central, se debe indicar la id del canal que queremos mostrar en la landing, éste se obtiene en la url de youtube después de channel/, por ejemplo para el canal de youtube del profesor: https://www.youtube.com/channel/UC9k0tTsh_qStx0HPuPftSsg el id del canal es UC9k0tTsh_qStx0HPuPftSsg ese es el que se debe pegar en el parámetro channeld.
  • Más abajo, se puede configurar el máximo de vídeos que se desea obtener (máximo hasta 50), para el ejemplo se colocó 9.
  • En la tercera columna, se selecciona en la lista el lenguaje de programación y el método que se quiere usar, en este caso: JavaScript → fetch con ésto aparecerá la plantilla del código.
  • Para visualizar la salida al testear la plantilla, en la columna del medio al dar click en Test Endpoint, la pestaña Results se activa y podemos conocer cada uno de los elementos de los objetos, esa información nos será útil para nuestro el código.
  • Copiar la plantilla e ir al editor VSC en la ruta src/assets y pegarlo en main.js
  • La url que se pasa por argumento a la función fetch, la cambiamos al inicio del código para declarar la constante API:
const API = 'https://youtube-v31.p.rapidapi.com/search?channelId=UCw05fUBPwmpu-ehXFMqfdMw&part=snippet%2Cid&order=date&maxResults=9';

La variable options si la dejamos igual, tal cual como lo muestra rapidapi:

const options = {
    method: 'GET',
    headers: {
        'X-RapidAPI-Key': '6540473ff4mshfbdbb244ab22f99p10c708jsnfd294791e746',
		'X-RapidAPI-Host': 'youtube-v31.p.rapidapi.com'
    }
};

Como vamos a usar el asyn/await, borramos el código de fetch estructurado con then y catch. En lugar de ello, usamos la lógica que hicimos en ejemplos anteriores:

//Lógica de async: ir por los datos, luego esperar por ellos y finalmente retornarlos hacia el usuario
async function fetchData(urlApi) { //siempre async antes de function
const response = await fetch(urlApi, options); //hacemos uso del fetch() y solo por esta vez le pasamos la opciones 
const data = await response.json(); //estructura de los datos transformandolos en json
return data; //retorna la información de la API que estamos solicitando
}

Ahora vamos usar un nuevo concepto: una función que se invoca a sí misma; con JavaScript podemos tener funciones anónimas que permitan llamarse automáticamente, la estructura cuenta con la palabra reservada **async **y con funciones arrows:

(async () => {
//Dentro implementamos la lógica necesaria para hacer el llamado a la API, obtener los elementos y mostrarlos en html
//Se implementa try y catch
try{
} catch {
}
})();

Dentro de try{} estará el llamado de la API y el template de html para interpretar los datos a iterar por cada objeto, en este caso, cuando analizamos la salida de la API en rapidapi, hay una jerarquía de los datos, están los 9 “items” del 0 al 8 para la posición de cada vídeo, luego el “snippet” de cada item, luego “thumbnails” y éste a su vez los tamaños de la imagen (nos interesa con la más alta resolución “high”), también nos interesa mostrar la descripción “description” y nombre “title” de cada vídeo:

(async () => {
    try {
        const videos = await fetchData(API);
        let view = `
        ${videos.items.map(video => `
            <div class="group relative">
                <div
                    class="w-full bg-gray-200 aspect-w-1 aspect-h-1 rounded-md overflow-hidden group-hover:opacity-75 lg:aspect-none">
                    <img src="${video.snippet.thumbnails.high.url}" alt="${video.snippet.description}" class="w-full">
                </div>
                <div class="mt-4 flex justify-between">
                    <h3 class="text-sm text-gray-700" style="color:white;">
                        <span aria-hidden="true" class="absolute inset-0"></span>
                        ${video.snippet.title}
                    </h3>
                </div>
            </div>
        `).slice(0, 4).join('')}
        `;
        content.innerHTML = view;
    } catch {
     
    }
})();
  • Si quieres saber más del método map, en el enlace hay ejemplos: aquí
    • Para el método slice: aquí
    • Para el método join: aquí
  • En index.html buscamos el comentario de <!-- content --> para agregar el id de **++content ++**y pueda mostrar los vídeos en la landing, para ello, borramos el div después del comentario, incluyendo su contenido, queda así:
<div class="mt-6 grid grid-cols-1 gap-y-10 gap-x-6 sm:grid-cols-2 lg:grid-cols-4 xl:gap-x-8" id="content">
<!-- content -->
</div>

Y ahora para que pueda leer la lógica de main, dado que el id lo llamamos content, en el archivo main agregamos la referencia content:

const content = null || document.getElementById('content');

puede que haya mejorado este curso a comparacion con el anterior pero lo tienen que volver a hacer una tercera vez, en español

Una buena sugerencia para platzi es que los cursos siempre piensen que estan hablando a gente que no sabe nada, en particular hago muchos cursos y leo y me documento pero a veces no entiendo lo que el profe explica y hay algunos profes que se me dificulta coger la linea de lo que hacen.
El curso de API REST con express fue super bueno, el profesor alli me aclaro muchisimos vacios que creo que tenia, este curso en particular tambien ha sido muy bueno pero hay momentos donde se pierde uno con el profe, es un punto por mejorar porque con el profe oscar en los cursos que he iniciado me ha pasado. He notado que el profe tiene que leer mucho algun telepronter, tal vez sea eso, cuando uno enseña algo que domina y mas conversadito fluye mejor.

Si no tienes imagen para colocar en el hero pueden usar este enlace https://picsum.photos/500 les dará una imagen distinta cada vez que recarguen la página

solo quiero terminar este curso para buscar otro que me explique mejor.

funciones anonimas autoejecutables!!!

Les recomiendo hacer una copia del resultado de la API, pues al final si les pasa algún error o si están haciendo mejoras les va a sacar un status of 429 (Too Many Requests). Esto es porque la API tiene un límite de 40 peticiones MENSUALES,

Este es el codigo de HTML que hace falta en el minuto 13:20

<div class="group relative">
            <div
              class="w-full bg-gray-200 aspect-w-1 aspect-h-1 rouded-md overflow-hidden group-hover:opacity-75 lg:aspect-none"
            >
              <img src="" alt="" class="w-full" />
            </div>
            <div class="mt-4 flex justify-between">
              <h3 class="text-sm text-gray-700">
                <span aria-hidden="true" class="absolute inset-0"></span>
                Title
              </h3>
            </div>
          </div>

Este es el ID de el profesor Oscar ( UC9k0tTsh_qStx0HPuPftSsg )

Aquí esta la API que utiliza el profesor en este video: Youtube V3

Decidi construir mi propia API para poner en practica mis habilidades de backend y tener un portafolio mas completo. Me va a tocar hcaer mucho trabajo 😒 pero aqui pueden ir viendo el progreso de este proyecto.

Decidi hacer un blog financiero (estudio finanzas en la universidad) que incluya un blog, seccion de noticias, calculadoras y una seccion de contacto. Deseenme suerte.

https://github.com/EsquizoDEV/financeBlog

Tambien ire comentando por aqui algunos avances:

Dejo el primer avance, super importante primero ir definiendo que queremos que haga nuestra aplicacion, antes de pasar a programar como locos, entonces es lo que estoy haciendo.

La página tendrá 3 secciones principales, un blog, noticias, una sección de calculadoras y una sección de contacto.
El blog, consumirá el contenido principal (texto e imágenes) desde una API construida en NodeJS, express y utilizando una base de datos SQL, esto nos permitirá crear una misma estructura para el frontend del blog y simplemente consumir los datos sin perder el estilo.
Para el blog la API tendrá varios niveles, un nivel para obtener información de todos los blogs actuales, que serán utilizados para mostrarse en un carrusel, el API debe responder con información general de cada blog (Blog Nivel 0 Especificacion).
También habrá un nivel para obtener a el detalle de un blog, la estructura de respuesta de este request, tiene que ser la correcta para el renderizado adecuado del frontend. En el frontend, nuestro Javascript, necesita saber la estructura de esa entrada de blog, es decir, necesitamos saber el titulo principal, la introducción, la cantidad de subtítulos que hay a lo largo del blog, y los contenidos relativos a cada subtitulo, así también, cada sección puede ir o no acompañada de una imagen, que tendrá que aparecer entre cada cambio de sección. Para ver mejor un ejemplo de respuesta, ir a la especificación de Blog Api Nivel 1.
Blog API Nivel 0 especificacion:
Rutas, métodos y ejemplos de respuesta:
Ruta: api/ V1/blogs
Method: GET
Res example:
[{
“Title”: ”The first entry”,
“ShortContent”:”The short content string”,
“Date”: 27/05/22,
“Id”: “123456”
}]
Blog API nivel 1 especificación:
Ruta: api/v1/blog/:id
Method: GET
Res example:
{
“Title”: “Blog title”
“MainIMG”: “IMG SRC”,
“Intro”: “String intro”,
“SubContent”: [{
“Title”: “Subtitle 1”,
“Content”: “Content string”,
“Image”: “IMG SRC”
}]
}

Otra forma de averiguar el channel ID es la siguiente: 1\. Ingresas al canal de tu elección, en mi caso el de la NASA: <https://www.youtube.com/@nasa_es> 2\. Le das click a su descripción (señalado con la línea roja): ![](https://static.platzi.com/media/user_upload/image-e65bbfb3-df94-4cad-a3d9-c5a0416d2a0e.jpg)3. Das click en compartir canal: ![](https://static.platzi.com/media/user_upload/image-65109e1b-3510-43e6-983c-2cfb90a94e3e.jpg) 4\. Seleccionas la opción "Copiar ID del Canal" ![](https://static.platzi.com/media/user_upload/image-8dc8ab78-bc7f-4cc7-ad98-4ba7f0fb04bb.jpg) Y listo, ¡celebra! Ya tienes el ID de canal.

Para los que igual que un servidor solo tienen un idea no muy clara sobre lo que es una api. Aquí unos links que les puede ayudar a tender mejor.
link1
link2

Me encanta esta clase, es un buen método sin hacer tantos id en el HTML, solo un getElementById y esta todo

genial curso

Debemos tener en cuenta que en el ambito laboral necesitaremos buscar informacion de manera inmediata si no la recordamos, aprovechemos los vacios de informacion para buscarla nosotros mismos. somos responsables de nuestro aprendizaje , aunque si , la explicacion esta bastante intensa y poco fluida

Esta clase me volo la cabeza. Hice todo lo que dijo el profesor pero no entendi muy bien el porque de todo eso. No se si es mi culpa o es que el curso va muy rapido… pero me hubiese gustado que explicaran detalladamente el porque de cada cosa en lugar de solo ir al grano

🙋‍♂️ Quiero compartir un link donde resume:

de manera 👉 simple y concreta 👈
.

spoiler. Minuto 11:43 ** ¡funciones anonimas autoejecutables!** hagame el… favor. Se dieron garra. Bien por el profe y su dominio del tema, mal por que los conceptos se asumen que ya “se saben”
.
Este curso desentona de todos los que he tomado. Mucho tecnisismo y teoria nunca antes vista

Esta plataforma de RapidApi es increible!

Este es el código que copia de HTML por si a alguien le sirve

      <div class="group relative">
        <div
          class="w-full bg-gray-200 aspect-w-1 aspect-h-1 rounded-md overflow-hidden group-hover:opacity-75 lg:aspect-none">
          <img src="" alt="" class="w-full">
        </div>
        <div class="mt-4 flex justify-between">
          <h3 class="text-sm text-gray-700">
            <span aria-hidden="true" class="absolute inset-0"></span>
            Title
          </h3>
        </div>
      </div>
const API = 'https://youtube-v31.p.rapidapi.com/search?channelId=UCBVjMGOIkavEAhyqpxJ73Dw&part=snippet%2Cid&order=date&maxResults=9'

const content = null || document.getElementById('content')

const options = {
	method: 'GET',
	headers: {
		'X-RapidAPI-Key': 'd3fb83269emsh45c3e7bb4dff737p1c5116jsn290e84273e9f',
		'X-RapidAPI-Host': 'youtube-v31.p.rapidapi.com'
	}
};

async function fetchData(urlApi){
  const response = await fetch(urlApi, options);
  const data = await response.json();
  return data;
}

(async () =>{
try {
  const videos = await fetchData(API);
  let view = `
  ${videos.items.map(video => `
        <div class="group relative">
          <div
            class="w-full bg-gray-200 aspect-w-1 aspect-h-1 rounded-md overflow-hidden group-hover:opacity-75 lg:aspect-none">
            <img src="${video.snippet.thumbnail.high.url}" alt="${video.snippet.description}" class="w-full">
          </div>
          <div class="mt-4 flex justify-between">
            <h3 class="text-sm text-gray-700">
              <span aria-hidden="true" class="absolute inset-0"></span>
              ${video.snippet.title}
            </h3>
          </div>
        </div>
  `).slice(0,4).join('')}
  
  `;
} catch (error) {
  
}
})();

Buena clase! Ahora me dispongo a implementar otra API, para comprobar los conocimientos adquiridos, espero tener suerte y poder lograrlo!

Tuve un problema de asincronismo, ya que la carga del archivo de javascript se realizaba antes de que se completara la carga del html, por ende, cuando iba a buscar el id content, no lo referenciaba y quedaba nulo.

Encontré estas 3 soluciones para este problema:

Usar el atributo defer en la etiqueta de script:
El atributo defer le indica al navegador que el archivo JavaScript se debe cargar de forma asíncrona y que se debe ejecutar después de que el documento HTML se haya cargado completamente. Esto permite que el archivo JavaScript se cargue antes de que se renderice el contenido de la página, pero aún así se ejecutará después de que se haya cargado todo el HTML.
Ejemplo:

<head>
  <script defer src="archivo.js"></script>
</head>

Usar el atributo async en la etiqueta de script:
El atributo async le indica al navegador que el archivo JavaScript se debe cargar de forma asíncrona y que se debe ejecutar tan pronto como esté disponible. Esto significa que el archivo JavaScript se cargará y se ejecutará en segundo plano, sin bloquear la carga del resto de la página. Sin embargo, esto también significa que el archivo JavaScript se ejecutará antes de que se cargue todo el HTML, lo que puede causar problemas si el JavaScript depende del contenido HTML.
Ejemplo:

<head>
  <script async src="archivo.js"></script>
</head>

O también se puede situar la carga del archivo al final del archivo HTML, justo antes del cierre de la etiqueta </body>

Voy hacer la implementacion con otra API.

Espero que tenga Exito!

Por cierto buena clase!!

ACTUALIZACIÓN OCTUBRE-2024: RapidAPI: \- Cambió la interfaz para hacer test de la api, ahora es de paga :'(. \- El input para poner el channel no reconoce el nuevo formato de channels de youtube, ahora es : @channel, por ejemplo: @platzi. \- el formato para conseguir channels en YouTube es rebuscado, un poco complicado. CONCLUSIÓN: usen otra API para terminar bien el curso.

Lo intenté hacer con otra API porque en ese sitio web me piden datos de tarjeta de crédito, y quedé mas perdido que antes 😦

Como recomendacion se deberia hacer mucho mas enfasis en la explicacion, porque para lo que esta haciendo el profe prefiero directamente el codigo

Para aquellos que estén usando TypeScript, les comparto las interfaces para la API. 😄

export interface Video {
    kind:          string;
    nextPageToken: string;
    regionCode:    string;
    items:         Item[];
}

export interface Item {
    kind:    string;
    id:      ID;
    snippet: Snippet;
}

export interface ID {
    kind:    string;
    videoId: string;
}

export interface Snippet {
    channelId:            string;
    channelTitle:         string;
    description:          string;
    liveBroadcastContent: string;
    publishTime:          Date;
    publishedAt:          Date;
    title:                string;
    thumbnails:           Thumbnails;
}

export interface Thumbnails {
    default: Default;
    high:    Default;
    medium:  Default;
}

export interface Default {
    height: number;
    url:    string;
    width:  number;
}

Aqui el codigo con una explicacion breve de lo que hizo Oscar

const API = `https://youtube-v31.p.rapidapi.com/search?channelId=UCMebXsaxWdvBzBNwus7TmxA&part=snippet%2Cid&order=date&maxResults=9`;

//aqui agregaremos la iteracion de cada elemento(referencia)
const content = null || document.getElementById('content');

const options = {
	method: 'GET',
	headers: {
		'X-RapidAPI-Key': 'd184c3e23amsh3f130883e71e936p1675cdjsn5a978ab2864a',
		'X-RapidAPI-Host': 'youtube-v31.p.rapidapi.com'
	}
};

async function fetchData(urlApi){
    const response = await fetch(urlApi, options)
    const data = await response.json();
    return data; 
}

//funcion que se autoinvoca
//cuando cargue el archivo se va a ejecutar
(async ()=>{
    try{
        const videos = await fetchData(API);
        //crearemos un template en html para que itere por los elementos de la respuesta
        //view es esa porcion de html
        //usamos js para iterar 
        //en esta API , para acceder a los videos, se refiere a items, se hace un map para devolver un nuevo arreglo con el template por cada resultado
        let view = `
        ${videos.items.map(video=>`
            <div class="group relative">
            <div
                class="w-full bg-gray-200 aspect-w-1 aspect-h-1 rounded-md overflow-hidden group-hover:opacity-75 lg:aspect-none">
                <img src="${video.snippet.thumbnail.high.url}" alt="${video.snippet.description}" class="w-full">
            </div>
            <div class="mt-4 flex justify-between">
                <h3 class="text-sm text-gray-700">
                <span aria-hidden="true" class="absolute inset-0"></span>
                ${video.snippet.title}
                </h3>
            </div>
            </div>
        `).slice(0,4).join('')}//para iterar solo 4 videos
            
        `;
    }catch{

    }
})();
	

Si necesitas encontrar el ID de un canal de YouTube te explico 1) Abre la página del canal en YouTube. 2) Haz clic derecho y selecciona ‘View Page Source’ para ver el código fuente de la página. 3) Una vez en el código fuente, presiona Ctrl + F en Windows y busca ‘href’. El ID del canal suele estar ubicado después de la palabra ‘channel’.

He hecho la landing page the Ariana Grande, no tenia fotografias horizontales de mi mismo. Todas verticales para usar en Instagram stories. LOL

deberian actualizar el curso o la clase porque al buscar y copiar el codigo en el minuto 14:49 es muy diferente el que sale en el video y otro el que encuentro tanto en git hub como en los recursos de la clase, asi quedo mas perdido

me llego una alerta de GitGuardian, leí que debo sacarla o encriptarla, está el git ignore, pero ese archivo main.js tiene toda la logica, no puedo hacer que lo ignone, menos sí despues estará en GitPages
¿Qué debo hacer? ¿nada?

Recursividad?

Algo que no se comenta, y es importante saberlo, es que hay que suscribrirse en la cuenta de la API del creador de esta. Ya que así se habilita la opción para probar el endpoint con los datos que rellenamos en el formulario de la API, y así saber qué nos retorna hacerle la petición a la API, y saber a que propiedades entrar para incrustarlo en nuestro HTML.
que mal contenido: una de las preguntas en el exámen es: ¿Para qué utilizamos JSON.parse(xhttp.responseText)? y me quedó mal, me redirecciona a este video y este método nunca es usado en este video y nunca se explica que tipo de dato retorna y si es inmutable o no. triste pero el contenido de platzi es muy muy malo

Les dejo un link de github con una lista de links de APIS publicas de todo tipo de contenido como videojuegos, cocina, financiero y demas:
Apis Variadas

Empecé a jugar con la API y me costó, pero se me hizo interesante 😛

Mis apuntes en Notion 😄

A B C de las A .P. I.

Para el reto solo programé que el catch, cuando falle, cree un h1 con un mensaje de error usando innerHTML

catch (err) {
        console.log(err)
        content.innerHTML = `<h1 style="color:black;"> Lo siento, hubo un error :( </h1>`;
    }

Pense que || siempre devolvia un valor booleano, pero aca se usa distinto, asi que le pregunte a la IA Chat GPt y esto me respondio:

En JavaScript, el operador || no siempre devuelve un valor booleano. En realidad, este operador devuelve el primer valor “verdadero” (truthy) que encuentre en la cadena de expresiones que está evaluando.

Por ejemplo, si tienes una expresión como valor1 || valor2 || valor3, JavaScript evalúa cada uno de los valores y devuelve el primer valor que sea “verdadero” (truthy). Si ninguno de los valores es “verdadero”, se devuelve el último valor.

Aquí hay algunos ejemplos que demuestran cómo funciona el operador || en JavaScript:

//Javascript
console.log(1 || 2); // 1
console.log(null || 0); // 0
console.log(undefined || 'hola'); // 'hola'
console.log('' || false || 'hola'); // 'hola'
En el primer ejemplo, la expresión 1 || 2 devuelve 1 porque 1 es "verdadero" (truthy) y se evalúa antes que 2.

En el segundo ejemplo, la expresión null || 0 devuelve 0 porque null no es “verdadero” (falsy) y 0 es el último valor en la cadena.

En el tercer ejemplo, la expresión undefined || ‘hola’ devuelve ‘hola’ porque undefined es “falsy” y ‘hola’ es el primer valor “verdadero” (truthy) en la cadena.

En el cuarto ejemplo, la expresión ‘’ || false || ‘hola’ devuelve ‘hola’ porque ‘’ es “falsy”, false es “falsy” y ‘hola’ es el primer valor “verdadero” (truthy) en la cadena.

el curso por el momento me parece excelente! lo uncio con lo que no estoy muy de acuerdo es con la utilizacion de tailwind, claramente si seguimos la ruta de aprendizaje creada por platzi estaria bueno que utilicemos los metodos que fuimos aprendiendo, todo lo demas me parecio excelente las explicaciones de Oscar.

Una clase de 💩

Que buena explicacion

Excelente clase ! , explica muy bien los conceptos anteriores y añade los paso a paso de forma clara