ทำความรู้จักกับ GraphQL

แนะนำภาษา GraphQL

GraphQL เป็นภาษาที่ใช้ในการค้นหาและจัดการข้อมูลจากฐานข้อมูลเพื่อการใช้งานกับระบบ API ซึ่งทำหน้าที่คล้ายกับ REST API แต่มีข้อดีคือสามารถกำหนดข้อมูลที่ต้องการใช้โดยประมวลผลคำสั่งที่ฝั่งเซิร์ฟเวอร์ ทำให้การเรียกใช้ข้อมูลไม่มีข้อมูลส่วนเกิน เหมือนกับการใช้ REST API และมี Endpoint เพียงที่เดียว แต่ GraphQL ไม่ได้พัฒนาขึ้นมาเพื่อแทนที่ภาษาสำหรับการเข้าถึงข้อมูลเช่น SQL แต่อย่างใด

GraphQL เป็นไวยากรณ์ที่นักพัฒนาสามารถใช้เพื่อขอข้อมูลที่ต้องการและส่งคืนข้อมูลดังกล่าวจากหลายแหล่ง เมื่อไคลเอนต์กำหนดโครงสร้างของข้อมูลที่ต้องการแล้ว เซิร์ฟเวอร์จะส่งคืนข้อมูลโดยใช้โครงสร้างที่เหมือนกัน

GraphQL ทำงานอย่างไร

GraphQL เป็นรูปแบบสถาปัตยกรรมการพัฒนาสำหรับการสร้าง API โดยใช้ HTTP ภาษา GraphQL ค่อนข้างคล้ายกับ REST และ SOAP ใช้ HTTP POST เพื่อส่งการสืบค้นผ่านเนื้อหาของคำขอ HTTP หรือพารามิเตอร์ในการสืบค้น

ภาษาในการสืบค้นข้อมูล

คำว่า QL ใน GraphQL ย่อมาจาก query language GraphQL ได้จัดเลเยอร์การค้นหาที่เชื่อถือได้สำหรับ API นักพัฒนาสามารถใช้ GraphQL เพื่อสร้าง Request ส่งไปยังเซิร์ฟเวอร์ ภาษาค้นหานี้ช่วยให้นักพัฒนาสามารถค้นหาชุดข้อมูลพื้นฐาน และให้การควบคุมโครงสร้างการตอบสนองของ GraphQL API

GraphQL ช่วยให้สามารถเข้าถึง object และ properties ของ schema ต่างๆ ได้อย่างกว้างขวาง ช่วยให้สามารถนำเสนอทรัพยากรข้อมูลผ่านทางเว็บ API ได้อย่างมีประสิทธิภาพและยืดหยุ่นยิ่งขึ้น

API endpoint

แทนที่จะออกแบบเส้นทาง API แยกต่างหากสำหรับทรัพยากรพื้นฐานแต่ละรายการ GraphQL จะจัดเตรียม URL หนึ่งรายการซึ่งคุณสามารถใช้ค้นหาข้อมูลที่ต้องการได้เช่นเดียวกับไคลเอนต์ API เช่นเดียวกับคำสั่ง SQL GraphQL จะใช้เป็นภาษาสำหรับการสร้าง request พร้อมทั้งกำหนดโครงสร้างของข้อมูลที่ส่งกลับมา

เช่นเดียวกับรูปแบบหรือโปรโตคอล API เว็บอื่น ๆ คุณสามารถส่งคำขอไปยัง GraphQL API ผ่านทาง URL ปลายทางของ API ได้ เช่น https://example.com/graphql

นักพัฒนาสามารถอัปเดตข้อมูลแบบเรียลไทม์ได้โดยใช้ความสามารถของ GraphQL ซึ่งเป็นเฟรมเวิร์คแบบโอเพ่นซอร์สสำหรับกระบวนการอ่าน การแปลงข้อมูล และการตรวจสอบ ภาษา GraphQL ได้รับการพัฒนาเพื่อใช้กับภาษาคอมพิวเตอร์ที่เป็นที่นิยมในการพัฒนาเว็บแอพพลิเคชัน เช่น JavaScript, Python, Ruby, C#, Go และ PHP

ข้อดีของ GraphQL

การดึงข้อมูลมาใช้

