Requests und Responses
Lesen Sie Eingaben und geben Sie Ausgaben zurück.
Requests und Responses ist eine kostenlose Scala for Backend Engineering & Functional Programming-Lektion auf CoddyKit. Dies ist Lektion 2 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.
Die Anfrage als Wert
In http4s ist ein Request[F] ein unveränderlicher Wert mit Methode, URI, Headern, HTTP-Version und einem Streaming-Body. Sie untersuchen ihn mit reinen Zugriffsmethoden und verändern ihn niemals direkt.
Um eine Anfrage zu ändern, erstellen Sie mit withHeaders, withUri oder ähnlichen Kombinatoren eine Kopie.
val r: Request[IO] = Request[IO](
method = Method.GET,
uri = uri"/health"
)Der Streaming-Body
Der Body einer Anfrage oder Antwort ist ein fs2.Stream[F, Byte]. Er wird verzögert und innerhalb eines Effekts verarbeitet, sodass große Nutzlasten nie vollständig im Speicher liegen müssen.
In der Regel greifen Sie nicht auf rohe Bytes zu; ein EntityDecoder übernimmt die Decodierung für Sie.
// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.bodyDen Body decodieren
Ein EntityDecoder[F, A] weiß, wie der Body-Stream in ein A umgewandelt wird. Rufen Sie zum Decodieren req.as[A] auf. Das Ergebnis ist F[A], und bei einem fehlerhaften Body schlägt der Effekt fehl.
Für String gibt es einen integrierten Decoder; umfangreichere Decoder kommen aus JSON-Modulen.
HttpRoutes.of[IO] {
case req @ POST -> Root / "echo" =>
req.as[String].flatMap(body => Ok(body))
}Die Anfrage binden
Um innerhalb eines Falls auf das Anfrageobjekt zuzugreifen, binden Sie es mit @. Hier bezeichnet req die gesamte Anfrage, während das Muster weiterhin Methode und Pfad abgleicht.
Ohne den Binder stehen Ihnen nur die zerlegten Teile zur Verfügung, und Sie können weder den Body noch die Header lesen.
HttpRoutes.of[IO] {
case req @ PUT -> Root / "name" =>
req.as[String].flatMap(n => Ok(s"set $n"))
}Header lesen
Header befinden sich in request.headers. Verwenden Sie headers.get[H] mit einem typisierten Header-Modell oder headers.get(CIString("X-Custom")) für beliebige Namen.
Typisierte Header wie Authorization und Content-Type parsen und validieren ihre Werte für Sie.
import org.http4s.headers.Authorization
val auth: Option[Authorization] =
request.headers.get[Authorization]Antworten erstellen
Die Antwort-Builder der DSL, etwa Ok, Created und NotFound, sind Funktionen, die F[Response[F]] zurückgeben. Durch die Übergabe eines Arguments wird der Body über einen EntityEncoder gesetzt.
Jeder Builder entspricht einem Statuscode, daher erzeugt Created(...) den Status 201.
Ok("all good") // 200
Created("made it") // 201
NotFound("missing") // 404Statuscodes direkt verwenden
Für einen Status ohne passenden Komfort-Builder oder zur individuellen Anpassung erstellen Sie eine Response[F] mit einem expliziten Status und verketten withEntity.
So haben Sie in einem Ausdruck vollständige Kontrolle über Status, Header und Body.
import org.http4s.{Response, Status}
Response[IO](Status.Accepted)
.withEntity("queued")
.pure[IO]Bodies codieren
Ein EntityEncoder[F, A] serialisiert einen Wert in den Antwort-Body und setzt den Content-Type. Encoder für String und Bytes sind integriert; JSON-Encoder stammen aus Circe.
Wenn Sie Ok(value) einen Wert übergeben, sucht http4s implizit nach dem passenden Encoder.
// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")Antwort-Header setzen
Fügen Sie Header hinzu, indem Sie sie als zusätzliche Argumente an einen Builder übergeben, oder verketten Sie .map(_.putHeaders(...)) mit dem Antwort-Effekt.
Typisierte Header-Modelle stellen korrekt formatierte Werte sicher, beispielsweise einen Location-Header bei 201 Created.
import org.http4s.headers.Location
Created("ok").map(_.putHeaders(
Location(uri"/items/42")
))Decodierungsfehler behandeln
req.as[A] lässt den F-Effekt fehlschlagen, wenn der Body nicht decodiert werden kann. Verwenden Sie req.attemptAs[A].value, um ein F[Either[DecodeFailure, A]] zu erhalten, und antworten Sie bei Left mit 400.
So bleibt die Behandlung fehlerhafter Eingaben explizit und total.
req.attemptAs[String].value.flatMap {
case Right(b) => Ok(b)
case Left(_) => BadRequest("bad body")
}Cookies und Weiterleitungen
Setzen Sie Cookies mit response.addCookie(ResponseCookie(name, value)). Für Weiterleitungen verwenden Sie einen 3xx-Builder und einen Location-Header.
SeeOther(Location(uri)) führt zu 303, der idiomatischen Antwort für Post-Redirect-Get.
import org.http4s.headers.Location
SeeOther(Location(uri"/login"))
.map(_.addCookie("sid", "abc123"))Kurzer Test
Denken Sie über das sichere Decodieren von Bodies nach.
Zusammenfassung
Anfragen und Antworten sind unveränderliche Werte mit streamenden fs2-Bodies. Sie dekodieren sie mit as/attemptAs über EntityDecoder und kodieren sie mit EntityEncoder.
Builder legen Statuscodes fest, typisierte Header bleiben typsicher, und Cookies sowie Weiterleitungen sind lediglich Transformationen von Antworten.
Häufig gestellte Fragen
Ist die Lektion „Requests und Responses“ kostenlos?
Ja — der vollständige Text von „Requests und Responses“ 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 „Requests und Responses“?
Lesen Sie Eingaben und geben Sie Ausgaben zurück. 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 2 von 4.
Wie lange dauert die Lektion „Requests und Responses“?
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