20260210 API_REST_2 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Pero bueno, después del recreo tenéis clase con él
00:00:02
Ah, bueno, pues entonces lo único es que
00:00:04
No, ha venido
00:00:06
Pero no le hemos dejado entrar
00:00:10
Vale
00:00:11
Los get, todos
00:00:14
El hashcode y el equals, también lo tiene
00:00:15
Y
00:00:18
Y el toString
00:00:19
El toString también lo tiene
00:00:21
Y ya está, y tiene todo eso, constructor sin parámetros
00:00:23
No tiene
00:00:26
Vale, se le pueden añadir métodos
00:00:27
Pero no es lo habitual
00:00:30
Bueno, vamos a hacernos la matrícula de TO
00:00:31
Venga, ¿qué queremos que tenga la matrícula de TO?
00:00:34
Sí, un récord, un récord, un récord
00:00:42
Es que voy en piloto automático
00:00:44
Lo que no queremos que tenga es alumno
00:00:47
Claro, alumno no lo queremos
00:00:48
Vale, pues entonces, matrícula de TO
00:00:50
Matrícula de TO
00:00:55
Se tendría que tener un nombre más específico, ¿no?
00:00:57
Porque matrículas de TO habrá mil
00:01:01
No, matrícula de TO
00:01:02
Es la clase en la que cae
00:01:06
El objeto matrícula
00:01:08
No tiene por qué hacer varios
00:01:10
Ah, bueno, sí, sí, sí, vale
00:01:12
Sí, sí, hay varias consultas con diferentes
00:01:16
Lo puedo, claro, vale, eso sí
00:01:18
Long id
00:01:20
Uy, ¿dónde estoy metiendo yo esto? Perdón
00:01:22
Control x
00:01:24
Esto lo tengo que meter aquí en los paréntesis
00:01:25
Long
00:01:27
El id, vale
00:01:30
¿Qué más hemos dicho que tenía?
00:01:32
La matrícula tiene la fecha, ¿verdad?
00:01:36
Local date, fecha
00:01:40
Y la matrícula tiene el nombre de la asignatura, ¿verdad?
00:01:42
Asignatura
00:01:48
Y tiene algo más
00:01:48
La matrícula, el alumno que es del que queremos pasar
00:01:58
¿Verdad?
00:02:02
Claro, del alumno queremos pasar
00:02:03
Entonces
00:02:07
A ver, porque precisamente nuestro problema
00:02:09
Es cuando yo recupero
00:02:17
Una matrícula, la recupero ya colgando
00:02:19
De un alumno, ¿vale?
00:02:21
Era esto la consulta que hacíamos
00:02:22
Esta, yo recupero mi alumno
00:02:25
Y mi alumno ya viene con la matrícula
00:02:27
Pero dentro de la matrícula no quiero que a la vez
00:02:29
Me aparezca el alumno otra vez, porque uno ya está arriba
00:02:31
si me aparece el alumno
00:02:33
a su vez el alumno tendrá su lista de matrículas
00:02:35
con lo cual, pum, pum, pum, pum, pum, teníamos ese problema
00:02:38
que es lo que
00:02:40
que era para lo que habíamos puesto aquí en origen
00:02:45
el
00:02:48
el JSON ignore, pero claro
00:02:49
esto era un parchecito, no, si
00:02:52
tenemos que evitar tocar el modelo para todo lo que no sea
00:02:53
JPA y
00:02:56
aspectos de negocio, pues de las
00:02:58
columnas de mi tabla
00:03:00
claro, vale, pues entonces matrícula
00:03:02
DTO está y
00:03:04
alumno DTO está
00:03:06
entonces ahora mi controller
00:03:08
que me devuelva un alumno DTO
00:03:09
para eso el servicio me tendrá que devolver
00:03:11
un alumno DTO
00:03:14
entonces me voy al servicio
00:03:16
que
00:03:18
si
00:03:20
entonces
00:03:23
a ver, podría yo aquí en el controller
00:03:25
coger el alumno
00:03:30
y el alumno convertirlo a DTO o hacerlo
00:03:32
en el servicio, vale, pero lo vamos a hacer
00:03:34
en el servicio para que el controller
00:03:36
no se llene de códigos
00:03:38
¿vale? el controller que tenga la parte
00:03:40
más relacionada con la web, todo lo que sea
00:03:42
manipulación de datos al servicio
00:03:44
pues venga, nos vamos aquí
00:03:45
al service
00:03:48
entonces
00:03:49
este de aquí
00:03:51
vamos a dejarlo, pero
00:03:54
para no quitarlo
00:03:55
y vamos a
00:03:59
poner un getAlumno
00:04:01
DTO
00:04:03
¿vale? un getAlumno DTO
00:04:06
Entonces, ahora, ¿qué tenemos?
00:04:09
Tenemos que convertir el alumno, getAlumno de TO,
00:04:18
que me devuelva un alumno de TO.
00:04:25
Y ahora tenemos que convertir a nuestro alumno A,
00:04:28
lo tenemos que convertir en alumno de TO para devolverlo.
00:04:31
Entonces, para eso vamos a hacer primero la lista,
00:04:34
vamos a convertir su lista de matrículas.
00:04:36
Pues entonces, A.getMatriculas,
00:04:39
Vamos a mapear sus matrículas
00:04:41
A mapearlas a matrículas de Teo
00:04:45
¿Verdad?
00:04:47
Entonces
00:04:50
¿Qué vamos a hacer con las matrículas del alumno?
00:04:51
Primero hemos dicho mapearlas a
00:04:54
De Teo
00:04:57
Pues cada matrícula de su alumno
00:04:58
Mapeamela a
00:05:01
Puedo hacer ya directamente
00:05:04
Un new
00:05:06
Sí, ¿verdad?
00:05:07
Un new
00:05:09
Matrícula
00:05:10
DTO con los parámetros
00:05:12
Que serán
00:05:15
X.matriculaDTO
00:05:16
Lo que pasa es que no sé en qué orden iban
00:05:18
Id, fecha y asignatura
00:05:20
Pues entonces
00:05:22
X.getId
00:05:24
X.get
00:05:28
Fecha
00:05:36
Primero, ¿no?
00:05:38
Y x.get
00:05:42
Vale
00:05:45
Asignatura
00:05:45
Y ahora, de cada matrícula me la transforma para cada X, vuelve todo esto y ahora esto lo convierto en toList, pero quería bajar el punto de abajo.
00:05:47
Joder, todavía me da esto
00:06:14
.toList
00:06:20
Vale, entonces a.getMatriculas.toList
00:06:24
Esto será mi lista de matrícula de TO
00:06:34
A ver, ahora repasamos a ver si lo he hecho bien
00:06:41
Vale
00:06:48
Vale, bueno, pues entonces, primero me he creado una lista de matrículas DTO a partir de las matrículas originales del alumno y ahora ya devuelvo un alumno DTO cuyos campos van a ser a.getid, a.getnombre, no sé en qué orden estaban aquí, id, nombre, email y matrículas.
00:06:59
apunto get
00:07:30
email
00:07:34
y las matrículas que acabo de hacer
00:07:36
vale
00:07:38
ya tengo el servicio este
00:07:43
esto lo voy a bajar
00:07:45
aquí abajo y así se ve mejor
00:07:57
vale, pues entonces mi alumno
00:07:59
controller ya puede
00:08:15
llamar a
00:08:17
vamos a
00:08:22
mi alumno controller
00:08:24
ya puede
00:08:27
llamar a getAlumno
00:08:29
DTO
00:08:30
¿vale?
00:08:31
esta versión la hemos dejado comentada
00:08:34
ahora vamos a devolver
00:08:37
el DTO
00:08:39
me devuelve el DTO
00:08:39
y el que va a mapear a JSON es el DTO
00:08:42
ya está
00:08:45
y yo aquí en mi record
00:08:46
ahora ya, que quiero cambiar
00:08:48
las cosas y quiero
00:08:51
poner aquí
00:08:52
anotaciones JSON o quiero meter
00:08:54
campos en el DTO
00:08:57
o quiero lo que sea
00:08:58
pues hago lo que me dé la gana, siempre y cuando en el servicio
00:09:00
lo rellene el alumno DTO
00:09:03
con los campos buenos de la consulta
00:09:05
yo tengo que transformar
00:09:07
de alumno normal a alumno DTO, lo tengo que transformar
00:09:08
¿vale? pero yo aquí en mi DTO
00:09:10
meto lo que me dé la gana
00:09:12
da igual, no pasa nada, lo ensucio
00:09:14
transformo los campos
00:09:16
hago lo que sea, no pasa nada
00:09:18
este si es su sitio, el sitio para hacerlo
00:09:20
pero el sitio nunca sería
00:09:22
el modelo, aquí nunca sería
00:09:24
Pues me apetece que en esta consulta salga algo
00:09:26
Pues le voy a meter aquí un modelo
00:09:28
Y luego en el servicio que me cree este campo
00:09:30
No, alumno y matrícula no lo tocamos
00:09:32
Son las tablas, ya está
00:09:35
Pero aquí tocamos y hacemos lo que nos da la gana
00:09:36
Vale, pues vamos a ver
00:09:39
Si hemos hecho esto bien
00:09:42
Pues sí, lo hemos hecho estupendo
00:09:44
Vamos a quitar el ID a las matrículas
00:09:57
Porque es que como lo hemos dejado igualito
00:10:01
Es que ni siquiera vemos la diferencia de cómo estaba antes
00:10:03
Pero es que como
00:10:05
Tú siempre protestando
00:10:09
Pues no me apetece a mí que salga
00:10:11
Vamos a quitar el ID de matrícula de Teo
00:10:13
Para que no me salga el ID
00:10:25
Entonces eso significa
00:10:25
Que aquí en mi matrícula de Teo
00:10:27
Le quito este campo
00:10:30
Le quito este campito cuando la construyo
00:10:31
¿Vale?
00:10:34
Le quito este campito aquí en el constructor
00:10:35
Vamos a ver
00:10:38
Venga, dame el alumno 1
00:10:42
Pumba, aquí está mi alumno 1
00:10:50
Mucho más bonito, sin idea de matrícula
00:10:54
¿Vale?
00:10:56
Pues la forma de
00:10:57
Uy, ¡ah!
00:10:59
Claro, cuando yo toco esto
00:11:02
Este ordenador se vuelve loco
00:11:04
Claro, la sensibilidad de la pantalla
00:11:05
Está conectada a este equipo de aquí
00:11:10
bueno pues
00:11:12
que bonito y que chulo y que bien
00:11:15
pero
00:11:17
nos falta
00:11:19
y con esto ya, bueno la verdad es que
00:11:21
nos faltan hacer métodos muchísimo
00:11:23
mejores y más guapos en el repository
00:11:25
pero
00:11:27
vamos a hacer
00:11:32
para consultas está claro
00:11:36
esta es la película y no hay más película
00:11:38
que esta, ya está
00:11:40
Luego, ¿qué más película hay?
00:11:42
Pues que yo me haga métodos en el repositorio
00:11:44
Súper chulos
00:11:47
Para hacer cosas
00:11:48
Recuperar alumnos, por ejemplo
00:11:49
Imaginaos que queremos
00:11:51
Recuperar
00:11:53
Todos los alumnos que estén matriculados
00:11:55
En una asignatura
00:11:57
Podría ser una consulta
00:11:59
Que yo quiero hacer perfectamente
00:12:02
Quiero hacer un
00:12:04
Una API REST
00:12:05
Que yo ponga
00:12:09
Nombre, asignatura
00:12:10
y me saque los nombres de los alumnos.
00:12:11
Eso estaría muy bien, hacerlo por API REST.
00:12:15
Vale, pues entonces, ¿en qué chip nos pondríamos para hacer eso?
00:12:18
Primero, necesito un método de repositorio,
00:12:21
un método de servicio que lo haga, lógicamente.
00:12:23
El método de servicio necesita un método de repositorio.
00:12:26
Vale, pues entonces, recuperar alumnos por nombre asignatura.
00:12:29
¿En qué repositorio lo pondríamos?
00:12:34
¿Alumno repository o matrícula repository?
00:12:35
Recuperar alumnos.
00:12:40
¿Alumnos?
00:12:41
Recuperar alumnos.
00:12:42
El sitio es el tipo de dato devuelta, no el tipo de dato por el que filtras.
00:12:43
Tú puedes filtrar por matrícula, por Pepito Pérez, por tamaño de las orejas.
00:12:49
Pero lo que marca es lo que tú devuelves.
00:12:54
Luego, nos iríamos a alumno repository.
00:12:57
Sí, es verdad que surgió contigo sobre qué criterios para colocarlo.
00:13:03
El tipo de dato devuelta.
00:13:08
Entonces, alumno repository.
00:13:10
Estoy en el buen sitio, sí
00:13:12
Vale, me voy a hacer ese método
00:13:14
Este no va por clave primaria
00:13:16
Luego este me va a devolver
00:13:22
Aquí nada de alumno DTO
00:13:24
No, no, no
00:13:26
Esto está tocando al modelo, a la base de datos
00:13:27
Entonces el repositorio trabaja con el modelo
00:13:30
El que trabaja con DTO si quiere es el servicio
00:13:32
El servicio sí, el repositorio no
00:13:36
Aquí no ve DTO ni ve nada
00:13:38
Porque me devuelve de la base de datos
00:13:40
Vale, entonces
00:13:42
Aquí podríamos hacerlo como query
00:13:43
¿Verdad?
00:13:46
Pero
00:13:48
Recordad que uno podría hacer métodos propios
00:13:48
Eh
00:13:53
Ay
00:13:54
Que ansiedad me produce que me lo ponga así en azulito
00:13:56
Bueno
00:13:59
Pero recordad que uno puede hacer métodos propios
00:14:00
Si respetan ciertas reglas
00:14:03
Con el, con esto
00:14:05
Por ejemplo, si alumno
00:14:06
Tiene una cosa que es nombre, ¿no?
00:14:08
Por ejemplo
00:14:10
Recordad que si yo pongo
00:14:11
Esto
00:14:14
String nombre
00:14:16
Pues, ah, ya me lo ha quitado
00:14:19
Menos mal, me está dando mucha angustia
00:14:22
Vale, recordad que
00:14:24
Si ponemos esto, automáticamente
00:14:26
Ya genera una consulta
00:14:28
Que es select by un campo
00:14:30
Que sea nombre, con la n en minúscula
00:14:32
¿Lo hay?
00:14:34
Si lo hay, entonces estupendo, todo va a funcionar
00:14:36
No lo hay, pues lo hemos liado
00:14:38
¿Lo hay?
00:14:39
si lo hay, hay un campo de nombre
00:14:40
o podría recuperar por email o lo que fuera
00:14:43
¿vale?
00:14:45
pero también podemos recuperar
00:14:46
por campos dentro
00:14:49
de campo sin hacer la query
00:14:51
podemos hacer la query, que el otro día de hecho
00:14:53
para hacer eso, recuperábamos clientes
00:14:54
por concepto de pedido
00:14:57
nos hicimos una query
00:14:59
pues no hace falta, este sería lo mismo
00:15:00
recuperamos alumnos
00:15:02
por nombre de la asignatura
00:15:05
pues entonces yo puedo
00:15:07
Poner, bye
00:15:09
Alumno, ¿qué tiene dentro?
00:15:10
Matrículas
00:15:13
Me quiero meter en matrículas
00:15:14
Pues pongo
00:15:16
Matrículas
00:15:18
Y ahora dentro de matrículas
00:15:24
Me quiero meter, ¿dónde?
00:15:26
Este
00:15:29
Pues asignatura
00:15:29
Siempre empezando por mayúscula
00:15:32
Como los get
00:15:34
Y aquí pues nombre asignatura
00:15:35
¡Hala! Pues la query
00:15:38
Me la va a hacer solito
00:15:41
Se mete dentro de alumnos
00:15:41
Se mete en matrículas
00:15:46
Y dentro de matrículas busca
00:15:47
Las asignaturas
00:15:49
Dentro de las matrículas del alumno
00:15:55
Que se llamen así
00:15:57
Y te devuelve el alumno
00:15:59
Que encuentra asignaturas
00:16:01
Y ya está y te hace la cuernisola
00:16:02
Entonces te puedes ir metiendo
00:16:04
Sí, lo que pasa es que
00:16:05
Normalmente en un modelo con base de datos
00:16:09
como las claves llegan hasta donde llegan
00:16:11
no sueles tener anidado
00:16:14
hasta más de un nivel de anidamiento
00:16:15
aquí lo único que ocurriría es que
00:16:17
si un alumno
00:16:20
estuviera matriculado
00:16:21
de la misma asignatura dos veces
00:16:24
me lo metería en la lista
00:16:26
dos veces
00:16:28
pero es que aún así Sprint estar apañado
00:16:29
que aún así se puede arreglar porque
00:16:36
él admite el este
00:16:38
Disting
00:16:39
Incluso eso se puede arreglar
00:16:40
Entonces, ¿qué quiero decir?
00:16:44
Que hay un mundo de posibilidades
00:16:46
Para hacer métodos
00:16:48
Solo con los nombres sin las queries
00:16:50
Que cubrirían
00:16:51
Pues a lo mejor el 80, el 85%
00:16:53
El 90% de todo lo que uno necesita hacer
00:16:56
En una aplicación normal
00:16:57
Claro, cuando ya quieres hacer pues
00:16:59
JoinFetch o cosas más específicas
00:17:01
Pues plantas la query y ya está
00:17:04
O simplemente cuando no te acuerdas
00:17:05
Como me ocurre a mí en la mayoría de los casos
00:17:06
que no me acuerdo que hay una sintaxis
00:17:08
que te...
00:17:10
¿Haces tu query?
00:17:11
¿Haces la query?
00:17:12
¿O algo?
00:17:13
O sea, esto no te cargaría
00:17:13
el alumno con todo.
00:17:15
Bueno, esto depende del lazy.
00:17:18
¿Vale?
00:17:20
Claro, si tú quieres saltarte el lazy,
00:17:21
te pones aquí una query con el join fetch.
00:17:24
¿Vale?
00:17:27
Vale, pues entonces,
00:17:28
ahora,
00:17:30
lo que os dejaría a vosotros,
00:17:32
pues haced el método de servicio,
00:17:34
el método de controller,
00:17:36
para que vosotros pongáis aquí
00:17:37
en la URL
00:17:40
pues API alumnos y un nombre
00:17:41
de asignatura, ah no, eso no puede ser
00:17:44
porque se confundiría con esta otra
00:17:46
pues por ejemplo, API alumnos
00:17:47
asignatura barra
00:17:50
un nombre y que devuelva
00:17:52
todos los alumnos matriculados de esa asignatura
00:17:54
por ejemplo, ¿vale?
00:17:55
entonces, faltaría hacer
00:17:58
método de servicio, DTO
00:17:59
si hace falta porque no se pueden reutilizar esos
00:18:02
y el método del controller
00:18:04
en la ruta correspondiente
00:18:05
para que si me pone aquí
00:18:07
matemáticas.
00:18:08
Le salgan los alumnos
00:18:10
que tienen matemáticas.
00:18:12
Que no quiere que le salgan
00:18:13
los alumnos con todos
00:18:15
los datos completos.
00:18:16
Se tendría que hacer
00:18:17
un alumno de TO para ellos.
00:18:18
Si no se hace un alumno
00:18:19
de TO para ellos,
00:18:20
le salen los alumnos
00:18:21
por todo.
00:18:22
¿Vale?
00:18:23
Pues venga,
00:18:24
pues eso lo dejamos
00:18:25
para que lo hayáis vosotros.
00:18:26
Y ahora,
00:18:27
esto.
00:18:29
Bueno, pues todo lo que
00:18:34
estamos haciendo son consultas.
00:18:35
y consultas como veis se pueden hacer
00:18:41
pero que pasa si quiero yo
00:18:43
insertar datos
00:18:46
dime
00:18:47
claro
00:18:48
claro, tu primero tendrías que hacer tu método
00:18:55
de servicio, está claro que es
00:18:58
recuperame alumnos por asignatura
00:18:59
te haces tu método de servicio que llama a este
00:19:02
ese no tiene mayor problema
00:19:04
que problema tiene, que lo que te devuelve
00:19:05
tu ya no quieres que sea
00:19:08
a un alumno, sino una list de alumnos,
00:19:10
una list de alumnos DTO.
00:19:11
Con lo cual tendrás que transformarlo. Luego en el servicio
00:19:13
tienes como dos problemas.
00:19:16
Llamar al método, ese fácil,
00:19:18
y luego la lista de alumnos, transformar la lista
00:19:19
de alumnos DTO.
00:19:22
Reutilizas el mismo DTO
00:19:24
si quieres que en esta
00:19:26
que en este resultado te salga
00:19:27
todos los datos de cada alumno.
00:19:29
Te haces otro DTO si quieres que
00:19:31
en esa consulta solo te salga
00:19:33
nombre del alumno, por ejemplo.
00:19:35
Eso por un lado. Eso en el servicio.
00:19:38
Y luego, en el controller, tendrías que hacerte otro de estos.
00:19:40
Otro de estos con otra ruta distinta.
00:19:45
¿Vale?
00:19:49
Y aquí que llamara a ese método de servicio.
00:19:50
Y ya está.
00:19:53
¿Vale?
00:19:54
No habría que hacer más que eso.
00:19:54
Venga, esto es rápido en realidad.
00:20:07
Si no sale a la primera, rápido.
00:20:09
Para consultas está claro.
00:20:11
Ahora vamos a intentar a través de nuestra API REST,
00:20:12
vamos a intentar meter cosas también,
00:20:17
darle mi alumno y que lo
00:20:19
inserte, o sea, darle
00:20:21
yo datos. Se los tengo que dar en JSON.
00:20:23
En la URL.
00:20:25
O en la petición
00:20:27
HTTP, que puede ir en URL
00:20:29
si es GET o en el cuerpo si es
00:20:31
POST. En este caso va a ser POST, porque
00:20:33
no puedes mandar un JSON como
00:20:35
parámetros de...
00:20:37
Hombre, sí, como poder puedes un pedazo de string que
00:20:39
te cagas y que lo recupere como request
00:20:41
param y lo vuelque. Pero, hombre,
00:20:43
es feo. Aparte de que estás
00:20:45
mandando. Todos los datos del alumno
00:20:47
ahí.
00:20:49
¿Puedes poner
00:20:52
algunos?
00:20:53
Hombre,
00:20:57
mandabas un fichero de texto entero
00:20:59
en la URL de arriba.
00:21:01
Hace años, o sea, a principios de los 2000
00:21:02
que las páginas web hacían muchas cosas de esas.
00:21:04
Hace años, joder.
00:21:06
Ya, pero a principios de los 2000
00:21:07
estábamos todos pensando en otras cosas.
00:21:10
Bueno, vosotros ni pensabais.
00:21:13
Ahora tampoco.
00:21:15
Bueno
00:21:17
Jolín, pues si quieres enano
00:21:24
Tú, ¿no?
00:21:29
O sea, tus padres fue conocerse y tenerte
00:21:30
Porque vamos
00:21:33
Estamos hablando del 2000
00:21:34
Madre del amor hermoso
00:21:35
Eso es lo que tener claridad de ideas
00:21:41
Yo quiero un padre
00:21:46
es un padre de mi hijo
00:21:47
oye a ver
00:21:49
ahora va a salir el tema escabroso
00:21:51
la pregunta de, pero seguro que fuiste deseado
00:21:52
pero mejor la dejamos para luego
00:21:55
venga
00:21:57
controller
00:21:59
que bonito es el amor
00:22:02
¿y siguen juntos a todo esto?
00:22:08
oye, porque es que
00:22:11
no, porque una cosa tan rápida
00:22:12
Y yo le diría, joder, se precipitaron, pero mira, ¿no?
00:22:15
No se precipitaron
00:22:17
Su amor es verdadero
00:22:18
Y en un garito, además
00:22:21
O sea, todas las papeletas para que fuera un desastre
00:22:27
Nada, una historia muy bonita, hombre
00:22:29
Di que sí
00:22:38
Bueno, pues entonces
00:22:41
como nosotros no queremos
00:22:45
todo esto venía a cuento
00:22:47
queremos pasar nuestro JSON con datos
00:22:48
en la URL, no, aunque antes de que
00:22:51
naciera Pablo lo hicieran, pero nosotros ya
00:22:53
no lo hacemos, entonces queremos que la
00:22:55
petición sea post, vale
00:22:57
pues vamos a hacernos un método
00:22:59
pero no anotado con
00:23:00
con get
00:23:03
sino con post, vale
00:23:05
anotado con get sino con post
00:23:07
entonces
00:23:09
donde queremos que cuelgue
00:23:10
si yo no le pongo aquí nada
00:23:15
cada vez que llega una
00:23:16
petición post
00:23:19
con esta url
00:23:20
siendo post, va a buscar en el
00:23:22
request, en el body, el json
00:23:25
lo va a insertar y ya está
00:23:27
entonces lo puedo dejar así, pero bueno
00:23:28
como puede que haya más post de modifica
00:23:30
de no se que, pues vamos a hacerle
00:23:33
aquí, venga, cuando
00:23:35
yo te haga un insert
00:23:36
vale, por ejemplo
00:23:38
vale, a ver
00:23:40
entonces, este
00:23:41
método le damos un hombrecito público vale no que nos devuelva el alumno
00:23:44
insertado pues para ver por ejemplo su idea y todo eso no esto es lo inserta y
00:24:02
no lo da de vuelta, tú lo puedes ignorar si quieres
00:24:08
vale, lo puedes ignorar
00:24:10
y ahora
00:24:12
pues este
00:24:13
pues para ver
00:24:15
el ID autogenerado, por ejemplo
00:24:18
porque a la hora de hacer la persistencia
00:24:20
tú el ID no se lo puedes pasar
00:24:23
pero genera él
00:24:24
insert y ahora
00:24:25
aquí hay que decirle
00:24:28
oye tú
00:24:30
lo que
00:24:31
tienes que coger, cógelo
00:24:34
del
00:24:37
Cógelo del body
00:24:37
¿Vale?
00:24:44
Del body tienes que coger el parámetro
00:24:48
El dato, ¿vale?
00:24:51
Del body
00:24:52
Y lo tienes que mapear a un DTO
00:24:53
¿Vale?
00:24:56
¿Nos vale el DTO de antes?
00:24:58
Bueno, nos vale
00:25:01
Porque el DTO de antes tiene un campo id
00:25:02
Y nosotros cuando le pasemos un alumno
00:25:04
Le vamos a pasar el id
00:25:06
le pasamos el nombre y el email
00:25:07
lo queremos hacer pasándole matrículas
00:25:10
también, bueno, pues ni siquiera
00:25:12
podríamos construirlo con las matrículas
00:25:13
un JSON con todas las matrículas y pasárselo
00:25:15
pero no vamos a hacer un JSON más sencillo
00:25:17
pero lo que sí que le vamos a pasar
00:25:19
es el ID, entonces este DTO
00:25:22
no nos vale
00:25:24
porque, claro, porque esto es para
00:25:25
insertar, entonces el ID lo va a generar
00:25:30
solo la base de datos, tú insertas
00:25:32
un alumno con nombre e email, entonces
00:25:33
le tenemos que pasar un objeto que no tenga
00:25:35
el id, entonces un alumno de teo
00:25:37
no me vale y un alumno por supuesto tampoco
00:25:39
pues un alumno
00:25:41
inserta
00:25:44
de teo
00:25:45
y tan ricamente, no pasa nada, nos hacemos todos
00:25:46
los de teos que sean necesarios
00:25:49
si para eso estamos
00:25:51
en la clase alumno
00:25:52
el constructor tiene que tener
00:25:53
como para un id
00:25:56
en la clase alumno a secas
00:25:58
si
00:26:02
a ver
00:26:06
Que quería hacer aquí
00:26:08
A parar esto
00:26:11
Juro que nos da tiempo
00:26:12
Os lo prometo
00:26:14
¿Tenéis arrancado el postman incluso?
00:26:15
Nos da tiempo
00:26:19
Vale, es que
00:26:20
A ver, que no nos podemos ir así
00:26:21
¿Eh?
00:26:26
¿Eh?
00:26:28
¿Cómo hacer ojo en cinco?
00:26:32
Vale, entonces
00:26:35
A ver, es cierto que nos falta
00:26:36
Hacer el alumno inserta DTO
00:26:40
Nos falta hacer el método de servicio
00:26:42
Que se hacen dos patadas
00:26:45
Ah, bueno, sí, sí, perdón
00:26:47
Nos falta el nombre de la variable
00:26:51
Que es DTO
00:26:53
¿Vale?
00:26:55
Nos falta hacer el método de servicio
00:26:56
¿Vale?
00:26:58
Entonces, aquí
00:27:04
Bueno, vamos a hacer hasta donde nos dé tiempo
00:27:06
Entonces vamos a hacer nuestro DTO
00:27:10
Alumno inserta DTO
00:27:12
Que es que me estoy angustiando
00:27:13
Por vuestra culpa todo
00:27:15
A ver
00:27:17
Alumno inserta DTO
00:27:18
Vale
00:27:26
El alumno inserta DTO
00:27:26
Solo queremos que tenga
00:27:28
Un
00:27:30
Nombre
00:27:33
Y un email
00:27:36
Ala, tan bonito
00:27:42
Ya está, el DTO
00:27:44
Finiquitado
00:27:46
Vale
00:27:48
No, no, no, no
00:27:49
Porque yo creo que el alumno que me devuelva
00:27:52
Sea con el campo ID
00:27:54
Vale, entonces alumno DTO
00:27:57
Si tiene el ID
00:27:59
Vale, entonces alumno inserta
00:27:59
DTO, ya lo tengo
00:28:03
Vale, entonces, ahora
00:28:04
¿Qué me tiene que devolver esto?
00:28:06
Pues el método de servicio
00:28:09
Ahora vamos a hacer
00:28:10
El método de servicio que nos falta por hacer
00:28:11
Create
00:28:14
Créame
00:28:16
A
00:28:16
Este
00:28:19
Este método de servicio
00:28:21
Lo tenemos que hacer ahora
00:28:24
Este es el método de servicio
00:28:25
Que yo le paso este DTO
00:28:28
Y me hace el save
00:28:30
Del repositorio
00:28:31
Entonces
00:28:33
Y me tiene que volver un DTO construido
00:28:35
a partir de esto. Entonces, venga, alumno service, ¿dónde está? Pues alumno service, public, alumno de teo, create, le paso un alumno inserta, inserta de teo, de teo, vale.
00:28:38
Entonces, ¿qué tiene que hacer este? Pues este, lo que tiene que hacer es construir un alumno con estos datos y hacerle el save, ¿vale? No, un alumno normal, porque este llama al repositorio.
00:29:04
alumno a
00:29:20
igual
00:29:21
a new alumno
00:29:23
y ahora
00:29:26
a.setEmail
00:29:27
dto.
00:29:30
dto.
00:29:33
Debería estar el get
00:29:40
dto.
00:29:42
No, no es el momento de que nos pasen cosas.
00:29:44
Sí, a mí me llevan pasando eso.
00:29:50
Ah, perdón
00:29:51
Tienes toda la razón
00:29:56
Vale
00:30:02
A ver, ¿qué me estoy poniendo a poner?
00:30:03
Sed
00:30:06
Fatal
00:30:06
Me siento fatal
00:30:08
Vale, entonces
00:30:10
¡Nya, ña, ña!
00:30:15
pero yo no me pongo tan repelente
00:30:18
repo alumno
00:30:22
punto save
00:30:25
vale
00:30:26
save
00:30:27
ea
00:30:29
y ahora, para construir el DTO
00:30:31
necesitamos el id
00:30:34
que no lo sabemos, pero es que este save
00:30:35
del repositorio es tan listo
00:30:38
que nos devuelve el objeto persistente
00:30:40
pues vamos
00:30:42
a guardarlo aquí
00:30:44
el persistido
00:30:46
El persistido
00:30:47
Y ahora yo ya me hago un DTO
00:30:49
Que es el que devuelvo
00:30:50
Pues me hago
00:30:51
Un
00:30:53
Alumno DTO
00:30:55
Que tenga
00:31:00
Que tenga
00:31:02
Upper.get
00:31:04
Id
00:31:07
Coma
00:31:08
Upper.get
00:31:10
Nombre
00:31:13
alumnopersistente.get
00:31:14
email
00:31:19
y alumno.get
00:31:21
matrículas, que será vacío
00:31:24
pero bueno, como el constructor
00:31:26
del DTO lo pide
00:31:27
return new
00:31:29
el del DTO
00:31:32
alumno sí, pero era matrícula de DTO
00:31:38
entonces tendría
00:31:40
que pasar las matrículas
00:31:42
a DTO
00:31:44
Pero
00:31:46
Sí, haciéndolo otro
00:31:47
Esto de aquí, efectivamente
00:31:50
Esto de aquí
00:31:52
Qué rápidos sois
00:31:53
Vale, entonces me hago esto de aquí
00:31:57
Y le paso más
00:32:01
Vale
00:32:03
Y esto sería de
00:32:09
Aper, muy bien
00:32:14
Aunque bueno, va a estar vacía la lista, pero bueno
00:32:15
a perder matrículas, bla, bla, bla
00:32:18
y lo demás está bien, ¿no?
00:32:21
vale
00:32:24
venga, pues entonces
00:32:24
ya tengo el método de servicio
00:32:27
completamente hecho
00:32:29
que le paso el alumno inserta DTO
00:32:31
y me devuelve el alumno DTO
00:32:33
ahora, el controller
00:32:34
el controller, la respuesta de inserta
00:32:35
si yo soy capaz
00:32:39
de pasarle en el body
00:32:40
un alumno inserta DTO
00:32:42
me lo insertará
00:32:44
y me lo devuelve
00:32:46
con su ID y con todo si yo quiero manejarlo
00:32:48
vale, pues ahora
00:32:50
esto ya es lo último
00:32:52
que nos falta
00:32:54
no sé cuál es tu pregunta
00:32:55
¿por qué no se va a pasar bien?
00:32:58
se pasa muy bien
00:33:03
se pasa estupendo
00:33:04
vale, ahora, ¿cómo paso yo
00:33:05
cómo hago yo una petición post
00:33:08
con un JSON en el body?
00:33:10
pues hombre, desde el navegador casi que no
00:33:11
postman
00:33:14
Pues ahora es cuando arrancáis Postman, que es un cliente para hacer peticiones GET y POST a un navegador de forma muy simple, ¿vale? Entonces, arrancamos Postman, vemos a ver si funciona y solucionamos.
00:33:15
claro, pues con Postman
00:33:32
que es el cliente
00:33:37
típico para hacer pruebas
00:33:39
de los API REST
00:33:41
vale
00:33:42
entonces
00:33:43
fijaos en Postman, en Postman tú le dices
00:33:45
la ruta
00:33:49
en la que está
00:33:51
el API REST colgando
00:33:53
si el método es POST
00:33:54
o GET y aquí le pasas
00:33:56
los parámetros, el cuerpo
00:33:59
que es lo que nos importa aquí a nosotros
00:34:00
entonces, yo, bueno, espera
00:34:02
voy a relanzar esto
00:34:04
voy a relanzar el este, no vaya a haberlo liado
00:34:06
con lo que he hecho, y empieza a apretar
00:34:08
todo
00:34:10
bueno, la aplicación
00:34:11
se lanzó
00:34:17
la aplicación se lanzó, ahora, ¿dónde está escuchando?
00:34:17
la mía está escuchando en API alumnos
00:34:20
inserta
00:34:22
entonces, API
00:34:24
API alumnos
00:34:26
inserta, aquí está
00:34:32
y es post, ¿vale?
00:34:34
Bueno, aquí va
00:34:36
A ver
00:34:37
API alumnos, inserta
00:34:39
Vale, esta es mi ruta
00:34:42
Del API REST, quiero que vaya por post
00:34:44
Lo que me importa es el body
00:34:46
El body
00:34:48
Vale, el body
00:34:50
Quiero que yo sea Jason, pues lo pongo aquí
00:34:52
Vamos a ver
00:34:54
Aquí en mi DTO
00:34:56
Alumnos, inserta DTO
00:35:00
Es nombre e email
00:35:02
No hay anotaciones
00:35:04
JSON, con lo cual
00:35:05
Tiene que llamarse nombre e email
00:35:07
Efectivamente
00:35:10
Esto mapea a la perfección
00:35:11
Esa entidad, vale
00:35:13
Lo mapea a la perfección
00:35:15
Ya está
00:35:16
Y ahora cuando ya he puesto el cuerpo
00:35:25
Yo le doy a send
00:35:27
Perfecto
00:35:29
Me lo inserta
00:35:32
Aquí me ha devuelto el DTO
00:35:34
¿Veis? El DTO
00:35:36
matrículas vacías como era de esperar
00:35:38
el ID, el 5
00:35:40
si lo voy a
00:35:42
verificar en la base de datos, lógicamente
00:35:44
que me ha insertado el alumno
00:35:46
y aquí tengo mi alumno
00:35:48
¿vale? pues magnífico
00:35:50
pues ya está, con esto
00:35:54
podéis hacer
00:35:57
cualquier cosa, cualquier microservicio
00:35:58
API REST con Spring Boot, ya está
00:36:00
no hay que saber más
00:36:02
a ver, ¿qué más
00:36:04
cosas luego hay?
00:36:06
¿Qué cosas me he saltado?
00:36:08
Validaciones.
00:36:11
La parte de Spring de validación.
00:36:12
Spring Security, por supuesto.
00:36:13
Pues hay un montón de módulos.
00:36:16
Spring Security, Spring Validation,
00:36:18
Spring no sé qué.
00:36:20
Vale, pero esto es el...
00:36:21
Spring ya te regula la seguridad
00:36:23
de los títulos que hacías antes de las inserciones
00:36:25
de SQL dentro de la URL.
00:36:27
La gente hacía inserciones
00:36:31
de URL para...
00:36:32
No, claro, es que aquí inyección no puedes hacer
00:36:34
Porque aquí los campos no van por
00:36:36
O sea, tú puedes meter un campo
00:36:40
Que va a ir al final al repositorio
00:36:42
Desde la url
00:36:44
Pero ese no va a ir concatenado
00:36:45
Claro, la bjbc de debajo no
00:36:47
O sea, inyecciones SQL
00:36:49
No se puede hacer, no hace falta que pongas Spring Security
00:36:51
No hace falta
00:36:53
Bueno, pues habéis visto que bonito y que bien todo
00:36:54
Eh...
00:36:58
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Segundo Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 1
- Fecha:
- 10 de febrero de 2026 - 13:56
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 37′
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 154.67 MBytes