Routes et HttpRoutes
Définissez des points de terminaison de façon fonctionnelle.
Routes et HttpRoutes est une leçon Scala for Backend Engineering & Functional Programming gratuite sur CoddyKit. Ceci est la leçon 1 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.
Ce qu’est http4s
http4s est une bibliothèque HTTP purement fonctionnelle pour Scala, construite sur cats-effect et les flux fs2. Les requêtes et les réponses sont des valeurs immuables, et les effets sont encapsulés dans un type d’effet polymorphe F[_] tel que IO.
Au lieu de modifier une servlet, vous décrivez un service HTTP comme une fonction transformant une requête en réponse facultative produite dans un effet.
Le type HttpRoutes
L’abstraction centrale est HttpRoutes[F], un alias de Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modélise une route qui peut ne pas correspondre, auquel cas aucune réponse n’est renvoyée.
Vous écrivez rarement cette signature manuellement. Vous construisez plutôt les routes avec le constructeur HttpRoutes.of et une fonction partielle.
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")
}Le DSL d’http4s
L’import du DSL org.http4s.dsl.io._ fournit des extracteurs de motifs comme GET, Root et le séparateur de chemin /, ainsi que des constructeurs de réponses comme Ok et NotFound.
Une route est une PartialFunction[Request[F], F[Response[F]]]. Les cas qui ne correspondent pas passent simplement au suivant.
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}Faire correspondre les chemins
Les motifs de chemin se lisent de gauche à droite. Root représente la barre oblique initiale, et chaque / "segment" correspond à un segment littéral du chemin.
La flèche -> sépare la méthode HTTP du chemin. Ainsi, GET -> Root / "users" correspond à GET /users.
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}Variables de chemin
Dans un chemin, un lieur isolé en minuscules capture le segment sous forme de String. Ici, id lie la valeur qui apparaît après /users/.
Les segments capturés sont toujours des chaînes de caractères ; vous les analysez vous-même pour obtenir des types plus riches, ou vous utilisez les objets extracteurs présentés ensuite.
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}Extracteurs de chemin typés
http4s fournit des extracteurs comme IntVar et LongVar, qui ne correspondent que lorsque le segment peut être analysé comme le type concerné. Un segment non numérique fait passer l’exécution au cas suivant.
Vous pouvez définir des extracteurs personnalisés avec un unapply pour des types métier comme les UUID.
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}Faire correspondre les méthodes
L’extracteur de méthode placé avant -> peut être GET, POST, PUT, DELETE, PATCH, ou bien d’autres. Un même chemin associé à des méthodes différentes forme des cas distincts.
Si le chemin correspond mais pas la méthode, http4s renvoie automatiquement 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()
}Combiner les routes
Comme HttpRoutes[F] forme un SemigroupK, vous composez plusieurs groupes de routes avec l’opérateur <+>. Le premier groupe qui produit une réponse l’emporte.
Vous pouvez ainsi répartir les routes par fonctionnalité dans des valeurs distinctes, puis les fusionner au même endroit.
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesDes routes à HttpApp
Un serveur a besoin d’une fonction totale, et non d’une fonction partielle. HttpRoutes[F] est converti en HttpApp[F] avec .orNotFound, qui fournit une réponse 404 lorsqu’aucune route ne correspond.
HttpApp[F] est un Kleisli[F, Request[F], Response[F]] : il renvoie toujours une réponse.
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundEncapsuler avec un intergiciel
Les intergiciels sont des fonctions HttpRoutes[F] => HttpRoutes[F] (ou qui opèrent sur HttpApp). Ils encapsulent un service pour ajouter la journalisation, CORS, gzip ou l’authentification sans modifier la logique des routes.
Parmi les exemples intégrés figurent Logger, CORS et GZip, provenant de org.http4s.server.middleware.
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)Paramètres de requête dans les routes
Les paramètres de requête sont mis en correspondance avec des objets d’appariement qui étendent QueryParamDecoderMatcher. Ils apparaissent après un :? dans le motif de chemin.
Utilisez OptionalQueryParamDecoderMatcher pour les paramètres qui peuvent être absents ; le résultat est alors un Option.
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}Vérification rapide
Testez votre compréhension de la composition des routes.
Récapitulatif
Vous avez construit des routes avec HttpRoutes.of et le DSL, fait correspondre des méthodes et des chemins, capturé des variables avec IntVar et des apparieurs, puis composé des groupes avec <+>.
Les routes sont partielles ; .orNotFound les transforme en HttpApp totale, et les intergiciels encapsulent les services pour gérer les préoccupations transversales.
Questions Fréquemment Posées
La leçon « Routes et HttpRoutes » est-elle gratuite ?
Oui — le texte complet de « Routes et HttpRoutes » 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 « Routes et HttpRoutes » ?
Définissez des points de terminaison de façon fonctionnelle. 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 1 sur 4.
Combien de temps prend la leçon « Routes et HttpRoutes » ?
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