Contenido del curso
0:00/14:23
Cómo JavaScript habla con una API
01:30Cómo funciona el protocolo HTTP entre JavaScript y APIs
Suscríbete para ver másQué significan los códigos de estado HTTP
Suscríbete para ver másHeaders HTTP: qué son y cómo funcionan
Suscríbete para ver másPeticiones HTTP reales en el navegador
Suscríbete para ver másIntegración de productos y detalle con fetch
Suscríbete para ver másFiltrar productos por categoría con URLSearchParams
Suscríbete para ver másCrear productos con fetch y POST
play_circleViendo ahoraEdición de productos con verbo PUT en JavaScript
Suscríbete para ver másCómo implementar DELETE en un repositorio
Suscríbete para ver másCrear un producto con el verbo POST de HTTP es uno de los pasos más comunes al integrar un API REST con JavaScript. Aquí aprenderás a implementar el método createProduct dentro de un repositorio, manejar headers, body y errores comunes que aparecen al hacer la petición con fetch.
Qué define una petición POST en un API REST
El verbo HTTP determina la acción que se ejecuta sobre un recurso, aunque la URL sea la misma que usas para listar productos.
En la especificación del API que se trabaja en la clase, el endpoint de productos acepta dos verbos sobre la misma URL: GET para traer la lista y POST para crear uno nuevo. Lo que cambia no es la dirección, sino la intención. Y esa intención se expresa en el atributo method dentro de la configuración de fetch [01:25].
El body que espera este endpoint tiene una forma muy específica:
title: string que funciona como identificador único.price: número.description: string.categoryId: número que referencia la categoría.images: lista de strings con las URLs.¿Qué hace el verbo POST en un API? Indica al servidor que quieres crear un nuevo recurso. Aunque uses la misma URL del GET, el servidor interpreta la acción según el
methodque envías en la petición.
Cómo implementar createProduct en el repositorio
El método vive dentro del repositorio de productos y encapsula la interacción con el API. Así, el resto de la aplicación solo invoca createProduct(product) sin preocuparse por los detalles de la petición.
La estructura base reutiliza la misma URL del listado, pero ahora declarada como const porque no hay query params que modificar. El cambio importante está en el segundo argumento de fetch, que recibe un objeto de configuración con method, headers y body [02:30].
Por qué necesitas JSON.stringify y los headers correctos
Al ejecutar la primera versión del método aparece un error revelador: el payload que se envía es un objeto de JavaScript en crudo, no una cadena JSON. El servidor no puede interpretarlo.
La solución tiene dos partes:
JSON.stringify(product) antes de asignarlo al body.Content-Type: application/json para indicarle al servidor el formato que estás enviando.El header Accept: application/json complementa la conversación porque le dice al servidor en qué formato esperas la respuesta. Sin ambos headers la petición queda incompleta [05:40].
javascript
async createProduct(product) {
const url = ${this.baseUrl}/products;
const response = await fetch(url, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify(product)
});
if (!response.ok) {
throw new Error(No se pudo crear el producto. statusCode: ${response.status});
}
const jsonResponse = await response.json(); return jsonResponse; }
Cómo manejar errores 400 y 500 al crear un producto
Una petición POST exitosa responde con status code 201, lo que activa el atributo response.ok en true. Cualquier valor distinto entra en la rama del throw new Error, donde un template tag expone el código real para depurar más rápido.
Durante la prueba aparecen dos errores típicos:
title ya existe, porque ese campo se usa para generar el slug único.¿Por qué falla mi POST con error 400? Casi siempre es un problema del body. Revisa el preview en la pestaña Network del navegador: el API devuelve ahí el detalle del error, como un título duplicado o un campo faltante.
Cómo integrar createProduct con el formulario de la vista
La vista create.html ya tiene un formulario y una función handleSubmit que captura los datos. Lo único que falta es conectar esa función con el repositorio.
El primer paso es importar el script de repositorios dentro del HTML para que window.productRepository quede disponible. Después, dentro de handleSubmit, se obtiene la instancia y se ajusta el productData para que cumpla la forma del API, especialmente el campo images, que debe ser una lista de strings aunque venga de un único input [09:15].
Cuándo usar then en lugar de async await
La función handleSubmit no está marcada como async, y convertirla obligaría a propagar async en cadena por todas las funciones que la invocan. Para evitar ese efecto dominó, se usa .then() directamente sobre la promesa que retorna createProduct.
javascript const repository = window.productRepository;
repository.createProduct(productData) .then((jsonResponse) => { console.log(jsonResponse); });
Esto aprovecha que fetch ya devuelve una promesa y mantiene el flujo del formulario sincrónico desde la perspectiva del DOM.
¿Qué retorna el API cuando se crea un producto? El mismo objeto que enviaste, pero con un
idasignado por el servidor. Eseidconfirma que el recurso quedó persistido en la base de datos.
Cómo verificar la creación desde el navegador
El flujo de prueba es directo:
handleSubmit.productData coincida con la especificación.console.log con el objeto retornado, incluido el nuevo id [11:50].Cuando todo cuadra, el response.ok llega en true, el JSON de respuesta trae el producto completo y la integración entre repositorio, vista y API queda cerrada.
¿Cómo te fue conectando el formulario con tu repositorio? Cuéntame en los comentarios qué errores te aparecieron y cómo los resolviste.
Juan Sebastian Diaz Osorio
Diego Ivan Cundapi Leon
JOSUE SALATIEL MEDINA SALAZAR
Hay algo que no le gusta al server de mi request cuando integro el respositorio en el formulario de creación, pues siempre me responde con status 400. He seguido al pie de la letra las instrucciones y sugerencias del video, pero no doy con el chiste.
A continuación el request payload:
{"title":"Camiseta monta-ñera","price":27,"description":"La propia camisa negra","categoryId":10,"images":["https://i.imgur.com/QkIa5tT.jpeg"]}
Comparando con la documentación del FAKE API para el body del POST, todo se ve en orden. Tampoco veo problemas de producto duplicados pues todos los campos son únicos y los data types son los correctos. He verificado que el código sea idéntico al del video. Además he intentado hacer todo lo obvio, cómo eliminar cookies, reiniciar el browser, el PC, etc. Alguna idea adicional o sugerencia?
prueba creando un diferente producto, con datos distintos probablemente una primera vez se hizo la creación de tu producto y se está duplicando
Mismo problema, en mi caso era el campo de imagen que se usa de ejemplo, no lo acepta la api y regresa error 400 en el mismo punto. Lo resolvi reemplazando el campo de la imagen con otro enlace, ejemplo reemplazar: por .
en el campo "images"