นักพัฒนา RESTFul API ด้วย Spring Boot นั้นมักจะ return ข้อมูลที่ error กลับมา
ในรูปแบบที่หลากหลายแล้วแต่จะออกแบบไป
แต่หนึ่งในแนวทางที่น่าสนใจคือ ProblemDetail
ซึ่งมีรูปแบบตาม RFC 9457
ดังนั้นมาลองทำความรู้จักและใช้งานกันดู
เพื่อช่วยให้ error message เข้าใจได้ง่ายขึ้น
สิ่งที่ต้องเข้าใจก่อนคือ การจัดการ error ที่ไม่ดีเป็นดังนี้
- Error ที่ส่งกลับไปไม่เป็นประโยชน์ เข้าใจยาก
- สื่อสารกลับไปแบบผิด ๆ
- ชอบซ่อน information ของ error ไว้มากเกินไป
- ชอบส่ง stack trace กลับไปทั้งหมด แบบนี้ก็เยอะเกินไป อาจจะเกิด data leak ได้ง่าย ๆ
- แต่ละทีม แต่ละ product ก็มีรูปแบบของ error message ที่แตกต่างกันไป !!
ซึ่งจากการจัดการไม่ดีส่งผลให้เกิดปัญหาอื่น ๆ ตามมา
ทั้งเวลาในการพัฒนา
ทั้งประสบการณ์ในการพัฒนาที่ไม่ดี
ทั้งเรื่องของความปลอดภัยของระบบ
ทั้งในเรื่องการ integrate กับระบบอื่น ๆ ซึ่งซับซ้อนมาก
ดังนั้นหนึ่งในแนวทางเพื่อช่วยลดปัญหาคือ จัดการรูปแบบของ error ให้เป็นมาตรฐาน
โดยหนึ่งในแนวทางนั้นคือ Problem Detail นั่นเอง
โดยที่ Problem Detail มีโครงสร้างดังนี้
- type บอกชนิดของปัญหา หรือ URL
- status คือ HTTP status code
- title คือ ชื่อสั้น ๆ ที่คนอ่านเข้าใจได้ง่าย
- detail คือ รายละเอียดเพื่ออธิบายปัญหานั้น ๆ
- instance คือ URI ของ request นั้น ๆ
- extension คือ field ที่เพิ่มเข้าในแต่ละส่วนง่าย ทำการ custom ได้เลย
ยกตัวอย่างเช่น
[gist id="6174eb11323dc1f17e2437fa839ec270" file="1.txt"]ดังนั้นมาลองใช้ใน Spring Boot กันหน่อย
วิธีการแรก เปิดใช้งานด้วยการ config ไฟล์ application.properties ไปเลย
[gist id="6174eb11323dc1f17e2437fa839ec270" file="application.properties"]ตัวอย่างเมื่อ return HTTP status code = 404
[gist id="6174eb11323dc1f17e2437fa839ec270" file="404.txt"]วิธีการที่สอง จัดการใช้ ControllerAdvice ได้เลย
[gist id="6174eb11323dc1f17e2437fa839ec270" file="GlobalExceptionHandler.java"]เพียงเท่านี้ก็คุยกันง่ายขึ้นแล้ว
ขอให้สนุกกับการ coding ครับ
Reference Websites