CursosEmpresasBlogLiveConfPrecios

Endpoint de detalles de una película

Clase 15 de 17 • Curso de API REST con Javascript: Ejemplos con APIs reales

Clase anteriorSiguiente clase

Contenido del curso

Presentación del proyecto: PlatziMovies

  • 1
    TheMovieDB: análisis de su API

    TheMovieDB: análisis de su API

    07:15 min
  • 2
    Bocetos en papel y diseño en Figma

    Bocetos en papel y diseño en Figma

    08:05 min

Configuración inicial y maquetación del proyecto

  • 3
    Configuración del entorno de desarrollo

    Configuración del entorno de desarrollo

    16:53 min
  • 4
    Maquetación del proyecto: HTML y CSS

    Maquetación del proyecto: HTML y CSS

    18:34 min

Consumiendo la API

  • 5
    Lista de películas en tendencia

    Lista de películas en tendencia

    16:41 min
  • 6
    Lista de categorías

    Lista de categorías

    10:32 min
  • 7
    Migración a Axios

    Migración a Axios

    07:18 min

Navegación

  • 8
    Location y hash navigation

    Location y hash navigation

    17:17 min
  • 9
    Mostrando y ocultando secciones

    Mostrando y ocultando secciones

    22:05 min
  • 10
    Error: carga duplicada de datos

    Error: carga duplicada de datos

    06:30 min

Views

  • 11
    Filtrando películas por categoría

    Filtrando películas por categoría

    21:38 min
  • 12
    Retos: scrollTop y DRY

    Retos: scrollTop y DRY

    11:13 min
  • 13
    Buscador de películas

    Buscador de películas

    11:10 min
  • 14
    Retos: historial de navegación y página de tendencias

    Retos: historial de navegación y página de tendencias

    06:19 min
  • 15
    Endpoint de detalles de una película

    Endpoint de detalles de una película

    Viendo ahora
  • 16
    Lista de películas recomendadas

    Lista de películas recomendadas

    07:36 min

Próximos pasos

  • 17
    Toma el Curso Profesional de Consumo de API REST con JavaScript

    Toma el Curso Profesional de Consumo de API REST con JavaScript

    02:19 min
