Tutorial: Agregar el endpoint POST /artistas
1. Objetivos de aprendizaje
Sección titulada «1. Objetivos de aprendizaje»Al terminar este tutorial vas a ser capaz de:
- Agregar un endpoint de escritura a un controller REST con
@PostMapping. - Usar
@RequestBodypara que Spring convierta el JSON recibido en un DTO. - Usar
@ResponseStatuspara controlar el código de estado HTTP de la respuesta. - Explicar por qué, sin un método de guardado en el repositorio, este
POSTtodavía no persiste el artista nuevo, y qué significa eso para elidque llega en la respuesta.
Prerrequisitos: haber completado el
tutorial de la implementación en memoria
(tu GET /artistas ya responde con datos reales).
2. Ubica el archivo
Sección titulada «2. Ubica el archivo»Abre:
src/main/java/co/edu/uniandes/musical/artistas/ArtistaController.javaYa existe ahí un endpoint GET /artistas que usa artistaRepository.findAll(). Vas a
agregar el POST al lado, en la misma clase.
3. Repasa las piezas que ya existen
Sección titulada «3. Repasa las piezas que ya existen»ArtistaDTO: el objeto que representa un artista (id,nombre,fotoArtistaUrl,paisOrigen,biografia,fechaNacimiento,albumes). Usa Lombok (@Data), así que ya tiene getters, setters y constructores generados.ArtistaRepository: hoy solo declarafindAll(). No tiene ningún método para guardar, porque este tutorial todavía no lo necesita: vas a ver por qué en el paso 6.
4. Agrega las anotaciones necesarias de Spring
Sección titulada «4. Agrega las anotaciones necesarias de Spring»En el controller necesitas tres anotaciones de Spring Web:
| Anotación | Para qué sirve |
|---|---|
@PostMapping("/artistas") |
Mapea el método a peticiones HTTP POST a la ruta /artistas. |
@RequestBody |
Le dice a Spring que convierta el JSON del body de la petición en un objeto ArtistaDTO. |
@ResponseStatus(HttpStatus.CREATED) |
Hace que la respuesta tenga código 201 en vez del 200 por defecto. |
Impórtalas al inicio del archivo:
import org.springframework.http.HttpStatus;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.ResponseStatus;5. Escribe el método
Sección titulada «5. Escribe el método»Debajo del método listarArtistas, agrega:
@PostMapping("/artistas")@ResponseStatus(HttpStatus.CREATED)public ArtistaDTO crearArtista(@RequestBody ArtistaDTO artista) { return artista;}@PostMapping("/artistas"): el método responde aPOST http://localhost:8080/artistas.@RequestBody ArtistaDTO artista: Spring toma el JSON enviado por el front y lo convierte automáticamente en unArtistaDTO, igual que ya vio con Jackson en el tutorial de la implementación en memoria.return artista: por ahora, sin repositorio de por medio, el método devuelve el mismo objeto que recibió.@ResponseStatus(HttpStatus.CREATED): asegura que la respuesta HTTP tenga código201, en vez del200que Spring pone por defecto cuando un método devuelve un objeto.
Compila para verificar:
./mvnw compile6. Por qué esto todavía no guarda nada
Sección titulada «6. Por qué esto todavía no guarda nada»Fíjate que crearArtista nunca llama a artistaRepository. Es a propósito: hoy
ArtistaRepository solo declara findAll(), no tiene ningún método para agregar un
artista nuevo a la lista en memoria.
7. Un detalle de Jackson: id y albumes llegan en null
Sección titulada «7. Un detalle de Jackson: id y albumes llegan en null»Tu front (si ya construiste el
formulario de creación) envía un
NuevoArtista, un Artista sin id ni albumes. Cuando ese JSON llega aquí, Jackson
convierte lo que sí encuentra y dejar en null lo que no viene en el JSON — el
mismo comportamiento silencioso que ya vio en el
tutorial de la implementación en memoria.
Como crearArtista devuelve el mismo objeto que recibió, la respuesta va a incluir
"id": null y "albumes": null.
8. (Opcional) Agrega un log para depurar
Sección titulada «8. (Opcional) Agrega un log para depurar»Si quieres ver en la consola qué está llegando desde el front:
private static final Logger log = LoggerFactory.getLogger(ArtistaController.class);Y dentro del método, antes del return:
log.info("POST /artistas - body recibido: {}", artista);Puedes apagarlo sin tocar el código Java, cambiando el nivel en
application.properties:
logging.level.co.edu.uniandes.musical.artistas=INFO(Cambia INFO por OFF para apagarlo.)
9. Prueba el endpoint
Sección titulada «9. Prueba el endpoint»Reinicia la aplicación:
./mvnw spring-boot:runY haz la petición, por ejemplo con curl:
curl -X POST http://localhost:8080/artistas \ -H "Content-Type: application/json" \ -d '{ "nombre": "Shakira", "fotoArtistaUrl": "https://picsum.photos/seed/shakira/200", "paisOrigen": "Colombia", "fechaNacimiento": "1977-02-02", "biografia": "Cantante colombiana." }'Deberías recibir:
- Código de respuesta:
201 Created. - Body: el mismo artista que enviaste, más
"id": nully"albumes": null(paso 7).
10. Verificación desde el front
Sección titulada «10. Verificación desde el front»Si ya tienes el formulario de creación construido, revisa que:
- La URL apunte a
http://localhost:8080/artistas. - El header
Content-Type: application/jsonesté presente (Angular lo pone automático cuando envías un objeto conHttpClient.post). - El componente reciba el
201como éxito — los códigos2xxse consideran éxito en RxJS/HttpClient, así que tunextse ejecuta normalmente.
¿Dónde quedaste?
Sección titulada «¿Dónde quedaste?»Al final de este tutorial tienes:
POST /artistasrespondiendo201 Createdcon el artista recibido.- Un endpoint que todavía no persiste nada: el Controller sigue sin Service, y el Repository sigue sin un método de guardado.
- Claridad sobre por qué la respuesta trae
idyalbumesennull, y qué falta para que dejen de estarlo.
Lo que viene después: cuando el módulo necesite validar datos antes de crear un
artista, vas a insertar el Service entre el Controller y el Repository, y a agregar el
método de guardado que hoy le falta a ArtistaRepository — sin tocar el contrato que ya
expone el endpoint.