Permintaan dan Respons
Baca input dan kembalikan output.
Permintaan dan Respons ialah pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.
Permintaan sebagai Nilai
Dalam http4s, Request[F] ialah nilai tidak berubah yang membawa kaedah, URI, pengepala, versi HTTP, dan badan aliran. Anda memeriksanya dengan pengakses tulen dan tidak pernah mengubahnya di tempatnya.
Untuk mengubah permintaan, hasilkan salinan melalui withHeaders, withUri, atau penggubah yang serupa.
val r: Request[IO] = Request[IO](
method = Method.GET,
uri = uri"/health"
)Badan Berstrim
Badan permintaan atau respons ialah fs2.Stream[F, Byte]. Badan ini digunakan secara malas dan menghasilkan kesan, jadi muatan besar tidak perlu berada sepenuhnya dalam ingatan.
Biasanya anda tidak perlu menyentuh bait mentah; EntityDecoder mengendalikan penyahkodan untuk anda.
// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.bodyMenyahkod Badan
EntityDecoder[F, A] mengetahui cara menukar aliran badan kepada A. Panggil req.as[A] untuk menyahkod, yang mengembalikan F[A] dan menggagalkan kesan apabila badan tidak sah.
Penyahkod terbina dalam tersedia untuk String; penyahkod yang lebih kaya datang daripada 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 kes, ikatkannya dengan @. Di sini, req menamakan seluruh permintaan sementara corak masih memadankan kaedah dan laluan.
Tanpa pengikat itu, anda hanya mempunyai bahagian yang dinyahstruktur dan tidak boleh membaca badan atau pengepala.
HttpRoutes.of[IO] {
case req @ PUT -> Root / "name" =>
req.as[String].flatMap(n => Ok(s"set $n"))
}Membaca Pengepala
Pengepala berada dalam request.headers. Gunakan headers.get[H] dengan model pengepala bertip, atau headers.get(CIString("X-Custom")) untuk nama sewenang-wenangnya.
Pengepala bertip seperti Authorization dan Content-Type menghuraikan serta mengesahkan nilainya untuk anda.
import org.http4s.headers.Authorization
val auth: Option[Authorization] =
request.headers.get[Authorization]Membina Respons
Pembina respons DSL seperti Ok, Created, dan NotFound ialah fungsi yang mengembalikan F[Response[F]]. Memberikan argumen menetapkan badan melalui EntityEncoder.
Setiap pembina sepadan dengan kod status, jadi Created(...) menghasilkan 201.
Ok("all good") // 200
Created("made it") // 201
NotFound("missing") // 404Kod Status Secara Terus
Untuk status tanpa pembina mudah, atau untuk penyesuaian, bina Response[F] dengan Status yang dinyatakan secara eksplisit dan rangkaikan withEntity.
Ini memberikan kawalan penuh terhadap status, pengepala, dan badan dalam satu ungkapan.
import org.http4s.{Response, Status}
Response[IO](Status.Accepted)
.withEntity("queued")
.pure[IO]Mengekodkan Badan
EntityEncoder[F, A] mensiriankan nilai ke dalam badan respons dan menetapkan Content-Type. Pengekod untuk String dan bait tersedia secara terbina dalam; pengekod JSON datang daripada circe.
Apabila anda memberikan nilai kepada Ok(value), http4s mencari pengekod implisit.
// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")Menetapkan Pengepala Respons
Tambahkan pengepala dengan memberikannya sebagai argumen tambahan kepada pembina, atau rangkaikan .map(_.putHeaders(...)) pada kesan respons.
Model pengepala bertip memastikan nilai diformat dengan betul, contohnya pengepala Location pada 201 Created.
import org.http4s.headers.Location
Created("ok").map(_.putHeaders(
Location(uri"/items/42")
))Mengendalikan Kegagalan Penyahkodan
req.as[A] menggagalkan kesan F apabila badan tidak boleh dinyahkod. Gunakan req.attemptAs[A].value untuk mendapatkan F[Either[DecodeFailure, A]] dan memberikan respons 400 pada bahagian kiri.
Ini menjadikan pengendalian input tidak sah jelas dan menyeluruh.
req.attemptAs[String].value.flatMap {
case Right(b) => Ok(b)
case Left(_) => BadRequest("bad body")
}Kuki dan Pengalihan
Tetapkan kuki dengan response.addCookie(ResponseCookie(name, value)). Untuk pengalihan, gunakan pembina 3xx dan pengepala Location.
SeeOther(Location(uri)) melaksanakan 303, iaitu respons post-redirect-get yang lazim.
import org.http4s.headers.Location
SeeOther(Location(uri"/login"))
.map(_.addCookie("sid", "abc123"))Semakan Pantas
Fikirkan tentang penyahkodan badan yang selamat.
Imbas Kembali
Permintaan dan respons ialah nilai tidak boleh ubah dengan badan fs2 yang distrim. Anda menyahkod dengan as/attemptAs melalui EntityDecoder dan mengekod dengan EntityEncoder.
Pembina menetapkan kod status, pengepala bertip kekal selamat, manakala kuki dan lencongan hanyalah transformasi respons.
Pelajari Scala dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 39
- Pelajaran
- 143
Soalan Lazim
Adakah pelajaran “Permintaan dan Respons” percuma?
Ya — teks penuh “Permintaan dan Respons” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian, tingkat taraf kepada CoddyKit PRO. Kursus Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Permintaan dan Respons”?
Baca input dan kembalikan output. Anda berlatih Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Permintaan dan Respons” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian ini?
Ya. Setiap pelajaran Scala untuk Kejuruteraan Bahagian Belakang dan Pengaturcaraan Fungsian menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Laluan dan HttpRoutes
- Permintaan dan Respons
- Titik Akhir JSON
- Menghidangkan Aplikasi