Scala for Backend Engineering & Functional Programming · Lekcja

Trasy i HttpRoutes

Zdefiniuje Pan/Pani endpointy funkcyjnie.

Lekcja 1 z 413 kroki

Trasy i HttpRoutes to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Scala for Backend Engineering & Functional Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Czym jest http4s

http4s to czysto funkcyjna biblioteka HTTP dla Scali, zbudowana na cats-effect i strumieniach fs2. Żądania i odpowiedzi są niezmiennymi wartościami, a efekty są ujmowane w polimorficznym typie efektu F[_], takim jak IO.

Zamiast modyfikować servlet, opisuje się usługę HTTP jako funkcję przekształcającą żądanie w opcjonalną odpowiedź opakowaną w efekt.

Typ HttpRoutes

Podstawową abstrakcją jest HttpRoutes[F], będący aliasem dla Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT modeluje trasę, która może nie pasować i wtedy nie zwraca odpowiedzi.

Rzadko zapisuje się ten podpis ręcznie. Zamiast tego trasy tworzy się za pomocą konstruktora HttpRoutes.of i funkcji częściowej.

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

DSL biblioteki http4s

Import DSL org.http4s.dsl.io._ udostępnia ekstraktory wzorców, takie jak GET, Root i separator ścieżki /, a także konstruktory odpowiedzi, takie jak Ok i NotFound.

Trasa ma typ PartialFunction[Request[F], F[Response[F]]]. Przypadki, które nie pasują, są po prostu pomijane.

import org.http4s.dsl.io._

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

Dopasowywanie ścieżek

Wzorce ścieżek odczytuje się od lewej do prawej. Root oznacza początkowy ukośnik, a każde / "segment" dopasowuje jeden dosłowny segment ścieżki.

Strzałka -> oddziela metodę HTTP od ścieżki. Zatem GET -> Root / "users" dopasowuje GET /users.

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

Zmienne ścieżki

Umieszczony bezpośrednio w ścieżce binder pisany małymi literami przechwytuje ten segment jako String. W tym przypadku id wiąże dowolną wartość występującą po /users/.

Przechwycone segmenty zawsze są ciągami znaków; bogatsze typy należy uzyskać samodzielnie przez ich parsowanie albo użyć przedstawionych dalej obiektów ekstraktorów.

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

Ekstraktory typowanych ścieżek

http4s udostępnia ekstraktory, takie jak IntVar i LongVar, które dopasowują segment tylko wtedy, gdy można go sparsować do danego typu. Segment nienumeryczny powoduje przejście do następnego przypadku.

Można definiować własne ekstraktory za pomocą metody unapply dla typów domenowych, takich jak UUID.

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

Dopasowywanie metod

Ekstraktor metody przed -> może być dowolną z wartości GET, POST, PUT, DELETE, PATCH i innymi. Ta sama ścieżka z różnymi metodami tworzy osobne przypadki.

Jeśli ścieżka pasuje, ale metoda nie, http4s automatycznie zwraca 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()
}

Łączenie tras

Ponieważ HttpRoutes[F] tworzy SemigroupK, wiele grup tras można komponować za pomocą operatora <+>. Wygrywa pierwsza grupa, która zwróci odpowiedź.

Dzięki temu można podzielić trasy według funkcji na osobne wartości, a następnie połączyć je w jednym miejscu.

import cats.syntax.semigroupk._

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

Przekształcanie tras w HttpApp

Serwer potrzebuje funkcji całkowitej, a nie częściowej. HttpRoutes[F] jest przekształcany w HttpApp[F] za pomocą .orNotFound, które dostarcza 404, gdy żadna trasa nie pasuje.

HttpApp[F] ma typ Kleisli[F, Request[F], Response[F]] — zawsze zwraca odpowiedź.

import org.http4s.HttpApp

val app: HttpApp[IO] = routes.orNotFound

Opakowywanie za pomocą middleware

Middleware to funkcje typu HttpRoutes[F] => HttpRoutes[F] (lub działające na HttpApp). Opakowują usługę, dodając logowanie, CORS, gzip lub uwierzytelnianie bez ingerowania w logikę tras.

Wbudowane przykłady to Logger, CORS i GZip z pakietu org.http4s.server.middleware.

import org.http4s.server.middleware.Logger

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

Parametry zapytania w trasach

Parametry zapytania dopasowuje się za pomocą obiektów matcherów rozszerzających QueryParamDecoderMatcher. Wzorzec ścieżki zawiera je po :?.

Użyj OptionalQueryParamDecoderMatcher dla parametrów, które mogą być nieobecne; wynikiem będzie Option.

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

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

Szybki test

Sprawdź swoją wiedzę na temat kompozycji tras.

Podsumowanie

Utworzyłeś trasy za pomocą HttpRoutes.of i DSL, dopasowywałeś metody i ścieżki, przechwytywałeś zmienne za pomocą IntVar i matcherów oraz łączyłeś grupy operatorem <+>.

Trasy są częściowe; .orNotFound przekształca je w całkowity HttpApp, a middleware opakowuje usługi, aby obsługiwać przekrojowe aspekty działania aplikacji.

Bezpłatny start

Ucz się Scala dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
143

Często zadawane pytania

Czy lekcja „Trasy i HttpRoutes” jest bezpłatna?

Tak — pełny tekst „Trasy i HttpRoutes” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Scala for Backend Engineering & Functional Programming, przejdź na CoddyKit PRO. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Co nauczysz się w „Trasy i HttpRoutes”?

Zdefiniuje Pan/Pani endpointy funkcyjnie. Ćwiczysz Scala for Backend Engineering & Functional Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Scala for Backend Engineering & Functional Programming?

Nie wymagamy żadnego doświadczenia. Scala for Backend Engineering & Functional Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Trasy i HttpRoutes”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Scala for Backend Engineering & Functional Programming?

Tak. Każda lekcja Scala for Backend Engineering & Functional Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Trasy i HttpRoutes
  2. Żądania i odpowiedzi
  3. Endpointy JSON
  4. Udostępnianie aplikacji
← Powrót do Scala for Backend Engineering & Functional Programming