Requêtes et réponses
Lisez l’entrée et renvoyez la sortie.
Requêtes et réponses est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Scala for Backend Engineering & Functional Programming, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
Request as a Value
In http4s a Request[F] is an immutable value carrying the method, URI, headers, HTTP version, and a streaming body. You inspect it with pure accessors and never mutate it in place.
To change a request you produce a copy via withHeaders, withUri, or similar combinators.
val r: Request[IO] = Request[IO](
method = Method.GET,
uri = uri"/health"
)The Streaming Body
The body of a request or response is an fs2.Stream[F, Byte]. It is consumed lazily and effectfully, so large payloads never have to sit fully in memory.
You usually do not touch raw bytes; an EntityDecoder handles decoding for you.
// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.bodyDecoding the Body
An EntityDecoder[F, A] knows how to turn the body stream into an A. Call req.as[A] to decode, which returns F[A] and fails the effect on a malformed body.
A built-in decoder exists for String; richer ones come from JSON modules.
HttpRoutes.of[IO] {
case req @ POST -> Root / "echo" =>
req.as[String].flatMap(body => Ok(body))
}Binding the Request
To access the request object inside a case, bind it with @. Here req names the whole request while the pattern still matches method and path.
Without the binder you only have the destructured parts and cannot read the body or headers.
HttpRoutes.of[IO] {
case req @ PUT -> Root / "name" =>
req.as[String].flatMap(n => Ok(s"set $n"))
}Reading Headers
Headers live in request.headers. Use headers.get[H] with a typed header model, or headers.get(CIString("X-Custom")) for arbitrary names.
Typed headers like Authorization and Content-Type parse and validate their values for you.
import org.http4s.headers.Authorization
val auth: Option[Authorization] =
request.headers.get[Authorization]Building Responses
The DSL response builders such as Ok, Created, and NotFound are functions returning F[Response[F]]. Passing an argument sets the body via an EntityEncoder.
Each builder corresponds to a status code, so Created(...) yields 201.
Ok("all good") // 200
Created("made it") // 201
NotFound("missing") // 404Status Codes Directly
For a status without a convenience builder, or to customize, construct a Response[F] with an explicit Status and chain withEntity.
This gives full control over status, headers, and body in one expression.
import org.http4s.{Response, Status}
Response[IO](Status.Accepted)
.withEntity("queued")
.pure[IO]Encoding Bodies
An EntityEncoder[F, A] serializes a value into the response body and sets the Content-Type. String and byte encoders are built in; JSON encoders come from circe.
When you pass a value to Ok(value), http4s looks up the encoder implicitly.
// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")Setting Response Headers
Add headers by passing them as extra arguments to a builder, or chain .map(_.putHeaders(...)) on the response effect.
Typed header models ensure correctly formatted values, for example a Location header on a 201 Created.
import org.http4s.headers.Location
Created("ok").map(_.putHeaders(
Location(uri"/items/42")
))Handling Decode Failures
req.as[A] fails the F effect when the body cannot be decoded. Use req.attemptAs[A].value to get an F[Either[DecodeFailure, A]] and respond with 400 on the left.
This keeps malformed-input handling explicit and total.
req.attemptAs[String].value.flatMap {
case Right(b) => Ok(b)
case Left(_) => BadRequest("bad body")
}Cookies and Redirects
Set cookies with response.addCookie(ResponseCookie(name, value)). For redirects, use a 3xx builder and a Location header.
SeeOther(Location(uri)) performs a 303, the idiomatic post-redirect-get response.
import org.http4s.headers.Location
SeeOther(Location(uri"/login"))
.map(_.addCookie("sid", "abc123"))Quick Check
Think about safe body decoding.
Recap
Requests and responses are immutable values with streaming fs2 bodies. You decode with as/attemptAs via EntityDecoder and encode with EntityEncoder.
Builders set status codes, typed headers stay safe, and cookies and redirects are just response transformations.
Questions Fréquemment Posées
La leçon « Requêtes et réponses » est-elle gratuite ?
Oui — le texte complet de « Requêtes et réponses » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Scala for Backend Engineering & Functional Programming, passe à CoddyKit PRO. Le cours Scala for Backend Engineering & Functional Programming comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Requêtes et réponses » ?
Lisez l’entrée et renvoyez la sortie. Tu pratiques Scala for Backend Engineering & Functional Programming avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Scala for Backend Engineering & Functional Programming ?
Aucune expérience préalable n'est requise. Scala for Backend Engineering & Functional Programming sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Requêtes et réponses » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Scala for Backend Engineering & Functional Programming ?
Oui. Chaque leçon Scala for Backend Engineering & Functional Programming inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Routes et HttpRoutes
- Requêtes et réponses
- Points de terminaison JSON
- Servir l’application