Validate API Input ของ Spring Boot Application
การทำ API เนี่ย สิ่งที่หนีไม่พ้นจะต้องทำอยู่เสมอก็คือการ validate input ของ request ที่เข้ามาหา API เรานั่นเอง
ใน Episode นี้ขอไม่พูดพรำ่ทำเพลงเยอะ เข้าเรื่องวิธีการ validate input เลยแล้วกัน โดยอ้างอิง Source code จากบทความก่อนหน้า ถ้าใครยังไม่ได้อ่านก็ตามไปอ่านกันได้นาาา
สิ่งที่เราจะทำ
- เมื่อสร้าง Cosmetic แล้ว amout ที่ใส่เข้ามาจะต้องไม่ติดลบ หรือเป็นศูนย์
- name ไม่สามารถเป็น String ว่างๆ หรือ null ได้
สิ่งที่ต้องเตรียม
- Project Cosmetics เดิมของเรานั่นเอง
- เวลาอีกสัก 15 นาทีนั่นแหล่ะ ไม่นานนนนนน
เริ่ม !
ก่อนอื่นขอพูดถึงการ Validate ก่อนว่าจะมีขั้นตอนอะไร ต้องใส่อะไรตรงไหนบ้าง แน่นอนว่าสิ่งที่เราจะใช้ก็ไม่พ้น… ใช่ครับ Annotation
โอเคเรามาดูกันว่ามี Annotation อะไรให้ใช้บ้างได้จากนี่เลย สามารถเข้าไปอ่านได้ว่ามีตัวไหนทำอะไรได้บ้าง
ทีนี้มาถึงขั้นตอนแรกของเราคือ
1. เลือกตัวที่เหมาะสำหรับเราและใส่ annotation เข้าไป
- @Positive ใช้กับ amount ที่ห้ามมีค่าติดลบ
- @NotBlank สำหรับ Name ที่ห้ามเป็นค่า String ว่างๆ หรือ null
พอเราเลือกได้แล้วเราก็เอาไปใส่โลดดดดด ก็จะได้ Entity เราหน้าตาแบบนี้
2. ใส่ @Valid ที่ RestController
ก็ตรงตัวแบบนั้นเลยครับ ใส่ @Valid เข้าไปโลดเพื่อบอกว่าเราจะ Validate ตัวแปรตัวไหน ตามนี้
เสร็จเรียบร้อยก็เริ่มเทสได้ว่าใช้งานได้จริงหรือเปล่า
3. ทดสอบว่า amount ห้ามเป็นค่าลบ หรือ ศูนย์จริงไหม
เราจะลองสร้างเครื่องสำอางขึ้นมาอันนึงดู โดยใส่ amount เป็น -1
ผลลัพธ์ที่ได้คือ Error ด้านล่างนั่นเอง รอดไปหนึ่ง
4. ทดสอบว่า name ห้ามเป็น String ว่างๆ หรือ null จริงไหม
อ่ะ ลองแบบไม่ใส่ name ไปเลยละกัน
ผลลัพธ์ที่ได้คือ Error ด้านล่าง
ทีนี้ใส่ name เป็น String ว่างๆซักหน่อย แบบจำชื่อเครื่องสำอางไม่ได้อ่าาา จะมาใส่ทีหลัง
ผลลัพธ์ก็ Error อย่างที่เห็น อดเลย
สรุป
สำหรับการทำ Validation ก็จะมีขั้นตอนง่ายๆเพียงแค่นี้ แต่บางคนอาจจะสงสัยพอเข้าไปดูแล้ว ปรากฎว่า annotation ที่มีให้ใช้เนี่ย มันน้อยนิ้ดเหลือเกินแล้วถ้าไม่มีที่เราอยากจะใช้จะทำยังไงล่ะ
วิธีการก็คือ การทำ Custom Validation Annotation ขึ้นมานั่นเองงงงง ซึ่งจะพูดใน Episode ถัดไปถ้ามีโอกาสนะคร้าบบบ
อีกเรื่องคืออาจจะสงสัยว่า Error มันต้องยาวๆแบบนี้เท่านั้นหรอ จริงๆก็มีวิธี Customize ตัว Response เวลามัน Error อีกนั่นแหล่ะ แต่ก็เป็นโอกาสหน้าอีกแหล่ะ อิอิ
วันนี้ลาไปเท่านี้ก่อนละกันครับ บัยยย