Scala voor backend-engineering en functioneel programmeren · Les

Routes en HttpRoutes

Definieer endpoints functioneel.

Les 1 van 413 stappen

Routes en HttpRoutes is een gratis Scala voor backend-engineering en functioneel programmeren-les op CoddyKit. Dit is les 1 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Scala voor backend-engineering en functioneel programmeren. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 4 lessen.

Wat http4s is

http4s is een volledig functionele HTTP-bibliotheek voor Scala, gebouwd op cats-effect en fs2-streams. Aanvragen en antwoorden zijn onveranderlijke waarden en effecten worden vastgelegd in een polymorf effecttype F[_], zoals IO.

In plaats van een servlet te wijzigen, beschrijf je een HTTP-service als een functie van een aanvraag naar een optioneel antwoord met effecten.

Het type HttpRoutes

De kernabstractie is HttpRoutes[F], een alias voor Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modelleert een route die mogelijk niet overeenkomt en dan geen antwoord teruggeeft.

Je schrijft die signatuur zelden met de hand. In plaats daarvan bouw je routes met de constructor HttpRoutes.of en een partiële functie.

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")
}

De http4s-DSL

De DSL-import org.http4s.dsl.io._ brengt patroonextractors zoals GET, Root en het padscheidingsteken / binnen, plus antwoordbouwers zoals Ok en NotFound.

Een route is een PartialFunction[Request[F], F[Response[F]]]. Gevallen die niet overeenkomen, gaan gewoon door naar het volgende.

import org.http4s.dsl.io._

HttpRoutes.of[IO] {
  case GET -> Root => Ok("root")
  case GET -> Root / "ping" => Ok("pong")
}

Paden matchen

Padpatronen worden van links naar rechts gelezen. Root is de voorafgaande slash en elke / "segment" matcht één letterlijk padsegment.

De pijl -> scheidt de HTTP-methode van het pad. GET -> Root / "users" matcht dus GET /users.

HttpRoutes.of[IO] {
  case GET -> Root / "users" => Ok("all users")
  case GET -> Root / "users" / "me" => Ok("current user")
}

Padvariabelen

Een kale binder met kleine letters in een pad vangt dat segment op als een String. Hier bindt id wat er na /users/ staat.

Opgevangen segmenten zijn altijd tekenreeksen; je parseert ze zelf naar rijkere typen of gebruikt de extractorobjecten die hierna worden getoond.

HttpRoutes.of[IO] {
  case GET -> Root / "users" / id =>
    Ok(s"user $id")
}

Getypeerde padextractors

http4s levert extractors zoals IntVar en LongVar, die alleen matchen wanneer het segment naar dat type kan worden geparsed. Bij een niet-numeriek segment gaat het geval door naar het volgende.

Je kunt aangepaste extractors definiëren met een unapply voor domeintypen zoals UUID's.

HttpRoutes.of[IO] {
  case GET -> Root / "users" / IntVar(id) =>
    Ok(s"numeric user $id")
}

Methoden matchen

De methode-extractor vóór -> kan onder andere GET, POST, PUT, DELETE en PATCH zijn. Hetzelfde pad met verschillende methoden vormt afzonderlijke gevallen.

Als een pad matcht maar de methode niet, antwoordt http4s automatisch met 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()
}

Routes combineren

Omdat HttpRoutes[F] een SemigroupK vormt, combineer je meerdere routegroepen met de operator <+>. De eerste groep die een antwoord oplevert, wint.

Zo kun je routes per functie opsplitsen in afzonderlijke waarden en ze op één plek samenvoegen.

import cats.syntax.semigroupk._

val all = userRoutes <+> itemRoutes <+> healthRoutes

Routes naar HttpApp

Een server heeft een totale functie nodig, geen partiële. HttpRoutes[F] wordt met .orNotFound omgezet in HttpApp[F]; deze levert 404 wanneer geen route matcht.

HttpApp[F] is Kleisli[F, Request[F], Response[F]] en geeft altijd een antwoord terug.

import org.http4s.HttpApp

val app: HttpApp[IO] = routes.orNotFound

Middleware wrappen

Middleware zijn functies HttpRoutes[F] => HttpRoutes[F] (of functies over HttpApp). Ze wrappen een service om logging, CORS, gzip of authenticatie toe te voegen zonder de routelogica aan te raken.

Ingebouwde voorbeelden zijn Logger, CORS en GZip uit org.http4s.server.middleware.

import org.http4s.server.middleware.Logger

val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)

Queryparameters in routes

Queryparameters worden gematcht met matcherobjecten die QueryParamDecoderMatcher uitbreiden. Ze verschijnen na een :? in het padpatroon.

Gebruik OptionalQueryParamDecoderMatcher voor parameters die kunnen ontbreken; deze levert een Option op.

object NameParam extends QueryParamDecoderMatcher[String]("name")

HttpRoutes.of[IO] {
  case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}

Korte controle

Test je begrip van routecompositie.

Samenvatting

Je hebt routes gebouwd met HttpRoutes.of en de DSL, methoden en paden gematcht, variabelen opgevangen met IntVar en matchers en groepen gecombineerd met <+>.

Routes zijn partieel; .orNotFound maakt er een totale HttpApp van en middleware wrappen services voor overkoepelende aandachtspunten.

Gratis beginnen

Leer Scala met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
39
Lessen
143

Veelgestelde vragen

Is de les “Routes en HttpRoutes” gratis?

Ja — de volledige tekst van “Routes en HttpRoutes” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Scala voor backend-engineering en functioneel programmeren wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 4 lessen.

Wat leer ik in “Routes en HttpRoutes”?

Definieer endpoints functioneel. Je oefent met Scala voor backend-engineering en functioneel programmeren door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Scala voor backend-engineering en functioneel programmeren te beginnen?

Ervaring vooraf is niet nodig. Scala voor backend-engineering en functioneel programmeren op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 1 van 4.

Hoe lang duurt de les “Routes en HttpRoutes”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Scala voor backend-engineering en functioneel programmeren?

Ja. Elke les over Scala voor backend-engineering en functioneel programmeren bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Routes en HttpRoutes
  2. Requests en responses
  3. JSON-endpoints
  4. De applicatie aanbieden
← Terug naar Scala voor backend-engineering en functioneel programmeren