GraphQL กับ REST แตกต่างกันอย่างไร
GraphQL และ REST เป็นสองแนวทางที่แตกต่างกันในการออกแบบ API สำหรับการแลกเปลี่ยนข้อมูลผ่านอินเทอร์เน็ต REST จะช่วยให้แอปพลิเคชันไคลเอ็นต์แลกเปลี่ยนข้อมูลกับเซิร์ฟเวอร์ได้โดยใช้คำกริยา HTTP ซึ่งเป็นโปรโตคอลการสื่อสารมาตรฐานของอินเทอร์เน็ต ในทางกลับกัน GraphQL เป็นภาษาการสืบค้น API ที่จะกำหนดวิธีการที่แอปพลิเคชันไคลเอ็นต์ควรร้องขอข้อมูลจากเซิร์ฟเวอร์ระยะไกล คุณสามารถใช้ GraphQL ในการเรียก API ได้โดยไม่ต้องอาศัยแอปพลิเคชันฝั่งเซิร์ฟเวอร์เพื่อกำหนดคำขอ ทั้ง GraphQL และ REST เป็นเทคโนโลยีอันทรงพลังที่อยู่เบื้องหลังแอปพลิเคชันที่ทันสมัยที่สุดของเรา
GraphQL และ REST มีความคล้ายคลึงกันอย่างไร
ทั้ง GraphQL และ REST เป็นรูปแบบสถาปัตยกรรม API ยอดนิยมที่ช่วยให้สามารถแลกเปลี่ยนข้อมูลระหว่างบริการหรือแอปพลิเคชันต่างๆ ได้ในรูปแบบไคลเอ็นต์กับเซิร์ฟเวอร์
API จะอำนวยความสะดวกในการเข้าถึงข้อมูลและการดำเนินการข้อมูลดังนี้
- ลูกค้าส่งคำขอ API ไปยังตำแหน่งข้อมูลเดียวหรือตำแหน่งข้อมูลหลายตำแหน่งบนเซิร์ฟเวอร์
- เซิร์ฟเวอร์จะให้การตอบกลับพร้อมกับข้อมูล สถานะข้อมูล หรือรหัสข้อผิดพลาด
REST และ GraphQL ช่วยให้คุณสามารถสร้าง แก้ไข อัปเดต และลบข้อมูลในแอปพลิเคชัน บริการ หรือโมดูลแบบแยกต่างหากผ่าน API ได้ API ที่พัฒนาด้วย REST เรียกว่า RESTful API หรือ REST API ส่วนที่พัฒนาด้วย GraphQL จะเรียกว่า GraphQL API เฉยๆ
ทีมงานฟรอนต์เอนด์และแบ็คเอนด์จะใช้สถาปัตยกรรม API เหล่านี้เพื่อสร้างแอปพลิเคชันแบบแยกส่วนและเข้าถึงได้ การใช้สถาปัตยกรรม API ช่วยให้ระบบมีความปลอดภัย แยกส่วน และปรับขนาดได้ นอกจากนี้ยังทำให้ระบบมีประสิทธิภาพมากขึ้นและผสานรวมเข้ากับระบบอื่นได้ง่ายขึ้น
ในลำดับต่อไป เราจะพูดถึงความคล้ายคลึงกันด้านอื่นๆ ของ GraphQL และ REST
สถาปัตยกรรม
ทั้ง REST และ GraphQL ใช้หลักการสถาปัตยกรรม API ทั่วไปเหมือนกันหลายประการ ตัวอย่างเช่น หลักการที่ทั้งสองระบบใช่ร่วมกันมีดังนี้
- ทั้งคู่ไร้สถานะ ดังนั้นเซิร์ฟเวอร์จึงจะไม่บันทึกประวัติการตอบกลับระหว่างคำขอ
- ทั้งคู่ใช้โมเดลไคลเอ็นต์กับเซิร์ฟเวอร์ ดังนั้นคำขอจากไคลเอ็นต์เดียวจึงได้รับการตอบกลับจากเซิร์ฟเวอร์เดียว
- ทั้งคู่ใช้ HTTP เนื่องจาก HTTP เป็นโปรโตคอลการสื่อสารพื้นฐาน
การออกแบบตามทรัพยากร
REST และ GraphQL ออกแบบการแลกเปลี่ยนข้อมูลรอบทรัพยากรเหมือนกัน ทรัพยากรหมายถึงข้อมูลหรืออ็อบเจกต์ที่ไคลเอ็นต์สามารถเข้าถึงและจัดการได้ผ่าน API ทรัพยากรแต่ละรายการจะมีตัวระบุเฉพาะ (URI) และชุดของการดำเนินการ (วิธีการของ HTTP) ที่ไคลเอ็นต์สามารถดำเนินการได้
ตัวอย่างเช่น ให้พิจารณา API ของโซเชียลมีเดียที่ผู้ใช้สร้างและจัดการโพสต์ ใน API ที่อิงกับทรัพยากร โพสต์ก็จะเป็นทรัพยากร มีตัวระบุเฉพาะของตัวเอง เช่น /posts/1234 และมีชุดการดำเนินการ เช่น GET เพื่อดึงโพสต์ใน REST หรือ query เพื่อดึงโพสต์ใน GraphQL
Data Exchange
ทั้ง REST และ GraphQL รองรับรูปแบบข้อมูลที่คล้ายคลึงกัน
JSON เป็นรูปแบบการแลกเปลี่ยนข้อมูลยอดนิยมที่ทุกภาษา แพลตฟอร์ม และระบบเข้าใจ เซิร์ฟเวอร์จะส่งคืนข้อมูล JSON ไปยังไคลเอ็นต์ แม้จะมีรูปแบบข้อมูลอื่นให้ใช้งานได้แต่ก็ไม่เป็นที่นิยม เช่น XML และ HTML
ในทำนองเดียวกัน REST และ GraphQL รองรับการแคชทั้งคู่ ดังนั้นไคลเอ็นต์และเซิร์ฟเวอร์จะสามารถแคชข้อมูลที่เข้าถึงบ่อยได้ เพื่อเพิ่มความเร็วในการสื่อสาร
ความเป็นกลางของภาษาและฐานข้อมูล
ทั้ง GraphQL และ REST API ทำงานร่วมกับโครงสร้างฐานข้อมูลและภาษาการเขียนโปรแกรมทั้งฝั่งไคลเอ็นต์และฝั่งเซิร์ฟเวอร์ สิ่งนี้ทำให้พวกเขาทำงานร่วมกันได้อย่างดีกับทุกแอปพลิเคชัน
ขีดจำกัดของ REST ที่ GraphQL ต้องการจะเอาชนะมีอะไรบ้าง
GraphQL เปิดตัวในปี 2012 เพื่อตอบสนองต่อความต้องการด้านความรวดเร็วในแพลตฟอร์มโซเชียลมีเดียที่เกิดขึ้นใหม่ นักพัฒนาซอฟต์แวร์พบว่าสถาปัตยกรรม API ที่มีอยู่ เช่น REST นั้นมีความยาวและมีโครงสร้างมากเกินไปที่จะสร้างฟีดข่าวได้อย่างมีประสิทธิภาพ
ในลำดับต่อไปเราจะพูดถึงความท้าทายที่พวกเขาต้องเผชิญ
การแลกเปลี่ยนข้อมูลที่มีโครงสร้างคงที่
REST API ต้องการคำขอของไคลเอ็นต์ให้ทำตามโครงสร้างคงที่เพื่อรับทรัพยากร โครงสร้างที่แข็งแกร่งนี้ใช้งานง่าย แต่ก็ไม่ใช่วิธีที่มีประสิทธิภาพที่สุดในการแลกเปลี่ยนข้อมูลที่จำเป็นเสมอไป
การดึงข้อมูลมากเกินไปและน้อยเกินไป
REST API จะส่งคืนชุดข้อมูลทั้งหมดเสมอ ตัวอย่างเช่น จากอ็อบเจกต์บุคคลใน REST API คุณจะได้รับชื่อ วันเกิด ที่อยู่ และหมายเลขโทรศัพท์ของบุคคลนั้นๆ คุณจะได้รับข้อมูลทั้งหมดนี้แม้ว่าคุณจะต้องการเพียงหมายเลขโทรศัพท์เท่านั้น
ในทำนองเดียวกัน หากคุณต้องการทราบหมายเลขโทรศัพท์ของบุคคลและการซื้อครั้งล่าสุด คุณจะต้องมีคำขอ REST API หลายรายการ URL /person จะส่งคืนหมายเลขโทรศัพท์ และ URL /purchase จะส่งคืนประวัติการซื้อ
นักพัฒนาโซเชียลมีเดียจะต้องเขียนโค้ดจำนวนมากเพื่อประมวลผลคำขอ API ซึ่งส่งผลต่อประสิทธิภาพและประสบการณ์ของผู้ใช้
GraphQL กลายเป็นโซลูชันที่ใช้การสืบค้น การสืบค้นสามารถส่งคืนข้อมูลที่แน่นอนได้ในคำขอ API และการแลกเปลี่ยนการตอบสนองเพียงรายการเดียว
ความแตกต่างที่สำคัญระหว่าง GraphQL กับ REST
REST API เป็นแนวคิดด้านสถาปัตยกรรมสำหรับการสื่อสารระหว่างแอปพลิเคชัน ในทางกลับกัน GraphQL เป็นข้อมูลจำเพาะ ภาษาการสืบค้น API และชุดเครื่องมือต่างๆ GraphQL จะทำงานผ่านตำแหน่งข้อมูลเดียวโดยใช้ HTTP
นอกจากนี้ การพัฒนา REST ยังมุ่งเน้นไปที่การสร้าง API ใหม่ๆ ในขณะที่ GraphQL จะให้ความสำคัญกับประสิทธิภาพและความยืดหยุ่นของ API
ในลำดับต่อไป เราจะแสดงให้เห็นถึงความแตกต่างกันมากขึ้น
คำขอฝั่งไคลเอ็นต์
คำขอที่ REST ใช้ในการดำเนินงานมีดังต่อไปนี้
- คำกริยา HTTP ที่กำหนดการดำเนินงาน
- URL ที่ระบุทรัพยากรที่จะใช้ดำเนินงานคำกริยา HTTP
- พารามิเตอร์และค่าที่จะแยกวิเคราะห์ หากคุณต้องการสร้างหรือแก้ไขอ็อบเจกต์ภายในทรัพยากรฝั่งเซิร์ฟเวอร์ที่มีอยู่
ตัวอย่างเช่น คุณใช้ GET เพื่อรับข้อมูลแบบอ่านอย่างเดียวจากทรัพยากร และใช้ POST เพื่อเพิ่มรายการทรัพยากรใหม่ หรือใช้ PUT เพื่ออัปเดตทรัพยากร
ในขณะที่คำขอที่ GraphQL ใช้ในการดำเนินงานมีดังต่อไปนี้
- การสืบค้นเพื่อรับข้อมูลแบบอ่านอย่างเดียว
- การเปลี่ยนแปลงเพื่อแก้ไขข้อมูล
- การสมัครสมาชิกเพื่อรับการอัปเดตข้อมูลตามเหตุการณ์หรือการสตรีม
รูปแบบข้อมูลจะอธิบายถึงวิธีที่คุณต้องการให้เซิร์ฟเวอร์ส่งคืนข้อมูล รวมถึงอ็อบเจกต์และฟิลด์ที่ตรงกับสคีมาฝั่งเซิร์ฟเวอร์ ซึ่งคุณยังสามารถป้อนข้อมูลใหม่เข้าไปได้อีกด้วย GraphQL จะส่งทุกคำขอของไคลเอ็นต์เป็นคำขอ HTTP ว่า POST ไว้ภายใน
ข้อมูลส่งกลับไปยังไคลเอ็นต์
ข้อมูลจะถูกส่งกลับไปยังไคลเอ็นต์จากเซิร์ฟเวอร์ในโครงสร้างทั้งหมดของทรัพยากรที่ระบุโดยเซิร์ฟเวอร์ภายใต้สถาปัตยกรรม REST ตัวอย่างต่อไปนี้แสดงถึงข้อมูลที่ส่งคืนใน REST และ GraphQL
ตัวอย่างข้อมูลที่ส่งคืนใน REST
GET /postsจะคืนค่าใน REST ดังต่อไปนี้
[
{
"id": 1,
"title": "First Post",
"content": "This is the content of the first post."
},
{
"id": 2,
"title": "Second Post",
"content": "This is the content of the second post."
},
{
"id": 3,
"title": "Third Post",
"content": "This is the content of the third post."
}
]
ตัวอย่างข้อมูลที่ส่งกลับใน GraphQL
เมื่อคุณใช้ GraphQL ระบบจะส่งคืนเฉพาะข้อมูลที่ระบุในโครงสร้างที่กำหนดโดยไคลเอ็นต์
GET /graphql?query{post(id: 1) {id title content}} จะส่งคืนข้อมูลเฉพาะโพสต์แรกดังนี้
{
"data": {
"posts": [
{
"id": "1",
"title": "First Post",
"content": "This is the content of the first post."
},
]}}
สคีมาฝั่งเซิร์ฟเวอร์
GraphQL ใช้สคีมาฝั่งเซิร์ฟเวอร์เพื่อกำหนดข้อมูลและบริการข้อมูล ซึ่งแตกต่างจาก REST API
สคีมาที่เขียนด้วยภาษาคำจำกัดความของสคีมา GraphQL มีรายละเอียดดังต่อไปนี้
- ประเภทของอ็อบเจกต์และฟิลด์ที่เป็นของอ็อบเจกต์แต่ละรายการ
- ฟังก์ชันตัวแก้ไขฝั่งเซิร์ฟเวอร์ที่กำหนดการดำเนินการสำหรับแต่ละฟิลด์
สคีมากำหนดประเภทอย่างชัดเจนเพื่ออธิบายข้อมูลทั้งหมดที่มีอยู่ในระบบรวมถึงวิธีที่ลูกค้าสามารถเข้าถึงหรือแก้ไขข้อมูลนั้น
ในทางกลับกัน REST API ไม่ต้องการสคีมาฝั่งเซิร์ฟเวอร์ แต่คุณสามารถเลือกกำหนดการออกแบบ API เอกสาร และการพัฒนาไคลเอ็นต์ที่มีประสิทธิภาพได้
การจัดเวอร์ชัน
เนื่องจาก API มีการพัฒนาจึงทำให้โครงสร้างข้อมูลและการดำเนินการอาจเปลี่ยนแปลงได้ สำหรับไคลเอ็นต์ที่ไม่มีความรู้เรื่องการเปลี่ยนแปลงเหล่านี้ อาจทำให้ระบบเสียหายหรือทำให้เกิดข้อผิดพลาดที่ไม่รู้จักได้
REST API มักจะมีการกำหนดเวอร์ชันใน URL เพื่อแก้ปัญหานี้ ตัวอย่างเช่น https://example.com/api/v1/person/12341 อย่างไรก็ตามจะไม่จำเป็นต้องมีการกำหนดเวอร์ชันและอาจนำไปสู่การเกิดข้อผิดพลาดได้
GraphQL ต้องการความเข้ากันได้กับรุ่นที่เก่ากว่าของ API ฟิลด์ที่ถูกลบจึงแสดงข้อความแสดงข้อผิดพลาด หรือฟิลด์ที่มีแท็กที่เลิกใช้แล้วจะแสดงคำเตือนขึ้นมา
การจัดการกับข้อผิดพลาด
GraphQL เป็นสถาปัตยกรรม API แบบมีการระบุประเภท (Strongly Typed) ซึ่งหมายความว่าต้องมีคำอธิบายของข้อมูลโดยละเอียด รวมถึงโครงสร้าง และการดำเนินการกับข้อมูลในสคีมา เนื่องจากมีระดับของรายละเอียดในสคีมา ระบบจึงสามารถระบุข้อผิดพลาดของคำขอและแสดงข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์ได้โดยอัตโนมัติ
REST API จะไม่มีการระบุประเภท (Weakly Typed) และคุณต้องสร้างการจัดการข้อผิดพลาดในโค้ดโดยรอบ ตัวอย่างเช่น หากคำขอ PUT แยกวิเคราะห์ค่าตัวเลขเป็นข้อความแทนที่จะเป็นจำนวนเต็ม ระบบจะไม่ระบุข้อผิดพลาดโดยอัตโนมัติ
เมื่อใดควรเลือกใช้ GraphQL เทียบกับ REST
คุณสามารถใช้ API ของ GraphQL และ REST แทนกันได้ อย่างไรก็ตาม ในบางกรณีการใช้งานอาจจะเหมาะสมกว่าหากเลือกใช้เพียงหนึ่งระบบ
ตัวอย่างเช่น GraphQL น่าจะเป็นทางเลือกที่ดีกว่าหากคุณต้องพิจารณาถึงเรื่องดังต่อไปนี้
- คุณมีแบนด์วิดท์แบบจำกัด และคุณต้องการลดจำนวนคำขอและการตอบกลับลง
- คุณมีแหล่งที่มาของข้อมูลหลายแหล่ง และต้องการรวมไว้ที่ตำแหน่งข้อมูลเพียงตำแหน่งเดียว
- คุณมีคำขอของไคลเอ็นต์ที่แตกต่างกันอย่างมาก และคุณอยากให้มีการตอบสนองที่แตกต่างกันมากๆ
ในทางกลับกัน REST น่าจะเป็นทางเลือกที่ดีกว่าหากคุณต้องพิจารณาถึงเรื่องดังต่อไปนี้
- คุณมีแอปพลิเคชันขนาดเล็กที่มีข้อมูลไม่ซับซ้อนมากนัก
- คุณมีข้อมูลและการดำเนินการที่ไคลเอ็นต์ทั้งหมดใช้เหมือนกัน
- คุณไม่มีข้อกำหนดสำหรับการสืบค้นข้อมูลที่ซับซ้อน
นอกจากนี้ยังสามารถสร้างแอปพลิเคชันเดียวที่มีทั้ง GraphQL API และ REST API สำหรับฟังก์ชันการใช้งานด้านต่างๆ ได้อีกด้วย
วิธีใช้ทั้ง GraphQL และ REST บน API เดียวกัน
คุณสามารถการอัปเกรด RESTful API เป็น GraphQL API ได้โดยไม่ต้องดำเนินการเขียนใหม่ทั้งหมด
โครงร่างของกระบวนการมีดังต่อไปนี้
- ทำความเข้าใจโมเดลข้อมูลของ RESTful API โดยการตรวจสอบรูปร่างของข้อมูลในทรัพยากรของ URL แต่ละรายการ
- เขียนสคีมา GraphQL จากโมเดลข้อมูล
- กำหนดการดำเนินการที่ไคลเอ็นต์จทำกับข้อมูลและรวมเอาไว้ในสคีมา
- สร้างฟังก์ชันตัวแก้ไขในโค้ดฝั่งเซิร์ฟเวอร์สำหรับแต่ละฟิลด์ในสคีมา
- สร้างเซิร์ฟเวอร์ GraphQL โดยใช้ตัวแก้ไขและสคีมา
หลังจากนี้ไคลเอ็นต์ก็จะสามารถสื่อสารกับ API ของคุณได้โดยใช้ GraphQL หรือ REST
สรุปความแตกต่างระหว่าง REST เทียบกับ GraphQL
REST |
GraphQL |
|
คืออะไร |
REST คือชุดของกฎที่กำหนดการแลกเปลี่ยนข้อมูลที่มีโครงสร้างระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ |
GraphQL เป็นภาษาการสืบค้น รูปแบบสถาปัตยกรรม และชุดเครื่องมือสำหรับสร้างและจัดการ API |
เหมาะที่สุดสำหรับ |
REST เหมาะสำหรับแหล่งที่มาของข้อมูลที่ไม่ซับซ้อนที่มีการกำหนดทรัพยากรไว้อย่างดี |
GraphQL เหมาะสำหรับแหล่งที่มาของข้อมูลขนาดใหญ่ ซับซ้อน และสัมพันธ์กัน |
การเข้าถึงข้อมูล |
REST มีตำแหน่งข้อมูลหลายจุดในรูปแบบของ URL ในการกำหนดทรัพยากร |
GraphQL มีตำแหน่งข้อมูลเพียง URL เดียว |
ข้อมูลที่ส่งคืน |
REST จะส่งคืนข้อมูลในโครงสร้างแบบคงที่ที่กำหนดโดยเซิร์ฟเวอร์ |
GraphQL จะส่งคืนข้อมูลในโครงสร้างที่มีความยืดหยุ่นที่กำหนดโดยไคลเอ็นต์ |
วิธีการจัดโครงสร้างและนิยามข้อมูล |
ข้อมูล REST จะไม่มีการระบุประเภท (Weakly Typed) ดังนั้นไคลเอ็นต์จึงต้องตัดสินใจว่าจะตีความข้อมูลที่จัดรูปแบบอย่างไรเมื่อมันถูกส่งกลับ |
ข้อมูล GraphQL จะมีการระบุประเภท (Strongly Typed) ดังนั้นไคลเอ็นต์จึงได้รับข้อมูลในรูปแบบที่กำหนดไว้ล่วงหน้าและเป็นที่เข้าใจร่วมกัน |
การตรวจสอบข้อผิดพลาด |
สำหรับ REST ไคลเอ็นต์จะต้องตรวจสอบว่าข้อมูลที่ส่งคืนนั้นถูกต้องหรือไม่ |
สำหรับ GraphQL คำขอที่ไม่ถูกต้องมักถูกปฏิเสธโดยโครงสร้างสคีมา ซึ่งส่งผลให้มีข้อความแสดงข้อผิดพลาดที่สร้างขึ้นโดยอัตโนมัติ |
AWS รองรับข้อกำหนด GraphQL และ REST ของคุณได้อย่างไร
Amazon Web Services (AWS) ช่วยให้คุณสามารถสร้างและให้บริการ API ที่มีการจัดการได้ดียิ่งขึ้น
AWS AppSync จะสร้าง GraphQL แบบไม่ต้องใช้เซิร์ฟเวอร์และ API การรับส่งข้อความแบบ Publish-Subscribe (pub/sub) ซึ่งจะช่วยให้การพัฒนาแอปพลิเคชันนั้นง่ายยิ่งขึ้นผ่านตำแหน่งข้อมูลเพียงตำแหน่งเดียวเพื่อสืบค้น อัปเดต หรือเผยแพร่ข้อมูลอย่างปลอดภัย
ด้วย AWS AppSync คุณจะสามารถสร้าง API ที่อนุญาตให้ไคลเอ็นต์ดำเนินการดังต่อไปนี้ได้
- โต้ตอบกับแหล่งที่มาของข้อมูลหลายแห่ง เช่น SQL, NoSQL, ข้อมูลการสืบค้น, ตำแหน่งข้อมูล REST และไมโครเซอร์วิสด้วยการเรียกใช้ผ่านเครือข่ายเดียว
- ซิงค์ข้อมูลโดยอัตโนมัติระหว่างแอปพลิเคชันมือถือและเว็บรวมถึงระบบคลาวด์
- ถ่ายทอดข้อมูลจากแบ็คเอนด์ไปยังและระหว่างไคลเอ็นต์ที่เชื่อมต่ออยู่
- เข้าถึงข้อมูล Internet of Things (IoT) เพื่อสร้างแดชบอร์ดแบบเรียลไทม์ในแอปพลิเคชันมือถือหรือบนเว็บ
เช่นเดียวกัน เกตเวย์ของ Amazon API ก็เป็นบริการที่มีการจัดการแบบเต็มรูปแบบซึ่งจะช่วยให้คุณสร้าง เผยแพร่ บำรุงรักษา ติดตามตรวจสอบ และรักษาความปลอดภัย API ในระดับต่างๆ ได้อย่างง่ายดาย
วิธีที่คุณจะได้ประโยชน์จากการใช้งานเกตเวย์ API มีดังนี้
- มอบประสิทธิภาพที่มีความเร็วสูงแก่ผู้ใช้ทั้งในด้านของคำขอ API และการตอบสนอง
- อนุญาตการเข้าถึง API ของคุณ
- เรียกใช้ API เดียวกันได้หลายเวอร์ชันพร้อมกันเพื่อทำซ้ำ ทดสอบ และเผยแพร่เวอร์ชันใหม่ได้อย่างรวดเร็ว
- ตรวจสอบตัวชี้วัดประสิทธิภาพและข้อมูลเกี่ยวกับการเรียก API เวลาแฝงของข้อมูล และอัตราข้อผิดพลาด
เริ่มต้นใช้งาน GraphQL และ REST บน AWS โดยสร้างบัญชีได้แล้ววันนี้