Tomar examen
Resumen
linear-gradient(
180deg, 
rgba(0, 0, 0, 0.35) 19.27%, 
rgba(0, 0, 0, 0) 29.17%
),

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads
        Carlos Rodríguez

        Carlos Rodríguez

        student•
        hace 4 años

        Recuerden que si quieren optimizar aun más el código y no tener que crear un evento por cada película, pueden crear un sólo evento en la sección y con el e.target delegar el evento al nodo que quieren, ¿pero cmo detecto el id o la url de la imagen?, muy sencillo, usar los dataset para guardar esos datos en el html al momento de cargar los items don el módulo navigations. . Adjunto mi aporte con mi repositorio en el commit de la clase: Mi repositorio

          Jorge Garcia

          Jorge Garcia

          student•
          hace 4 años

          interesante tu respuesta y es muy eficiente a la hora de generar el codigo y la carga, pero podria ser mas explicito ya que aca andamos muchos que recien entramos al mundo de JS y la programacion, me interesa para poderlo implementar y entender

          Carlos Rodríguez

          Carlos Rodríguez

          student•
          hace 4 años

          @idanygr Te recomiendo este curso si quieres indigar más sobre la manipulación del DOM: Curso de Manipulación del DOM

        Carlos Rodríguez

        Carlos Rodríguez

        student•
        hace 4 años

        Para los puristas del CSS, recomiendo agregar un reset inicial a las imágenes de estas propiedades:

        img { background-position: center; background-repeat: no-repeat; background-size: cover; }

        . Existe también el object-fit: cover; que es más resumido pero no es compatible con IE. . El modificador header-container--long siempre al final de todos los estilos de esa sección, y eliminar los estilos que ya javascript los coloca. Además esta tenía una propiedad de background-size: cover !import;, si son muy maniáticos con el no colcoar el !import, pues en este caso era necesario ya que nunca CSS encontrará una especificdad de contenedor de imagen cuando dentro hay otros elementos como h1 o p. La solución es eliminar esa propiedad y agregarla internamente desde el código javascript.

        .header-container--long { height: 480px; position: fixed; top: 0; width: 100%; }

        . JS

        headerSection.style.background = ` linear-gradient( 180deg, rgba(0, 0, 0, 0.35) 19.27%, rgba(0, 0, 0, 0) 29.17% ), url(${movieImgUrl}) `; headerSection.style.backgroundPosition = 'center'; headerSection.style.backgroundRepeat = 'no-repeat'; headerSection.style.backgroundSize = 'cover';

        . Mi repositorio en este fix

        Lautaro Strappazzon

        Lautaro Strappazzon

        student•
        hace 4 años

        Si a alguien más le sucedió que al entrar al detalle de una película y luego volver al home, el header le queda con el fondo del detalle como en la imagen:

        Captura de pantalla 2022-05-30 a la(s) 18.48.54.png

        Esto sucede porque al asignarle el background a headerSection en realidad se lo estamos asignando al header en general, no a la clase .header-container--long, por eso al volver al home el estilo se mantiene.

        Sigo buscando la forma de optimizarlo, pero por el momento la solución que encontré fue agregarle a la función homePage del file navigation.js la siguiente línea:

        headerSection.style.background = '';

        De esta forma, cada vez que regresemos al home le estamos borrando la propiedad. Voy a buscar una mejor solución y les comento si la encuentro. Si alguien más encuentra una solución mejor se los agradecería, o si fue sólo un error mío también.

        Saludos y nunca paren de aprender 💪

          Angel David Velasco Bonifaz

          Angel David Velasco Bonifaz

          student•
          hace 4 años

          Se ve mejor. con la imagen de fondo.

          Christian Velázquez

          Christian Velázquez

          student•
          hace 4 años

          Me pasa lo mismo pero, creo que tiene que ver con el "live server" porque, cuando regreso lo vuelvo a cargar...se va la imagen de fondo. Igual y pondré tu solución, en lo que busco una. Gracias por el aporte.

        Sebastián Andrés Sanhueza Tapia

        Sebastián Andrés Sanhueza Tapia

        student•
        hace 3 años

        Sí les aparece así el puntaje de la pelicula

        promedio con mucho decimal.jpg
        se puede arregar colocando ".foFixed(1)" para truncar a un decimal
        toFixed(1).png
        y quedará bien así:
        1 decimal.jpg

        Cayo Legal

        Cayo Legal

        student•
        hace 4 años

        Solución al string vacío en el form

        searchFormBtn.addEventListener('click', e => searchFormInput.value !== "" ? location.hash = 'search=' + searchFormInput.value : e.preventDefault())
          Jose Castillo

          Jose Castillo

          student•
          hace 3 años

          Yo lo hice de esta manera:

          searchFormBtn.addEventListener('click', () => { let regex = /\w/g; regex.test(searchFormInput.value) ? location.hash = '#search=' : location.hash && alert('Desbes ingresar algun caracter en la busqueda')

          con el regex filtro caracteres validos de busqueda y evito que envien la consulta si esta el campo solo con espacios como " ".

        Eduardo Rodriguez Yapur

        Eduardo Rodriguez Yapur

        student•
        hace 3 años

        Para que el detalle y titulo de la pelicula se muestren en español podemos añadir a los parametros que enviamos a la API el lenguage:

        api=axios.create({ baseURL: 'https://api.themoviedb.org/3/', headers:{ 'Content-Type': 'application/json;charset=utf-8', }, params:{ 'api_key': 'xxxxxxxxxxxxxxxxxxxxxxxxxx', 'language':'es', } });
        Miguel Angel Hernandez Colombo

        Miguel Angel Hernandez Colombo

        student•
        hace 3 años

        buena clase!

        Dario Paladines

        Dario Paladines

        student•
        hace 4 años

        Amable recordatorio que para que les cargue la película correctamente si o si tienen que colocarle los string literals en el style.background

        Luis Donaldo Talavera Covarrubias

        Luis Donaldo Talavera Covarrubias

        student•
        hace 3 años

        Dejo mi repositorio, no use axios y algunas cosas las hice un poco diferente ya que las hacia antes de ver la clase, si gustan le pueden echar un ojo: https://github.com/Doni-Metal/Movie-Data-Viewer

        Gregory Muñoz

        Gregory Muñoz

        student•
        hace 3 años

        Mi solución al fondo en las otras vistas que no son la de vista detallada de la pelicula:

        navigation.js:

        arrowBtn.addEventListener('click', () => { headerSection.style = ''; const stateLoad = history.state ? history.state.loadUrl : ''; if (stateLoad.includes('#')) { location.hash = '#home'; } else { history.back(); } });

        Basicamente al agregar headerSection.style = ''; se estan eliminando los estilos del headerSection, al cambiar de vista al presionar la flecha de retorno. Así nos ahorramos eliminar la imagen de headerSection por cada vista.

        Juan Pablo Vargas Ramirez

        Juan Pablo Vargas Ramirez

        student•
        hace 2 años

        Yo viendo un !important en el minuto 17:51 y recordando las enseñanzas de De Granda: La traición, la decepción hermano

          Henry Alexander Velásquez Rosas

          Henry Alexander Velásquez Rosas

          student•
          hace 2 años

          Pensé lo mismo 😢

        Cristian Paiva

        Cristian Paiva

        student•
        hace 3 años

        jajajaja me hiciste reir con tu cara cuando pusiste batman para ver los detalles y en categorias veias romance. Por otro lado, realmente este curso tiene una calidad increíble de contenido. Gracias

        Ricardo Alfonso Chavez Vilcapoma

        Ricardo Alfonso Chavez Vilcapoma

        student•
        hace 3 años

        ¿Llegaron aquí?...enorgullezcanse amigos...son LEYENDA

        Rubén Cuello

        Rubén Cuello

        student•
        hace 3 años

        Pregunta de novato porque no me acuerdo. ¿Cómo se hace para seleccionar varios elementos clickeándolos así como hace Juan en 10:20 ? Probé de varias formas y no me sale :smile:

          Juan Castro

          Juan Castro

          teacher•
          hace 3 años

          Busca "vscode shortcuts [so]" y cambia [so] por tu sistema operativo para encontrar la lista completa de atajos. :D

          Sebastián Andrés Sanhueza Tapia

          Sebastián Andrés Sanhueza Tapia

          student•
          hace 3 años

          alt + click

        Henry Alexander Velásquez Rosas

        Henry Alexander Velásquez Rosas

        student•
        hace 2 años

        Todo va bien, pero hay pelis que no tienen imagen, ¿A alguien más le paso?

        9.png
          Juan Castro

          Juan Castro

          teacher•
          hace 2 años

          Pasa en muchas películas. Lo que se puede hacer ahí es poner un fallback (una imagen por defecto que solo cargue cuando falle o no haya imagen de alguna película).

          Mira: https://platzi.com/clases/2942-api-profesional/49631-imagenes-por-defecto/

        Alejandro Laguna

        Alejandro Laguna

        student•
        hace 3 años

        hola, cuando entro a ver los detalles de una pelicula sale todo bien, pero cuando intento regresar con la flecha me aparece la imagen de deadpool de fondo.

        ![](

        Captura de pantalla 2022-11-12 163419.png

          Juan Castro

          Juan Castro

          teacher•
          hace 3 años

          Revisa por fa tu archivo navigation.js: https://platzi.com/clases/2986-api-practico/48454-mostrando-y-ocultando-secciones/

          Con el código de esa clase se debería quitar la clase --long del header para que deje de salir el deadpool.

        Santiago Barón Castaño

        Santiago Barón Castaño

        student•
        hace 3 años

        Failed to load resource: the server responded with a status of 403 (Forbidden), ayuda con este error por favor.

          Juan Castro

          Juan Castro

          teacher•
          hace 3 años

          A qué endpoint o incluso URL completa hiciste la solicitud? Sigues teniendo el mismo error?

        Alex Maurice

        Alex Maurice

        student•
        hace 4 años

        Hola gente me gustaría un poco de ayuda, ya que me sale error al intentar ver la descripcion de una peli, pero si pongo un id manualmente aparece todo los datos

        ![](

        Captura de Tela (42).png

          Juan Castro

          Juan Castro

          teacher•
          hace 4 años

          Parece que tu función getMovieById no está recibiendo correctamente el parámetro id porque en al consulta lo está convirtiendo a undefined. ¿Nos muestras por fa la sección donde ejecutas esa función?

          Alex Maurice

          Alex Maurice

          student•
          hace 4 años

          Sí!

          function navigator() { if(location.hash.startsWith('#movie=')) { moviesPages(); } else if(location.hash.startsWith('#search=')) { searchOp(); } else if(location.hash.startsWith('#tvshow=')){ TVPages(); } else if(location.hash.startsWith('#description=')){ movietvDeatailsPage(); } else if (location.hash.startsWith('#category=')){ categorypages_view() } else if(location.hash.startsWith('#Categories')){ categoryPage(); } else{ homePage(); }
          async function getMovieById(id) { const { data: movie } = await api('movie/' + id); title_description.textContent = movie.title; overview_description .textContent = movie.overview; average_description.textContent = movie.vote_average; }
          function movietvDeatailsPage(){ headerSection.classList.add('active-size'); headerSectionBack.classList.add('inactiveback'); formSection.classList.add('inactive'); homeOp.classList.remove('inactive'); categoryOp.classList.add('inactive'); tvOp.classList.remove('inactive-color'); home_section.classList.add('inactive'); moviePage_section.classList.add('inactive'); tvPage_section.classList.add('inactive'); description_section.classList.remove('inactive'); search_section.classList.add('inactive'); formSection.classList.add('inactive'); headerSection.classList.remove('active-size-search'); categoryNav.classList.add('inactive'); category_section.classList.add('inactive'); moviesCategoriesOp.classList.remove('inactive'); tvsCategoriesOp.classList.remove('inactive'); // ['#movie', 'id] const [_, movieId] = location.hash.split('='); getMovieById(movieId); };
        Andy Simancas

        Andy Simancas

        student•
        hace 2 años

        Epaaaa! porque el css tiene un "!important" ??? 👀👀