Endpoint JSON
Gabungkan http4s dengan Circe.
Endpoint JSON adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 3 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.
JSON melalui circe
http4s mengintegrasikan JSON melalui modul http4s-circe, yang menjembatani codec circe dengan EntityDecoder dan EntityEncoder. circe adalah pustaka JSON fungsional de facto untuk Scala.
Anda mendefinisikan instans Encoder dan Decoder untuk tipe Anda, lalu membiarkan http4s menangani format di jaringan.
// build.sbt
// "org.http4s" %% "http4s-circe" % http4sV
// "io.circe" %% "circe-generic" % circeVMenurunkan Codec
Dengan circe-generic, Anda dapat menurunkan codec secara otomatis menggunakan deriveEncoder/deriveDecoder atau anotasi @JsonCodec. Codec tersebut memetakan bidang case class ke kunci JSON berdasarkan namanya.
Penurunan ini memerlukan codec untuk setiap tipe bidang, secara rekursif.
import io.circe.generic.semiauto._
case class User(id: Int, name: String)
implicit val enc = deriveEncoder[User]
implicit val dec = deriveDecoder[User]EntityEncoder dari circe
Impor org.http4s.circe.CirceEntityEncoder._ menyediakan EntityEncoder[F, A] implisit untuk setiap A yang memiliki Encoder circe. Kemudian Ok(user) diserialisasi menjadi JSON dengan application/json.
Handler tidak perlu melakukan konversi manual ke Json.
import org.http4s.circe.CirceEntityEncoder._
HttpRoutes.of[IO] {
case GET -> Root / "me" => Ok(User(1, "Ada"))
}EntityDecoder dari circe
Gambaran sebaliknya: org.http4s.circe.CirceEntityDecoder._ menyediakan EntityDecoder[F, A] untuk setiap A yang memiliki Decoder circe. Kemudian req.as[User] mengurai isi JSON.
Kedua impor tersebut bersama-sama tersedia sebagai CirceEntityCodec._.
import org.http4s.circe.CirceEntityDecoder._
case req @ POST -> Root / "users" =>
req.as[User].flatMap(u => Created(u))POST JSON Lengkap
Menggabungkan dekode dan enkode menghasilkan titik akhir pembuatan yang rapi: mengurai JSON yang masuk menjadi tipe domain, menjalankan logika bisnis, lalu mengenkode hasilnya kembali sebagai JSON.
Kegagalan dekode muncul sebagai 422 atau 400 melalui decoder circe.
import org.http4s.circe.CirceEntityCodec._
case req @ POST -> Root / "users" =>
for {
in <- req.as[User]
out <- store.create(in)
res <- Created(out)
} yield resInterpolator json
Untuk JSON ad hoc, interpolator string json milik circe dari io.circe.literal membuat nilai Json secara langsung, dengan nilai Scala yang diinterpolasikan.
Ini berguna untuk respons kecil atau perlengkapan pengujian tanpa case class.
import io.circe.literal._
val body = json"""{ "status": "ok", "count": 3 }"""
Ok(body)Nama Bidang Khusus
Jika kunci JSON berbeda dari nama bidang Scala, lakukan penurunan dengan Configuration dari circe-generic-extras, misalnya snake_case, atau tulis codec secara manual menggunakan forProduct2.
Dengan demikian, kontrak API terpisah dari penamaan internal Anda.
import io.circe.Encoder
implicit val e: Encoder[User] =
Encoder.forProduct2("user_id", "full_name")(u => (u.id, u.name))Menkode List
circe secara otomatis menyediakan codec untuk List, Vector, Option, dan Map setelah codec elemennya tersedia. Jadi, mengembalikan koleksi langsung dapat dilakukan.
List kosong dienkode menjadi [], sedangkan None menjadi kunci yang tidak ada atau null.
import org.http4s.circe.CirceEntityEncoder._
case GET -> Root / "users" =>
store.all.flatMap(us => Ok(us)) // List[User] -> JSON arrayMemvalidasi JSON yang Telah Diurai
Dekode menghasilkan nilai yang valid secara sintaksis; validasi semantis menjadi tanggung jawab Anda. Jalankan pemeriksaan setelah as dan hentikan proses dengan BadRequest jika tidak valid.
Simpan invarian domain dalam konstruktor cerdas yang mengembalikan Either agar lebih jelas.
req.as[User].flatMap { u =>
if (u.name.nonEmpty) Created(u)
else BadRequest("name required")
}Respons Kesalahan sebagai JSON
Kembalikan kesalahan terstruktur sebagai JSON agar klien dapat menguraikannya. Definisikan case class kesalahan dengan encoder circe, lalu berikan ke builder status yang relevan.
Bentuk kesalahan yang konsisten membuat API jauh lebih mudah digunakan.
case class ApiError(code: String, message: String)
implicit val e = deriveEncoder[ApiError]
BadRequest(ApiError("E_NAME", "name required"))JSON Streaming
Untuk koleksi besar, Anda dapat mengalirkan JSON alih-alih menampungnya di memori. jsonEncoderOf ditambah Stream[F, A] fs2 memancarkan array JSON secara bertahap.
Hal ini menjaga penggunaan memori tetap konstan untuk kumpulan hasil besar dengan memanfaatkan tekanan balik fs2.
import org.http4s.circe.streamJsonArrayEncoder
case GET -> Root / "feed" =>
Ok(store.streamAll) // fs2.Stream[IO, Event]Pemeriksaan Singkat
Ingat kembali impor yang mengaktifkan dekode isi JSON menjadi case class.
Rangkuman
Anda menghubungkan JSON dengan http4s-circe: menurunkan codec, mengimpor CirceEntityCodec, dan menggunakan Ok(value) / req.as[A] untuk I/O JSON lengkap.
Anda menangani list, nama bidang khusus, kesalahan JSON terstruktur, bahkan array streaming untuk muatan besar.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Endpoint JSON” gratis?
Ya — teks lengkap “Endpoint JSON” 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 “Endpoint JSON”?
Gabungkan http4s dengan Circe. 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 3 dari 4.
Berapa lama pelajaran “Endpoint JSON” 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.