Ruter og HttpRoutes
Definer endepunkter funksjonelt.
Ruter og HttpRoutes er en gratis leksjon i Scala for backendutvikling og funksjonell programmering på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Scala for backendutvikling og funksjonell programmering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Scala for backendutvikling og funksjonell programmering inneholder totalt 4 leksjoner.
Hva http4s er
http4s er et rent funksjonelt HTTP-bibliotek for Scala, bygget på cats-effect og fs2-strømmer. Forespørsler og svar er uforanderlige verdier, og effekter fanges opp i en polymorf effekttype F[_], for eksempel IO.
I stedet for å endre en servlet beskriver De en HTTP-tjeneste som en funksjon fra en forespørsel til et effektfullt valgfritt svar.
Typen HttpRoutes
Kjerneabstraksjonen er HttpRoutes[F], et alias for Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modellerer en rute som kanskje ikke passer, og som da ikke returnerer noe svar.
De skriver sjelden denne signaturen for hånd. I stedet bygger De ruter med konstruktøren HttpRoutes.of og en partiell funksjon.
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")
}http4s-DSL-en
DSL-importen org.http4s.dsl.io._ henter inn mønsteruttrekkere som GET, Root og baneskilletegnet /, samt svarbyggere som Ok og NotFound.
En rute er en PartialFunction[Request[F], F[Response[F]]]. Tilfeller som ikke passer, går ganske enkelt videre.
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}Samsvarende baner
Banemønstre leses fra venstre mot høyre. Root er den innledende skråstreken, og hver / "segment" samsvarer med ett bokstavelig banesegment.
Pilen -> skiller HTTP-metoden fra banen. Dermed samsvarer GET -> Root / "users" med GET /users.
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}Variabler i banen
En ubundet variabel med små bokstaver i en bane fanger opp segmentet som en String. Her binder id det som står etter /users/.
De innfangede segmentene er alltid strenger; De må selv konvertere dem til rikere typer eller bruke uttrekksobjektene som vises senere.
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}Typede baneuttrekkere
http4s leveres med uttrekkere som IntVar og LongVar, som bare samsvarer når segmentet kan tolkes som den aktuelle typen. Et ikke-numerisk segment gjør at tilfellet går videre til det neste.
De kan definere egendefinerte uttrekkere med en unapply for domenetyper som UUID-er.
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}Samsvar med metoder
Metodeuttrekkeren før -> kan være GET, POST, PUT, DELETE, PATCH eller flere. Den samme banen med ulike metoder blir separate tilfeller.
Hvis en bane samsvarer, men metoden ikke gjør det, svarer http4s automatisk 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()
}Kombinere ruter
Siden HttpRoutes[F] danner en SemigroupK, setter De sammen flere rutegrupper med operatoren <+>. Den første gruppen som produserer et svar, vinner.
Dermed kan De dele rutene etter funksjonalitet i separate verdier og slå dem sammen på ett sted.
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesFra ruter til HttpApp
En server trenger en total funksjon, ikke en partiell. HttpRoutes[F] konverteres til HttpApp[F] med .orNotFound, som leverer 404 når ingen rute samsvarer.
HttpApp[F] er Kleisli[F, Request[F], Response[F]] – den returnerer alltid et svar.
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundInnpakking med middleware
Middleware er funksjoner av typen HttpRoutes[F] => HttpRoutes[F] (eller over HttpApp). De pakker inn en tjeneste for å legge til logging, CORS, gzip eller autentisering uten å endre rutelogikken.
Innebygde eksempler er Logger, CORS og GZip fra org.http4s.server.middleware.
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)Spørringsparametere i ruter
Spørringsparametere samsvarer med matcher-objekter som utvider QueryParamDecoderMatcher. De vises etter en :? i banemønsteret.
Bruk OptionalQueryParamDecoderMatcher for parametere som kan mangle; resultatet blir da en Option.
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}Kort test
Test forståelsen Deres av rutesammensetning.
Oppsummering
De bygget ruter med HttpRoutes.of og DSL-en, matchet metoder og baner, fanget opp variabler med IntVar og matchere, og satte sammen grupper med <+>.
Ruter er partielle; .orNotFound gjør dem til en total HttpApp, og middleware pakker inn tjenester for tverrgående hensyn.
Lær deg Scala med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 39
- Leksjoner
- 143
Ofte stilte spørsmål
Er leksjonen «Ruter og HttpRoutes» gratis?
Ja – hele teksten i «Ruter og HttpRoutes» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Scala for backendutvikling og funksjonell programmering-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Scala for backendutvikling og funksjonell programmering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Ruter og HttpRoutes»?
Definer endepunkter funksjonelt. Du øver på Scala for backendutvikling og funksjonell programmering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Scala for backendutvikling og funksjonell programmering?
Ingen tidligere erfaring er nødvendig. Scala for backendutvikling og funksjonell programmering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Ruter og HttpRoutes»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Scala for backendutvikling og funksjonell programmering-leksjonen?
Ja. Alle Scala for backendutvikling og funksjonell programmering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Ruter og HttpRoutes
- Forespørsler og svar
- JSON-endepunkter
- Betjen applikasjonen