0Pricing
Scala for Backend Engineering & Functional Programming · Lekcja

Żądania i odpowiedzi

Odczyta Pan/Pani dane wejściowe i zwróci wynik.

Żądania i odpowiedzi to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 2 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.

Żądanie jako wartość

W http4s obiekt Request[F] jest niezmienną wartością zawierającą metodę, URI, nagłówki, wersję HTTP i ciało w postaci strumienia. Odczytuje się go za pomocą czystych akcesorów i nigdy nie modyfikuje bezpośrednio.

Aby zmienić żądanie, utwórz jego kopię za pomocą withHeaders, withUri lub podobnych kombinatorów.

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

Ciało w postaci strumienia

Ciało żądania lub odpowiedzi ma typ fs2.Stream[F, Byte]. Jest odczytywane leniwie i efektownie, więc duże dane nie muszą być przechowywane w całości w pamięci.

Zwykle nie trzeba zajmować się surowymi bajtami; dekoder EntityDecoder zrobi to za Ciebie.

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

Dekodowanie ciała

Obiekt EntityDecoder[F, A] wie, jak przekształcić strumień ciała w wartość typu A. Wywołaj req.as[A], aby wykonać dekodowanie; zwraca ono F[A] i kończy efekt niepowodzeniem, jeśli ciało ma nieprawidłowy format.

Wbudowany dekoder istnieje dla typu String, a bogatsze dekodery pochodzą z modułów JSON.

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

Wiązanie żądania

Aby uzyskać dostęp do obiektu żądania wewnątrz przypadku, powiąż go za pomocą @. W tym przypadku req oznacza całe żądanie, a wzorzec nadal dopasowuje metodę i ścieżkę.

Bez bindera dostępne są tylko rozłożone części żądania, więc nie można odczytać ciała ani nagłówków.

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

Odczytywanie nagłówków

Nagłówki znajdują się w request.headers. Użyj headers.get[H] z typowanym modelem nagłówka albo headers.get(CIString("X-Custom")) dla dowolnych nazw.

Typowane nagłówki, takie jak Authorization i Content-Type, samodzielnie analizują i sprawdzają poprawność wartości.

import org.http4s.headers.Authorization

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

Tworzenie odpowiedzi

Konstruktory odpowiedzi DSL, takie jak Ok, Created i NotFound, są funkcjami zwracającymi F[Response[F]]. Przekazanie argumentu ustawia ciało za pomocą EntityEncoder.

Każdy konstruktor odpowiada kodowi stanu, więc Created(...) zwraca 201.

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

Bezpośrednie ustawianie kodów stanu

W przypadku stanu bez wygodnego konstruktora lub gdy potrzebna jest własna konfiguracja utwórz Response[F] z jawnym obiektem Status, a następnie połącz go z withEntity.

Daje to pełną kontrolę nad stanem, nagłówkami i ciałem w jednym wyrażeniu.

import org.http4s.{Response, Status}

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

Kodowanie ciał

Obiekt EntityEncoder[F, A] serializuje wartość do ciała odpowiedzi i ustawia Content-Type. Wbudowane są enkodery dla String i bajtów; enkodery JSON pochodzą z biblioteki Circe.

Gdy przekażesz wartość do Ok(value), http4s niejawnie wyszuka odpowiedni enkoder.

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

Ustawianie nagłówków odpowiedzi

Dodaj nagłówki, przekazując je jako dodatkowe argumenty do konstruktora albo łącząc efekt odpowiedzi z .map(_.putHeaders(...)).

Typowane modele nagłówków zapewniają prawidłowe formatowanie wartości, na przykład nagłówka Location w odpowiedzi 201 Created.

import org.http4s.headers.Location

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

Obsługa błędów dekodowania

req.as[A] kończy efekt F niepowodzeniem, gdy nie można zdekodować ciała. Użyj req.attemptAs[A].value, aby otrzymać F[Either[DecodeFailure, A]] i zwrócić 400 dla lewej strony wartości.

Dzięki temu obsługa nieprawidłowych danych wejściowych jest jawna i całkowita.

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

Pliki cookie i przekierowania

Ustawiaj pliki cookie za pomocą response.addCookie(ResponseCookie(name, value)). W przypadku przekierowań użyj konstruktora odpowiedzi 3xx i nagłówka Location.

SeeOther(Location(uri)) wykonuje przekierowanie 303, idiomatycznie stosowane po wysłaniu formularza, aby przekierować do pobrania zasobu.

import org.http4s.headers.Location

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

Szybki test

Zastanów się nad bezpiecznym dekodowaniem ciała.

Podsumowanie

Żądania i odpowiedzi są niezmiennymi wartościami z ciałami strumieniowanymi przez fs2. Dekoduje się je za pomocą as/attemptAs przez EntityDecoder, a koduje za pomocą EntityEncoder.

Konstruktory ustawiają kody statusu, typowane nagłówki pozostają bezpieczne, a ciasteczka i przekierowania są po prostu transformacjami odpowiedzi.

Często zadawane pytania

Czy lekcja „Żądania i odpowiedzi” jest bezpłatna?

Tak — pełny tekst „Żądania i odpowiedzi” 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 „Żądania i odpowiedzi”?

Odczyta Pan/Pani dane wejściowe i zwróci wynik. Ć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 2 z 4.

Ile czasu zajmuje lekcja „Żądania i odpowiedzi”?

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