Scala för backendutveckling och funktionell programmering · Lektion

Anrop och svar

Läs indata och returnera utdata.

Lektion 2 av 413 steg

Anrop och svar är en gratis lektion i Scala för backendutveckling och funktionell programmering på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Scala för backendutveckling och funktionell programmering, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Scala för backendutveckling och funktionell programmering innehåller totalt 4 lektioner.

Request som värde

I http4s är en Request[F] ett oföränderligt värde som innehåller metod, URI, headers, HTTP-version och en strömmande body. Du inspekterar den med rena accessorer och ändrar den aldrig på plats.

Om du vill ändra en request skapar du en kopia med withHeaders, withUri eller liknande kombinatorer.

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

Den strömmande bodyn

En requests eller responses body är en fs2.Stream[F, Byte]. Den konsumeras fördröjt och effektfullt, så stora nyttolaster behöver aldrig ligga helt i minnet.

Vanligtvis behöver du inte hantera råa byte; en EntityDecoder sköter avkodningen åt dig.

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

Avkoda bodyn

En EntityDecoder[F, A] vet hur bodystreamen ska omvandlas till en A. Anropa req.as[A] för att avkoda; det returnerar F[A] och låter effekten misslyckas om bodyn är felaktig.

Det finns en inbyggd avkodare för String; mer avancerade avkodare kommer från JSON-moduler.

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

Binda requesten

För att komma åt request-objektet i ett fall binder du det med @. Här namnger req hela requesten, medan mönstret fortfarande matchar metod och sökväg.

Utan bindningen har du bara de uppdelade delarna och kan inte läsa body eller headers.

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

Läsa headers

Headers finns i request.headers. Använd headers.get[H] med en typad headermodell, eller headers.get(CIString("X-Custom")) för godtyckliga namn.

Typade headers som Authorization och Content-Type tolkar och validerar sina värden åt dig.

import org.http4s.headers.Authorization

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

Bygga responses

DSL:ens response-byggare, som Ok, Created och NotFound, är funktioner som returnerar F[Response[F]]. Om du skickar ett argument anges bodyn via en EntityEncoder.

Varje byggare motsvarar en statuskod, så Created(...) ger 201.

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

Statuskoder direkt

Om det saknas en bekväm byggare för statusen, eller om du vill anpassa den, skapar du en Response[F] med en uttrycklig Status och kedjar withEntity.

Det ger full kontroll över status, headers och body i ett enda uttryck.

import org.http4s.{Response, Status}

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

Koda bodies

En EntityEncoder[F, A] serialiserar ett värde till response-bodyn och anger Content-Type. Kodare för String och byte är inbyggda; JSON-kodare kommer från circe.

När du skickar ett värde till Ok(value) letar http4s implicit upp kodaren.

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

Ange response-headers

Lägg till headers genom att skicka dem som extra argument till en byggare, eller kedja .map(_.putHeaders(...)) på response-effekten.

Typade headermodeller säkerställer korrekt formaterade värden, till exempel en Location-header på en 201 Created.

import org.http4s.headers.Location

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

Hantera avkodningsfel

req.as[A] låter F-effekten misslyckas när bodyn inte kan avkodas. Använd req.attemptAs[A].value för att få en F[Either[DecodeFailure, A]] och svara med 400 på vänstersidan.

Det gör hanteringen av felaktig indata uttrycklig och total.

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

Cookies och omdirigeringar

Ange cookies med response.addCookie(ResponseCookie(name, value)). För omdirigeringar använder du en 3xx-byggare och en Location-header.

SeeOther(Location(uri)) utför en 303, det idiomatiska svaret för post-redirect-get.

import org.http4s.headers.Location

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

Snabbtest

Fundera på säker avkodning av bodies.

Sammanfattning

Förfrågningar och svar är oföränderliga värden med strömmande fs2-kroppar. Ni avkodar med as/attemptAs via EntityDecoder och kodar med EntityEncoder.

Builders anger statuskoder, typsäkra headers förblir säkra, och cookies och omdirigeringar är bara svarstransformeringar.

Gratis att börja

Lär dig Scala med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
39
Lektioner
143

Vanliga frågor

Är lektionen ”Anrop och svar” gratis?

Ja – hela texten till ”Anrop och svar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Scala för backendutveckling och funktionell programmering, kan Ni uppgradera till CoddyKit PRO. Kursen i Scala för backendutveckling och funktionell programmering innehåller totalt 4 lektioner.

Vad lär jag mig i ”Anrop och svar”?

Läs indata och returnera utdata. Ni övar på Scala för backendutveckling och funktionell programmering med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Scala för backendutveckling och funktionell programmering?

Du behöver inga förkunskaper. Utbildningen i Scala för backendutveckling och funktionell programmering på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”Anrop och svar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Scala för backendutveckling och funktionell programmering-lektionen?

Ja. Varje Scala för backendutveckling och funktionell programmering-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Routes och HttpRoutes
  2. Anrop och svar
  3. JSON-endpoints
  4. Tillhandahåll applikationen
← Tillbaka till Scala för backendutveckling och funktionell programmering