Routen und HttpRoutes
Definieren Sie Endpunkte funktional.
Routen und HttpRoutes ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Scala for Backend Engineering & Functional Programming-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Was http4s ist
http4s ist eine rein funktionale HTTP-Bibliothek für Scala, die auf cats-effect und fs2-Streams aufbaut. Anforderungen und Antworten sind unveränderliche Werte, und Effekte werden in einem polymorphen Effekttyp wie F[_], etwa IO, gekapselt.
Statt ein Servlet zu verändern, beschreiben Sie einen HTTP-Dienst als Funktion von einer Anfrage zu einer optionalen Antwort in einem Effekt.
Der Typ HttpRoutes
Die zentrale Abstraktion ist HttpRoutes[F], ein Alias für Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modelliert eine Route, die möglicherweise nicht zutrifft und keine Antwort zurückgibt.
Diese Signatur schreiben Sie nur selten von Hand. Stattdessen erstellen Sie Routen mit dem Konstruktor HttpRoutes.of und einer partiellen Funktion.
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")
}Die http4s-DSL
Der DSL-Import org.http4s.dsl.io._ stellt Pattern Extractors wie GET, Root und den Pfadtrenner / sowie Antwort-Builder wie Ok und NotFound bereit.
Eine Route ist eine PartialFunction[Request[F], F[Response[F]]]. Nicht zutreffende Fälle werden einfach übersprungen.
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}Pfade abgleichen
Pfadmuster werden von links nach rechts gelesen. Root ist der führende Schrägstrich, und jedes / "segment" gleicht ein wörtliches Pfadsegment ab.
Der Pfeil -> trennt die HTTP-Methode vom Pfad. Daher gleicht GET -> Root / "users" GET /users ab.
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}Pfadvariablen
Ein ungebundener Bezeichner in Kleinbuchstaben erfasst in einem Pfad dieses Segment als String. Hier bindet id den Wert, der nach /users/ steht.
Erfasste Segmente sind immer Strings. Sie können sie selbst in umfangreichere Typen parsen oder die anschließend gezeigten Extractor-Objekte verwenden.
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}Typisierte Pfad-Extractor
http4s enthält Extractor wie IntVar und LongVar, die nur dann zutreffen, wenn sich das Segment in den jeweiligen Typ parsen lässt. Ein nicht numerisches Segment wird an den nächsten Fall weitergereicht.
Mit einem unapply können Sie benutzerdefinierte Extractor für Domänentypen wie UUIDs definieren.
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}Methoden abgleichen
Der Methoden-Extractor vor -> kann GET, POST, PUT, DELETE, PATCH oder eine andere Methode sein. Derselbe Pfad mit unterschiedlichen Methoden wird zu separaten Fällen.
Wenn ein Pfad, aber nicht die Methode zutrifft, antwortet http4s automatisch mit 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()
}Routen kombinieren
Da HttpRoutes[F] ein SemigroupK bildet, kombinieren Sie mehrere Routengruppen mit dem Operator <+>. Die erste Gruppe, die eine Antwort erzeugt, gewinnt.
So können Sie Routen nach Funktionen in separate Werte aufteilen und an einer Stelle zusammenführen.
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesVon Routen zu HttpApp
Ein Server benötigt eine totale statt einer partiellen Funktion. HttpRoutes[F] wird mit .orNotFound in HttpApp[F] umgewandelt, das 404 liefert, wenn keine Route zutrifft.
HttpApp[F] ist Kleisli[F, Request[F], Response[F]] und gibt immer eine Antwort zurück.
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundMiddleware umhüllen
Middleware sind Funktionen HttpRoutes[F] => HttpRoutes[F] (oder für HttpApp). Sie umhüllen einen Dienst und fügen Protokollierung, CORS, gzip oder Authentifizierung hinzu, ohne die Routenlogik anzutasten.
Integrierte Beispiele sind Logger, CORS und GZip aus org.http4s.server.middleware.
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)Query-Parameter in Routen
Query-Parameter werden mit Matcher-Objekten abgeglichen, die QueryParamDecoderMatcher erweitern. Sie erscheinen nach einem :? im Pfadmuster.
Verwenden Sie OptionalQueryParamDecoderMatcher für möglicherweise fehlende Parameter; das Ergebnis ist ein Option.
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}Kurzer Test
Testen Sie Ihr Verständnis der Routenzusammensetzung.
Zusammenfassung
Sie haben Routen mit HttpRoutes.of und der DSL erstellt, Methoden und Pfade abgeglichen, Variablen mit IntVar und Matchern erfasst und Gruppen mit <+> kombiniert.
Routen sind partiell; .orNotFound macht daraus eine totale HttpApp, und Middleware umhüllt Dienste für übergreifende Belange.
Häufig gestellte Fragen
Ist die Lektion „Routen und HttpRoutes“ kostenlos?
Ja — der vollständige Text von „Routen und HttpRoutes“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Scala for Backend Engineering & Functional Programming-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Scala for Backend Engineering & Functional Programming-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Routen und HttpRoutes“?
Definieren Sie Endpunkte funktional. Du übst Scala for Backend Engineering & Functional Programming mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Scala for Backend Engineering & Functional Programming zu starten?
Keine Vorkenntnisse erforderlich. Scala for Backend Engineering & Functional Programming auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Routen und HttpRoutes“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Scala for Backend Engineering & Functional Programming-Lektion Code schreiben und ausführen?
Ja. Jede Scala for Backend Engineering & Functional Programming-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Routen und HttpRoutes
- Requests und Responses
- JSON-Endpunkte
- Die Anwendung bereitstellen