ข้าม​ไป​ยัง​เนื้อหา

ขอบ HTTP ของ​คลินิก — สัญญา​ที่​ผู้​เรียก​ปลาย​สาย​อ่าน​ออก

คอร์ส​ก่อน​หน้า​จบ​ด้วย​ระบบ​ที่​ถูก​ต้อง​ข้าง​ใน โดเมน​ตรวจ​ถูก ขอบ transaction อยู่​ถูก​ที่ ฐาน​ข้อมูล​กัน​จอง​ซ้อน​ได้​จริง แล้ว​ผู้​เรียก​ที่​อยู่​ปลาย​สาย HTTP ได้​อะไร คำ​ตอบ​ที่​วัด​ได้​คือ 500 พร้อม body สี่​คีย์​ที่​บอก​อะไร​ไม่​ได้​เลย คอร์ส​นี้​จึง​ไม่ใช่​คอร์ส​สร้าง REST API มัน​คือ​คอร์ส​เรื่อง​สัญญา​ที่​ขอบ ทุก​ข้อ​อ้าง​มา​จาก probe ที่​คุณ​รัน​เอง​ได้
ความคืบหน้า0 / 8 บทเรียน

แปดบท เรียง​ตาม​ระยะ​ทาง​ที่​ความ​ถูก​ต้อง​ข้าง​ใน​ต้อง​เดิน​ทาง กว่า​จะ​ถึง​ผู้​เรียก

คุณ​เขียน controller เป็น​อยู่​แล้ว และ​เคย​เห็น 500 ที่​อธิบาย​อะไร​ไม่​ได้​มา​แล้ว

คอร์ส​นี้​ไม่​ได้​เริ่ม​ที่​ว่า @RestController คือ​อะไร · มัน​เริ่ม​ที่​คำถาม​ว่า สิ่ง​ที่​คุณ​สร้าง​ไว้​ถูก​ต้อง​แล้ว ออก​ไป​ถึง​คน​ที่​เรียก​ใช้​หรือ​เปล่า

ถ้า​ยัง​ไม่​เคย​ผ่าน​คอร์ส​ก่อน​หน้า ไป​ที่ คอร์ส Kotlin + Spring Boot + Clean Architecture ก่อน​ได้ · คอร์ส​นี้​ใช้​โปร​เจ​กต์​เดียวกัน​ต่อ ไม่​ได้​เริ่ม​ใหม่

ไม่ใช่ “ตอบ​กลับ​อย่างไร​ให้​สวย” แต่​เป็น “ผู้​เรียก​ทำ​อะไร​ต่อ​ได้​จาก​สิ่ง​ที่​เรา​ตอบ​ไป”

คำขอ​ที่​ผิด​กับ​ระบบ​ที่​พัง​จริง ตอบ​กลับ​ด้วย body รูป​เดีย​วกันเป๊ะ ต่าง​กัน​แค่​ตัวเลข · ผู้​เรียก​จึง​แยก​สอง​อย่าง​นี้​ออก​จาก​กัน​ไม่​ได้ นอกจาก​จะ​เดา

และ​เมื่อ​ฐาน​ข้อมูล​กัน​ข้อมูล​ที่​ขัด​กัน​ไว้​ได้​สำเร็จ สิ่ง​ที่​ออก​ไป​คือ 500 ซึ่ง​แปล​ว่า​เรา​พัง · ผู้​เรียก​ที่​อ่าน​รหัส​นั้น​จะ​ลอง​ใหม่ ทั้ง​ที่​ลอง​กี่​ครั้ง​ก็​ชน​เหมือน​เดิม

ขอบ HTTP ของ​ระบบ​จอง​คิว​คลินิก​ตัว​เดิม — ไม่​ได้​เริ่ม​โปร​เจ​กต์​ใหม่

โดเมน​กับ repository ของ​คอร์ส​ก่อน​อยู่​ครบ · สิ่ง​ที่​เพิ่ม​เข้า​มา​คือ​ชั้น​ที่​คุย​กับ​โลก​ข้าง​นอก และ​เทสต์​ที่​บังคับ​ว่า​ชั้น​นั้น​พูด​ตรง​กับ​ที่​สัญญา​ไว้

