Scala for Backend Engineering & Functional Programming · Lección

Solicitudes y respuestas

Lea la entrada y devuelva la salida

Lección 2 de 413 pasos

Solicitudes y respuestas es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 2 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.

La solicitud como valor

En http4s, un Request[F] es un valor inmutable que contiene el método, el URI, las cabeceras, la versión HTTP y un cuerpo en streaming. Puede inspeccionarlo con accesores puros y nunca modificarlo directamente.

Para cambiar una solicitud, cree una copia mediante withHeaders, withUri u otros combinadores similares.

val r: Request[IO] = Request[IO](
  method = Method.GET,
  uri = uri"/health"
)

El cuerpo en streaming

El cuerpo de una solicitud o respuesta es un fs2.Stream[F, Byte]. Se consume de forma diferida y con efectos, por lo que las cargas grandes no tienen que permanecer completamente en memoria.

Normalmente no tendrá que manipular bytes sin procesar; un EntityDecoder se encarga de la decodificación.

// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.body

Decodificación del cuerpo

Un EntityDecoder[F, A] sabe convertir el stream del cuerpo en un A. Llame a req.as[A] para decodificarlo; devuelve F[A] y hace que el efecto falle si el cuerpo está mal formado.

Existe un decoder integrado para String; los más avanzados proceden de los módulos JSON.

HttpRoutes.of[IO] {
  case req @ POST -> Root / "echo" =>
    req.as[String].flatMap(body => Ok(body))
}

Vinculación de la solicitud

Para acceder al objeto de solicitud dentro de un caso, vincúlelo con @. Aquí req representa la solicitud completa, mientras el patrón sigue haciendo coincidir el método y la ruta.

Sin el binder, solo tendrá las partes desestructuradas y no podrá leer el cuerpo ni las cabeceras.

HttpRoutes.of[IO] {
  case req @ PUT -> Root / "name" =>
    req.as[String].flatMap(n => Ok(s"set $n"))
}

Lectura de cabeceras

Las cabeceras se encuentran en request.headers. Use headers.get[H] con un modelo de cabecera tipado, o headers.get(CIString("X-Custom")) para nombres arbitrarios.

Las cabeceras tipadas, como Authorization y Content-Type, analizan y validan sus valores automáticamente.

import org.http4s.headers.Authorization

val auth: Option[Authorization] =
  request.headers.get[Authorization]

Construcción de respuestas

Los constructores de respuestas del DSL, como Ok, Created y NotFound, son funciones que devuelven F[Response[F]]. Pasar un argumento establece el cuerpo mediante un EntityEncoder.

Cada constructor corresponde a un código de estado, por lo que Created(...) produce 201.

Ok("all good")          // 200
Created("made it")      // 201
NotFound("missing")     // 404

Códigos de estado directamente

Para un estado que no tenga un constructor específico, o para personalizarlo, construya un Response[F] con un Status explícito y encadene withEntity.

Esto proporciona control total sobre el estado, las cabeceras y el cuerpo en una sola expresión.

import org.http4s.{Response, Status}

Response[IO](Status.Accepted)
  .withEntity("queued")
  .pure[IO]

Codificación de cuerpos

Un EntityEncoder[F, A] serializa un valor en el cuerpo de la respuesta y establece Content-Type. Los encoders para String y bytes están integrados; los encoders JSON proceden de circe.

Cuando pasa un valor a Ok(value), http4s busca implícitamente el encoder.

// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")

Configuración de cabeceras de respuesta

Añada cabeceras pasándolas como argumentos adicionales a un constructor, o encadene .map(_.putHeaders(...)) al efecto de respuesta.

Los modelos de cabecera tipados garantizan valores con el formato correcto; por ejemplo, una cabecera Location en un 201 Created.

import org.http4s.headers.Location

Created("ok").map(_.putHeaders(
  Location(uri"/items/42")
))

Gestión de errores de decodificación

req.as[A] hace que el efecto F falle cuando no se puede decodificar el cuerpo. Use req.attemptAs[A].value para obtener un F[Either[DecodeFailure, A]] y responder con 400 cuando el resultado sea un Left.

Así, la gestión de entradas mal formadas queda explícita y total.

req.attemptAs[String].value.flatMap {
  case Right(b) => Ok(b)
  case Left(_)  => BadRequest("bad body")
}

Cookies y redirecciones

Establezca cookies con response.addCookie(ResponseCookie(name, value)). Para las redirecciones, use un constructor 3xx y una cabecera Location.

SeeOther(Location(uri)) realiza un 303, la respuesta idiomática de redirección después de una operación POST.

import org.http4s.headers.Location

SeeOther(Location(uri"/login"))
  .map(_.addCookie("sid", "abc123"))

Comprobación rápida

Reflexione sobre la decodificación segura del cuerpo.

Resumen

Las solicitudes y respuestas son valores inmutables con cuerpos de fs2 en streaming. Decodifica con as/attemptAs mediante EntityDecoder y codifica con EntityEncoder.

Los constructores establecen los códigos de estado, las cabeceras tipadas mantienen la seguridad y las cookies y redirecciones son simplemente transformaciones de respuestas.

Gratis para empezar

Aprende Scala con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
39
Lecciones
143

Preguntas frecuentes

¿La lección «Solicitudes y respuestas» es gratis?

Sí — el texto completo de «Solicitudes y respuestas» 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 «Solicitudes y respuestas»?

Lea la entrada y devuelva la salida 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 2 de 4.

¿Cuánto tiempo toma la lección «Solicitudes y respuestas»?

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

  1. Rutas y HttpRoutes
  2. Solicitudes y respuestas
  3. Endpoints JSON
  4. Servir la aplicación
← Volver a Scala for Backend Engineering & Functional Programming