เส้นทางและ HttpRoutes
กำหนดปลายทางเชิงฟังก์ชัน
เส้นทางและ HttpRoutes เป็นบทเรียน Scala for Backend Engineering & Functional Programming ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Scala for Backend Engineering & Functional Programming และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
http4s คืออะไร
http4s เป็นไลบรารี HTTP เชิงฟังก์ชันล้วนสำหรับ Scala ซึ่งสร้างบน cats-effect และสตรีม fs2 คำขอและการตอบสนองเป็นค่าที่เปลี่ยนแปลงไม่ได้ และเอฟเฟกต์จะถูกเก็บไว้ในชนิดเอฟเฟกต์แบบพหุนาม F[_] เช่น IO
แทนที่จะเปลี่ยนแปลง servlet โดยตรง คุณจะอธิบายบริการ HTTP เป็นฟังก์ชันจากคำขอไปยังการตอบสนองแบบเลือกได้ซึ่งมีเอฟเฟกต์
ชนิด HttpRoutes
นามธรรมหลักคือ HttpRoutes[F] ซึ่งเป็นชื่อแทนของ Kleisli[OptionT[F, *], Request[F], Response[F]] โดย OptionT แทนเส้นทางที่อาจไม่ตรงกับคำขอและส่งคืนการตอบสนองเป็นไม่มีค่า
โดยทั่วไปคุณไม่ต้องเขียนลายเซ็นนี้ด้วยตนเอง แต่สร้างเส้นทางด้วยคอนสตรักเตอร์ HttpRoutes.of และฟังก์ชันบางส่วน
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
การนำเข้า DSL org.http4s.dsl.io._ จะนำตัวแยกรูปแบบอย่าง GET, Root และตัวคั่นเส้นทาง / เข้ามา รวมถึงตัวสร้างการตอบสนองอย่าง Ok และ NotFound
เส้นทางคือ PartialFunction[Request[F], F[Response[F]]] กรณีที่ไม่ตรงกันจะถูกส่งต่อไปยังกรณีถัดไป
import org.http4s.dsl.io._
HttpRoutes.of[IO] {
case GET -> Root => Ok("root")
case GET -> Root / "ping" => Ok("pong")
}การจับคู่เส้นทาง
รูปแบบเส้นทางจะอ่านจากซ้ายไปขวา Root คือเครื่องหมายทับนำหน้า และแต่ละ / "segment" จะจับคู่ส่วนของเส้นทางตามตัวอักษรหนึ่งส่วน
ลูกศร -> แยกเมธอด HTTP ออกจากเส้นทาง ดังนั้น GET -> Root / "users" จะจับคู่กับ GET /users
HttpRoutes.of[IO] {
case GET -> Root / "users" => Ok("all users")
case GET -> Root / "users" / "me" => Ok("current user")
}ตัวแปรในเส้นทาง
ตัวจับคู่ที่เขียนด้วยตัวพิมพ์เล็กโดยไม่มีสิ่งอื่นในเส้นทางจะจับส่วนดังกล่าวเป็น String ในที่นี้ id จะผูกกับค่าที่ปรากฏหลัง /users/
ส่วนของเส้นทางที่จับได้จะเป็นสตริงเสมอ คุณต้องแปลงเป็นชนิดที่มีความหมายมากขึ้นเอง หรือใช้วัตถุตัวแยกที่จะแสดงถัดไป
HttpRoutes.of[IO] {
case GET -> Root / "users" / id =>
Ok(s"user $id")
}ตัวแยกเส้นทางแบบระบุชนิด
http4s มีตัวแยกอย่าง IntVar และ LongVar ซึ่งจะจับคู่เฉพาะเมื่อส่วนของเส้นทางแปลงเป็นชนิดนั้นได้ หากส่วนดังกล่าวไม่ใช่ตัวเลข กรณีนั้นจะถูกส่งต่อไปยังกรณีถัดไป
คุณสามารถกำหนดตัวแยกแบบกำหนดเองด้วย unapply สำหรับชนิดเฉพาะโดเมนอย่าง UUID ได้
HttpRoutes.of[IO] {
case GET -> Root / "users" / IntVar(id) =>
Ok(s"numeric user $id")
}การจับคู่เมธอด
ตัวแยกเมธอดก่อน -> อาจเป็น GET, POST, PUT, DELETE, PATCH หรือเมธอดอื่น ๆ เส้นทางเดียวกันที่ใช้เมธอดต่างกันจะกลายเป็นกรณีแยกกัน
หากเส้นทางตรงกันแต่เมธอดไม่ตรง http4s จะตอบกลับ 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()
}การรวมเส้นทาง
เนื่องจาก HttpRoutes[F] เป็น SemigroupK คุณจึงประกอบกลุ่มเส้นทางหลายกลุ่มด้วยตัวดำเนินการ <+> กลุ่มแรกที่สร้างการตอบสนองจะเป็นผู้ชนะ
วิธีนี้ช่วยให้คุณแยกเส้นทางตามฟีเจอร์เป็นค่าหลายค่า แล้วนำมารวมกันในที่เดียว
import cats.syntax.semigroupk._
val all = userRoutes <+> itemRoutes <+> healthRoutesแปลง Routes เป็น HttpApp
เซิร์ฟเวอร์ต้องการฟังก์ชันทั้งหมด ไม่ใช่ฟังก์ชันบางส่วน HttpRoutes[F] จะถูกแปลงเป็น HttpApp[F] ด้วย .orNotFound ซึ่งจัดเตรียม 404 เมื่อไม่มีเส้นทางใดตรงกัน
HttpApp[F] คือ Kleisli[F, Request[F], Response[F]] ซึ่งจะส่งคืนการตอบสนองเสมอ
import org.http4s.HttpApp
val app: HttpApp[IO] = routes.orNotFoundการห่อด้วย Middleware
Middleware คือฟังก์ชัน HttpRoutes[F] => HttpRoutes[F] (หรือทำงานกับ HttpApp) โดยจะห่อบริการเพื่อเพิ่มการบันทึกข้อมูล, CORS, gzip หรือการยืนยันตัวตน โดยไม่แตะต้องตรรกะของเส้นทาง
ตัวอย่างที่มีให้ ได้แก่ Logger, CORS และ GZip จาก org.http4s.server.middleware
import org.http4s.server.middleware.Logger
val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)พารามิเตอร์คำค้นหาในเส้นทาง
พารามิเตอร์คำค้นหาจะจับคู่ด้วยวัตถุตัวจับคู่ที่สืบทอดจาก QueryParamDecoderMatcher โดยจะปรากฏหลัง :? ในรูปแบบเส้นทาง
ใช้ OptionalQueryParamDecoderMatcher สำหรับพารามิเตอร์ที่อาจไม่มีอยู่ ซึ่งจะให้ผลลัพธ์เป็น Option
object NameParam extends QueryParamDecoderMatcher[String]("name")
HttpRoutes.of[IO] {
case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจของคุณเกี่ยวกับการประกอบเส้นทาง
สรุปทบทวน
คุณสร้างเส้นทางด้วย HttpRoutes.of และ DSL จับคู่เมธอดกับเส้นทาง จับตัวแปรด้วย IntVar และตัวจับคู่ และประกอบกลุ่มต่าง ๆ ด้วย <+>
เส้นทางเป็นฟังก์ชันบางส่วน ส่วน .orNotFound จะทำให้กลายเป็น HttpApp ที่เป็นฟังก์ชันทั้งหมด และ middleware จะห่อบริการเพื่อจัดการข้อกังวลร่วมกัน
คำถามที่พบบ่อย
บทเรียน “เส้นทางและ HttpRoutes” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เส้นทางและ HttpRoutes” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Scala for Backend Engineering & Functional Programming ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Scala for Backend Engineering & Functional Programming มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เส้นทางและ HttpRoutes”
กำหนดปลายทางเชิงฟังก์ชัน คุณปฏิบัติ Scala for Backend Engineering & Functional Programming ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Scala for Backend Engineering & Functional Programming หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Scala for Backend Engineering & Functional Programming บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “เส้นทางและ HttpRoutes” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Scala for Backend Engineering & Functional Programming นี้ได้ไหม
ได้ บทเรียน Scala for Backend Engineering & Functional Programming ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เส้นทางและ HttpRoutes
- คำขอและการตอบกลับ
- ปลายทาง JSON
- ให้บริการแอปพลิเคชัน