หก​ข้อ · ทุก​ข้อ​มี​คำ​สั่ง​ที่​คุณ​รัน​เอง​แล้ว​เห็น​ค่า​เดียวกัน

  • body ค่า​ตั้ง​ต้น​บอก​ผู้​เรียก​ไม่​ได้​ว่า​อะไร​ผิด — สี่​คีย์ และ​ไม่มี​คีย์​ไหน​ชี้​ที่​ช่อง​ที่​ผิด
  • คำขอ​ที่​ผิด​กับ exception ที่​หลุด ได้ body รูป​เดียวกัน — เทียบ​ชื่อ​คีย์​ที​ละ​ตัว
  • ตัว​จัดการ​ที่​เขียน​ไว้​อาจ​ไม่​เคย​รัน​เลย — พิสูจน์​ด้วย marker ที่​ไม่มี​ทาง​บังเอิญ​ตรง
  • problemdetails แก้​ครึ่ง​เดียว — content-type เปลี่ยน แต่​ความ​ขัด​แย้ง​ยัง​เป็น 500
  • 23P01 แปลง​เป็น 409 ได้ — และ​จำนวน​แถว​ไม่​เปลี่ยน ซึ่ง​เป็น​ช่อง​ควบคุม
  • คีย์​เดิม​กับ​คีย์​ใหม่​ต้อง​ได้​คำ​ตอบ​คนละ​แบบ — วัด​ด้วย id ที่​คืน​มา​และ​จำนวน​แถว

สี่​ข้อ​ที่​ตัด​ออก พร้อม​เหตุผล​ของ​แต่ละ​ข้อ

  • ไม่​สอน REST ตั้งแต่​ต้น ผู้​อ่าน​เขียน controller เป็น​อยู่​แล้ว · คอร์ส​นี้​เริ่ม​ที่​สิ่ง​ที่ controller ตอบ​ออก​ไป ไม่ใช่​ที่​วิธี​เขียน​มัน
  • ไม่​แตะ​เรื่อง​ความ​ปลอดภัย การ​ยืนยัน​ตัว​ตน​กับ​สิทธิ์​เป็น​คอร์ส​ของ​ตัว​เอง
  • ไม่​วัด​ความเร็ว ทั้ง​คอร์ส​ไม่มี​หน่วย​เวลา​สัก​ตัว · หน่วย​ที่​ใช้​คือ​รหัส HTTP · content-type · ชื่อ​และ​จำนวน​คีย์​ใน body · ชนิด​ของ exception · SQLSTATE · จำนวน link · จำนวน​แถว
  • ไม่​ทำ​หน้า​จอ ทุก​อย่าง​ใน​คอร์ส​นี้​วัด​จาก​คำขอ​กับ​คำ​ตอบ

ข้อ​ที่​ต้อง​พูด​ออก​มา​ก่อน เพราะ​สอง​คอร์ส​นี้​ใช้​โปร​เจ​กต์​เดียวกัน

คอร์ส​ก่อน​หน้า ถาม​ว่า​อะไร​บังคับ​ให้​โครงสร้าง​ข้าง​ใน ยัง​ถูก​ต้อง​อยู่ · คำ​ตอบ​ของ​มัน​คือ compiler กับ​ฐาน​ข้อมูล และ​มัน​พิสูจน์​ทั้ง​สอง​อย่าง​จน​จบ

คอร์ส​นี้​รับ​ช่วง​ต่อ​ที่​ประตู​ทางออก · มัน​สมมติ​ว่า​ข้าง​ใน​ถูก​ต้อง​แล้ว แล้ว​ถาม​ว่า ความ​ถูก​ต้อง​นั้น​เหลือ​อะไร​อยู่​บ้าง เมื่อ​ออก​ไป​ถึง​คน​ที่​เรียก​ใช้

สี่​อย่าง · และ​มี​ข้อ​หนึ่ง​ที่​ต้อง​ระวัง​เพราะ​คอร์ส​ก่อน​ใช้​ของ​ชื่อ​คล้าย​กัน

  • JDK 25 ตรึง​ด้วย jvmToolchain(25) เหมือน​คอร์ส​ก่อน
  • Gradle 9.7.1 กับ Kotlin DSL
  • Docker สำหรับ PostgreSQL 18
  • container คนละ​ตัว​กับ​คอร์ส​ก่อน · สั่ง​ด้วย scripts/clinic-http-boundary/up.sh · ใช้​ตัว​เดียวกัน​ไม่​ได้ เพราะ EXCLUDE สร้าง index ที่​ชื่อ​ต้อง​ไม่​ซ้ำ​ทั้ง​ส​คี​มา