Rutas y HttpRoutes
Defina endpoints de forma funcional
Rutas y HttpRoutes es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
Qué es http4s
http4s es una biblioteca HTTP puramente funcional para Scala, basada en cats-effect y los streams de fs2. Las solicitudes y respuestas son valores inmutables, y los efectos se encapsulan en un tipo de efecto polimórfico F[_], como IO.
En lugar de modificar un servlet, describe un servicio HTTP como una función que transforma una solicitud en una respuesta opcional con efectos.
El tipo HttpRoutes
La abstracción principal es HttpRoutes[F], un alias de Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modela una ruta que puede no coincidir y, en ese caso, no devuelve ninguna respuesta.
Rara vez tendrá que escribir esa firma a mano. En su lugar, construya rutas con el constructor HttpRoutes.of y una función parcial.
import cats.effect.IO
import org.http4s._
import org.http4s.dsl.io._
val routes: HttpRoutes[IO] = HttpRoutes.of[IO] {
case GET -> Root / "hello" => Ok("hi")
}El DSL de http4s
La importación del DSL org.http4s.dsl.io._ proporciona extractores de patrones como GET, Root y el separador de rutas /, además de constructores de respuestas como Ok y NotFound.
Una ruta es una PartialFunction[Request[F], F[Response[F]]]. Los casos que no coinciden simplemente continúan con el siguiente.
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}Coincidencia de rutas
Los patrones de ruta se leen de izquierda a derecha. Root representa la barra inicial, y cada / "segment" coincide con un segmento literal de la ruta.
La flecha -> separa el método HTTP de la ruta. Por tanto, GET -> Root / "users" coincide con GET /users.
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}Variables de ruta
Un binder en minúsculas sin comillas dentro de una ruta captura ese segmento como un String. Aquí id vincula lo que aparezca después de /users/.
Los segmentos capturados siempre son cadenas; debe analizarlos usted mismo para convertirlos en tipos más específicos o usar los objetos extractores que se muestran a continuación.
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}Extractores de ruta tipados
http4s incluye extractores como IntVar y LongVar, que solo coinciden cuando el segmento se puede analizar como ese tipo. Un segmento no numérico hace que el caso continúe con el siguiente.
Puede definir extractores personalizados con un unapply para tipos de dominio como UUID.
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}Coincidencia de métodos
El extractor de método situado antes de -> puede ser cualquiera de GET, POST, PUT, DELETE, PATCH y otros. La misma ruta con métodos diferentes se convierte en casos independientes.
Si la ruta coincide pero el método no, http4s responde automáticamente 405 Method Not Allowed.
HttpRoutes.of[IO] {
case GET -> Root / "items" => Ok("list")
case POST -> Root / "items" => Created("made")
case DELETE -> Root / "items" / IntVar(i) => NoContent()
}Composición de rutas
Como HttpRoutes[F] forma un SemigroupK, puede combinar varios grupos de rutas con el operador <+>. Gana el primer grupo que produce una respuesta.
Esto permite dividir las rutas por funcionalidad en valores independientes y fusionarlas en un solo lugar.
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesDe rutas a HttpApp
Un servidor necesita una función total, no una parcial. HttpRoutes[F] se convierte en HttpApp[F] mediante .orNotFound, que proporciona un 404 cuando ninguna ruta coincide.
HttpApp[F] es Kleisli[F, Request[F], Response[F]]: siempre devuelve una respuesta.
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundEnvoltorio de middleware
Los middleware son funciones HttpRoutes[F] => HttpRoutes[F] (o funciones sobre HttpApp). Envuelven un servicio para añadir registro, CORS, gzip o autenticación sin modificar la lógica de las rutas.
Entre los ejemplos integrados se incluyen Logger, CORS y GZip, de org.http4s.server.middleware.
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)Parámetros de consulta en las rutas
Los parámetros de consulta se hacen coincidir con objetos matcher que extienden QueryParamDecoderMatcher. Aparecen después de un :? en el patrón de ruta.
Use OptionalQueryParamDecoderMatcher para los parámetros que pueden faltar; el resultado será un Option.
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}Comprobación rápida
Compruebe cuánto ha entendido sobre la composición de rutas.
Resumen
Ha creado rutas con HttpRoutes.of y el DSL, ha hecho coincidir métodos y rutas, ha capturado variables con IntVar y matchers, y ha compuesto grupos con <+>.
Las rutas son parciales; .orNotFound las convierte en un HttpApp total, y el middleware envuelve los servicios para gestionar aspectos transversales.
Preguntas frecuentes
¿La lección «Rutas y HttpRoutes» es gratis?
Sí — el texto completo de «Rutas y HttpRoutes» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.
¿Qué aprenderé en «Rutas y HttpRoutes»?
Defina endpoints de forma funcional Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?
No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Rutas y HttpRoutes»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?
Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Rutas y HttpRoutes
- Solicitudes y respuestas
- Endpoints JSON
- Servir la aplicación