0Pricing
Scala for Backend Engineering & Functional Programming · บทเรียน

เส้นทางและ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เส้นทางและ HttpRoutes
  2. คำขอและการตอบกลับ
  3. ปลายทาง JSON
  4. ให้บริการแอปพลิเคชัน
← กลับไปที่ Scala for Backend Engineering & Functional Programming