เนื่องจาก REST ต้องอาศัย API endpoint หลายจุดและใช้การโต้ตอบแบบ Stateless เนื่องจาก REST ต้องอาศัยจุดสิ้นสุดหลายจุดและการโต้ตอบแบบไร้สถานะ ซึ่งคำขอ API แต่ละรายการจะได้รับการประมวลผลเป็นแบบสอบถามใหม่ โดยไม่ขึ้นกับรายการอื่น ไคลเอนต์จึงได้รับข้อมูลทุกชิ้นที่เชื่อมโยงกับทรัพยากร หากไคลเอนต์ต้องการเพียงชุดย่อยของข้อมูล ไคลเอนต์ก็ยังคงได้รับข้อมูลทั้งหมด (การดึงข้อมูลมากเกินไป) และหากไคลเอนต์ต้องการข้อมูลที่ครอบคลุมทรัพยากรหลายรายการ ระบบ RESTful มักจะทำให้ไคลเอนต์สอบถามทรัพยากรแต่ละรายการแยกกันเพื่อชดเชยการดึงข้อมูลไม่เพียงพอจากคำขอเริ่มต้น ซึ่งก็คือข้อจำกัดของ REST ที่พบได้บ่อยที่สุดประการหนึ่ง ส่งผลให้การออกแบบ API เพื่อให้ผู้ใช้ได้รับข้อมูลที่ต้องการอย่างแท้จริงนั้นเป็นเรื่องยากมาก แต่ GraphQL ใช้ endpoint ของ GraphQL เพียงจุดเดียวเพื่อให้ผู้ใช้ได้รับการตอบสนองข้อมูลที่แม่นยำและครอบคลุมในหนึ่งรอบจากคำขอเดียว ช่วยขจัดปัญหาการดึงข้อมูลมากเกินไปหรือไม่เพียงพอ นั่นก็คือ สามารถเลือกข้อมูลที่จะรับได้ตรงตามความต้องการของผู้ใช้

การประมวลผลข้อมูลแบบ real-time

REST ไม่สนับสนุนการอัปเดตข้อมูลแบบเรียลไทม์ หากแอพพลิเคชันจำเป็นต้องมีฟังก์ชันแบบเรียลไทม์ นักพัฒนาจำเป็นต้องใช้เทคนิคต่างๆ เช่น การโพลแบบยาว (ซึ่งไคลเอนต์จะต้องดึงข้อมูลจากเซิร์ฟเวอร์ซ้ำแล้วซ้ำเล่าเพื่อหาข้อมูลใหม่) และเหตุการณ์ที่เซิร์ฟเวอร์ส่ง ซึ่งอาจเพิ่มความซับซ้อนให้กับแอปพลิเคชันได้

ส่วน GraphQL สนับสนุนการอัปเดตแบบเรียลไทม์ผ่านการสมัครรับข้อมูล การสมัครรับข้อมูลจะรักษาการเชื่อมต่อกับเซิร์ฟเวอร์อย่างสม่ำเสมอ ช่วยให้เซิร์ฟเวอร์สามารถส่งการอัปเดตไปยังไคลเอนต์ได้ทุกครั้งที่มีเหตุการณ์เฉพาะเกิดขึ้น

สกีมาฝั่งเซิร์ฟเวอร์

GraphQL ใช้ระบบที่มีการกำหนดสกีมาฝั่งเซิร์ฟเวอร์เพื่อกำหนดข้อมูลและบริการข้อมูล ใน API จะถูกเขียนขึ้นโดยใช้ GraphQL Schema Definition Language (SDL)

สกีมาที่เขียนด้วย GraphQL มีรายละเอียดดังต่อไปนี้

  • ประเภทของอ็อบเจกต์และฟิลด์ที่เป็นของอ็อบเจกต์แต่ละรายการ
  • ฟังก์ชันตัวแก้ไขฝั่งเซิร์ฟเวอร์ที่กำหนดการดำเนินการสำหรับแต่ละฟิลด์

สกีมาที่เขียนด้วย GraphQL ใช้ออบเจ็กต์ Query ในการกำหนดโครงสร้างในการค้นหาข้อมูล นอกจากนี้แล้ว ยังมีออบเจ็กต์ Mutation ในการกำหนดโครงสร้างของข้อมูลที่จะเปลี่ยนแปลง ซึ่งเทียบได้กับคำสั่ง insert, update, และ delete ของภาษา SQL ในการจัดการกับข้อมูลในฐานข้อมูล

ผู้เขียน

ปวรุตม์ พงศ์พฤฒานนท์
ฝ่ายระบบสารสนเทศ
สำนักคอมพิวเตอร์
pavarudh@g.swu.ac.th