Contenido del curso
Entendiendo las partes de la programación funcional
- 2

Funciones en Programación Funcional: Conceptos Básicos
03:15 min - 3

Funciones como Ciudadanos de Primera Clase en Programación
02:39 min - 4

Funciones Puras: Concepto y Ejemplos Prácticos
04:05 min - 5

Efectos Secundarios en Programación y su Impacto en el Código
03:12 min - 6

Funciones de Orden Superior en Programación
02:28 min - 7

Funciones Lambda en Programación Funcional Java
03:30 min - 8

Inmutabilidad de Datos en Programación Funcional con Java
11:16 min
Functional Programming en Java
- 9

Programación Funcional en Java SE: Conceptos y Prácticas
00:06 min - 10

Programación Funcional en Java: Práctica y Ejemplos en IntelliJ
02:48 min - 11

Programación Funcional en Java: Creación y Uso de Funciones
04:03 min - 12

Programación Funcional con Predicados en Java
04:57 min - 13

Interfaz Consumer y Supplier en Java: Uso y Ejemplos Prácticos
03:54 min - 14

Funciones Java para Transformación de Datos y Operaciones Binarias
07:10 min - 15

Creación y Uso de Interfaces Funcionales Personalizadas en Java
08:51 min - 16

Métodos de Referencia en Programación Funcional Java
04:46 min - 17

Inferencia de tipos en Java: funciones y métodos
03:53 min - 18

Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones
12:46 min - 19

Interfaz Funcional en Java: Creación y Uso de Métodos Default
04:59 min - 20

Encadenamiento de Llamadas en Programación Orientada a Objetos
03:52 min - 21

Composición de Funciones en Programación Funcional
06:06 min
Optional y Streams: Datos mas interesantes
- 22

Uso de la Clase Optional en Java para Manejo de Valores Nulos
12:59 min - 23

Manipulación de Streams en Java: Operaciones y Limitaciones
10:18 min - 24

Programación Funcional en Java: Uso de Streams y Operaciones Terminales
07:21 min - 25

Operaciones de Stream en Java: Intermedias y Finales
05:05 min - 26

Operaciones y Concurrente con Stream en Java
05:51 min - 27

Operaciones Terminales en Java Streams
06:18 min - 28

Operaciones Intermedias en Streams de Java
09:21 min - 29

Conversión de Strings a Listas de Enteros en Java
06:14 min
Todo junto: Proyecto Job-search
- 30

Construcción de Proyecto para Buscar Empleo Usando APIs
01:17 min - 31

Configuración y Uso de Gradle en Proyectos Java con IntelliJ
03:23 min - 32

Creación de una Herramienta de Búsqueda de Trabajo en Terminal
01:51 min - 33

Creación de Puntos de Entrada y Dependencias en Proyectos Java
05:53 min - 34

Creación de APIs RESTful con Feign y Spring Boot
Viendo ahora - 35

Creación de una Interfaz de Línea de Comandos con JCommander
13:05 min - 36

Validación de Argumentos en Terminal con Clases en Ciel
04:31 min - 37

Procesamiento de Argumentos y Solicitudes API en Java
11:38 min - 38

Creación de API para búsqueda de empleos con Java y CLI
08:31 min
Conclusiones
Creación de APIs RESTful con Feign y Spring Boot
Resumen
Construir un cliente HTTP que consuma una API REST puede parecer complejo, pero con Feign el proceso se reduce a definir una interfaz y dejar que la librería haga el trabajo pesado. A continuación se explica paso a paso cómo estructurar un proyecto Java para consumir la API de GitHub Jobs, desde la creación de la interfaz hasta el aislamiento de dependencias mediante funciones puras.
¿Cómo se define la interfaz de consumo con Feign?
El punto de partida es crear un paquete llamado api donde vivirá toda la lógica de comunicación con el servicio externo [0:10]. Dentro de ese paquete se crea una interfaz — no una clase — llamada ApiJobs. Feign trabaja precisamente con interfaces: nosotros describimos qué queremos consumir y la librería genera la implementación.
La interfaz contiene un método que devuelve una lista de objetos JobPosition. Para que Feign sepa cómo realizar la petición, se utilizan tres anotaciones clave [0:46]:
@Headers: indica las cabeceras HTTP; en este casoAccept: application/json, porque la API devuelve JSON.@RequestLine: describe el verbo y la ruta, por ejemploGET /positions.json, tal como aparece en la documentación de GitHub.@QueryMap: recibe unMap<String, Object>con los parámetros que se enviarán como query string en la URL.
Con estas tres anotaciones queda completamente definido el comportamiento de la petición web sin escribir código de conexión manual [1:15].
¿Qué es un POJO y cómo se mapea la respuesta JSON?
Para representar cada oferta de trabajo que devuelve la API se crea la clase JobPosition [1:30]. Este tipo de objeto se conoce como POJO (Plain Old Java Object): una clase sencilla con propiedades, getters y setters, sin lógica de negocio.
Los campos de la clase corresponden a los datos que entrega la API de GitHub:
id,type,url,title,location,description— se nombran igual que en el JSON, por lo que no requieren configuración adicional.createdAt,companyUrl,companyLogo— tienen nombres distintos en el JSON (created_at,company_url,company_logo), así que se anota cada campo con@SerializedNamepara indicar el nombre real dentro del objeto JSON [1:55].
Por ejemplo, aunque la fecha de creación es técnicamente una fecha, se almacena como String porque ese es el tipo que la API devuelve directamente. Esto simplifica el mapeo y evita conversiones innecesarias [1:48].
¿Cómo se generan los getters y setters rápidamente?
Desde el IDE basta con usar la opción Generate → Getters and Setters, seleccionar todos los campos y confirmar [2:40]. Así la clase queda lista para que el decoder de JSON pueda poblar cada propiedad automáticamente al recibir la respuesta.
¿Por qué aislar la construcción del cliente en una función estática?
Una vez definida la interfaz y el POJO, se necesita una forma de instanciar el cliente Feign. Para ello se crea una interfaz auxiliar llamada ApiFunctions con un método estático y genérico: buildApi [3:05].
java static <T> T buildApi(Class<T> clazz, String url) { return Feign.builder() .decoder(new GsonDecoder()) .target(clazz, url); }
Este método recibe la clase de la API y la URL base, construye el cliente y decodifica las respuestas con JSON [3:20]. Aislarlo ofrece ventajas importantes:
- Encapsulamiento: el resto del código desconoce que internamente se usa Feign. Si mañana se reemplaza por otra librería, solo cambia esta función.
- Función pura: dados los mismos parámetros, siempre devuelve el mismo tipo de objeto, lo que facilita las pruebas y el mantenimiento [3:40].
- Bajo acoplamiento: ningún otro módulo importa Feign directamente, lo que reduce el impacto de cambios futuros en las dependencias.
Este patrón de diseño permite intercambiar librerías HTTP de forma transparente, algo especialmente valioso cuando un proyecto crece y las necesidades cambian.
¿Has implementado clientes REST con Feign o prefieres otra librería? Comparte tu experiencia y las ventajas que has encontrado.