Żą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.bodyDekodowanie 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") // 404Bezpoś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
- Trasy i HttpRoutes
- Żądania i odpowiedzi
- Endpointy JSON
- Udostępnianie aplikacji