Rute dan HttpRoutes
Definisikan endpoint secara fungsional.
Rute dan HttpRoutes adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 1 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.
Apa Itu http4s
http4s adalah pustaka HTTP fungsional murni untuk Scala, yang dibangun di atas cats-effect dan aliran fs2. Permintaan dan respons merupakan nilai immutable, sedangkan efek ditampung dalam tipe efek polimorfik F[_] seperti IO.
Alih-alih memutasi servlet, Anda mendeskripsikan layanan HTTP sebagai fungsi dari permintaan ke respons opsional yang menghasilkan efek.
Tipe HttpRoutes
Abstraksi intinya adalah HttpRoutes[F], alias untuk Kleisli[OptionT[F, *], Request[F], Response[F]]. OptionT memodelkan rute yang mungkin tidak cocok dan tidak mengembalikan respons.
Anda jarang menulis signature tersebut secara manual. Sebagai gantinya, buat rute dengan konstruktor HttpRoutes.of dan partial function.
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 http4s
Impor DSL org.http4s.dsl.io._ menyediakan pencocok pola seperti GET, Root, dan pemisah jalur /, serta pembuat respons seperti Ok dan NotFound.
Rute adalah PartialFunction[Request[F], F[Response[F]]]. Case yang tidak cocok akan langsung diteruskan.
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}Mencocokkan Jalur
Pola jalur dibaca dari kiri ke kanan. Root adalah garis miring pembuka, dan setiap / "segment" mencocokkan satu segmen jalur literal.
Panah -> memisahkan metode HTTP dari jalur. Jadi, GET -> Root / "users" mencocokkan GET /users.
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}Variabel Jalur
Pengikat huruf kecil tanpa tanda khusus dalam jalur menangkap segmen tersebut sebagai String. Di sini, id mengikat apa pun yang muncul setelah /users/.
Segmen yang ditangkap selalu berupa string; Anda harus menguraikannya sendiri menjadi tipe yang lebih kaya atau menggunakan objek extractor yang ditunjukkan berikutnya.
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}Extractor Jalur Bertipe
http4s menyediakan extractor seperti IntVar dan LongVar yang hanya cocok jika segmen dapat diuraikan menjadi tipe tersebut. Segmen nonnumerik membuat case diteruskan ke case berikutnya.
Anda dapat menentukan extractor kustom dengan unapply untuk tipe domain seperti UUID.
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}Pencocokan Metode
Extractor metode sebelum -> dapat berupa GET, POST, PUT, DELETE, PATCH, dan lainnya. Jalur yang sama dengan metode berbeda menjadi case terpisah.
Jika jalurnya cocok tetapi metodenya tidak, http4s secara otomatis merespons 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()
}Menggabungkan Rute
Karena HttpRoutes[F] membentuk SemigroupK, Anda menyusun beberapa kelompok rute dengan operator <+>. Kelompok pertama yang menghasilkan respons akan digunakan.
Dengan demikian, Anda dapat memisahkan rute berdasarkan fitur menjadi beberapa nilai, lalu menggabungkannya di satu tempat.
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesRute menjadi HttpApp
Server memerlukan fungsi total, bukan fungsi parsial. HttpRoutes[F] dikonversi menjadi HttpApp[F] dengan .orNotFound, yang menyediakan 404 jika tidak ada rute yang cocok.
HttpApp[F] adalah Kleisli[F, Request[F], Response[F]] — selalu mengembalikan respons.
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundMembungkus dengan Middleware
Middleware adalah fungsi HttpRoutes[F] => HttpRoutes[F] atau fungsi di atas HttpApp. Middleware membungkus layanan untuk menambahkan pencatatan, CORS, gzip, atau autentikasi tanpa menyentuh logika rute.
Contoh bawaan mencakup Logger, CORS, dan GZip dari org.http4s.server.middleware.
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)Parameter Kueri dalam Rute
Parameter kueri dicocokkan dengan objek pencocok yang memperluas QueryParamDecoderMatcher. Parameter tersebut muncul setelah :? dalam pola jalur.
Gunakan OptionalQueryParamDecoderMatcher untuk parameter yang mungkin tidak ada, yang menghasilkan Option.
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}Pemeriksaan Singkat
Uji pemahaman Anda tentang komposisi rute.
Ringkasan
Anda membuat rute dengan HttpRoutes.of dan DSL, mencocokkan metode serta jalur, menangkap variabel dengan IntVar dan matcher, lalu menyusun kelompok dengan <+>.
Rute bersifat parsial; .orNotFound menjadikannya HttpApp total, dan middleware membungkus layanan untuk menangani perhatian lintas fitur.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Rute dan HttpRoutes” gratis?
Ya — teks lengkap “Rute dan HttpRoutes” 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 “Rute dan HttpRoutes”?
Definisikan endpoint secara fungsional. 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 1 dari 4.
Berapa lama pelajaran “Rute dan HttpRoutes” 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
- Rute dan HttpRoutes
- Permintaan dan Respons
- Endpoint JSON
- Menyediakan Aplikasi