0Pricing
Scala for Backend Engineering & Functional Programming · Pelajaran

Permintaan dan Respons

Baca masukan dan kembalikan keluaran.

Permintaan dan Respons adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Permintaan sebagai Nilai

Dalam http4s, Request[F] adalah nilai immutable yang membawa metode, URI, header, versi HTTP, dan body streaming. Anda memeriksanya dengan accessor murni dan tidak pernah memutasinya secara langsung.

Untuk mengubah permintaan, buat salinannya melalui withHeaders, withUri, atau kombinator serupa.

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

Body Streaming

Body permintaan atau respons adalah fs2.Stream[F, Byte]. Body dikonsumsi secara malas dan menghasilkan efek, sehingga payload besar tidak harus sepenuhnya berada di memori.

Biasanya Anda tidak perlu menyentuh byte mentah; EntityDecoder menanganinya untuk Anda.

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

Mendekode Body

EntityDecoder[F, A] mengetahui cara mengubah aliran body menjadi A. Panggil req.as[A] untuk mendekode; fungsi ini mengembalikan F[A] dan menggagalkan efek jika body tidak valid.

Decoder bawaan tersedia untuk String; decoder yang lebih kaya berasal dari modul JSON.

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

Mengikat Permintaan

Untuk mengakses objek permintaan di dalam case, ikat dengan @. Di sini, req menamai seluruh permintaan, sementara pola tetap mencocokkan metode dan jalur.

Tanpa pengikat tersebut, Anda hanya memiliki bagian-bagian yang diurai dan tidak dapat membaca body atau header.

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

Membaca Header

Header berada di request.headers. Gunakan headers.get[H] dengan model header bertipe, atau headers.get(CIString("X-Custom")) untuk nama arbitrer.

Header bertipe seperti Authorization dan Content-Type menguraikan serta memvalidasi nilainya untuk Anda.

import org.http4s.headers.Authorization

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

Membuat Respons

Pembuat respons DSL seperti Ok, Created, dan NotFound adalah fungsi yang mengembalikan F[Response[F]]. Pemberian argumen menetapkan body melalui EntityEncoder.

Setiap pembuat berkaitan dengan kode status, sehingga Created(...) menghasilkan 201.

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

Kode Status secara Langsung

Untuk status yang tidak memiliki pembuat praktis, atau untuk kustomisasi, buat Response[F] dengan Status eksplisit, lalu rangkai withEntity.

Dengan demikian, Anda memiliki kendali penuh atas status, header, dan body dalam satu ekspresi.

import org.http4s.{Response, Status}

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

Mengenkode Body

EntityEncoder[F, A] menserialisasi nilai menjadi body respons dan menetapkan Content-Type. Encoder String dan byte tersedia secara bawaan; encoder JSON berasal dari circe.

Saat Anda meneruskan nilai ke Ok(value), http4s mencari encoder implicit.

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

Menetapkan Header Respons

Tambahkan header dengan meneruskannya sebagai argumen tambahan ke pembuat, atau rangkai .map(_.putHeaders(...)) pada efek respons.

Model header bertipe memastikan nilai diformat dengan benar, misalnya header Location pada 201 Created.

import org.http4s.headers.Location

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

Menangani Kegagalan Decoding

req.as[A] menggagalkan efek F saat body tidak dapat didekode. Gunakan req.attemptAs[A].value untuk memperoleh F[Either[DecodeFailure, A]], lalu berikan respons 400 untuk bagian kiri.

Dengan demikian, penanganan input yang tidak valid tetap eksplisit dan total.

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

Cookie dan Pengalihan

Tetapkan cookie dengan response.addCookie(ResponseCookie(name, value)). Untuk pengalihan, gunakan pembuat 3xx dan header Location.

SeeOther(Location(uri)) melakukan pengalihan 303, yaitu respons post-redirect-get yang lazim.

import org.http4s.headers.Location

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

Pemeriksaan Singkat

Pikirkan cara mendekode body dengan aman.

Ringkasan

Permintaan dan respons adalah nilai yang tidak dapat diubah dengan isi fs2 yang dialirkan. Anda melakukan dekode dengan as/attemptAs melalui EntityDecoder, dan enkode dengan EntityEncoder.

Builder menetapkan kode status, header bertipe tetap aman, sedangkan cookie dan pengalihan hanyalah transformasi respons.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Permintaan dan Respons” gratis?

Ya — teks lengkap “Permintaan dan Respons” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Permintaan dan Respons”?

Baca masukan dan kembalikan keluaran. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?

Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Permintaan dan Respons” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?

Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Rute dan HttpRoutes
  2. Permintaan dan Respons
  3. Endpoint JSON
  4. Menyediakan Aplikasi
← Kembali ke Scala for Backend Engineering & Functional Programming