![graphql-00]()
![graphql-00]()
วันนี้ได้พูดคุยเรื่อง
GraphQL กันนิดหน่อย
ซึ่งเป็นความรู้ใหม่ ๆ ที่ได้รับกลับมา
จึงกลับมานั่งสรุปในเรื่องพื้นฐานที่สำคัญประกอบไปด้วย
- GraphQL คืออะไรกันแน่ ?
- ทำไมเราต้องให้ความสนใจด้วยล่ะ ?
- มันจะทำให้ชีวิตนักพัฒนาดีขึ้นอย่างไร ?
มาเริ่มกันเลย
ปล. เริ่มด้วยการไปค้นหาข้อมูล จะเจอ link ที่ต้องอ่านคือ
GraphQL Introduction
GraphQL คืออะไรกันแน่ ?
คือ query language หรือการเข้าถึงข้อมูลจาก API ของระบบ
query ต่าง ๆ จะถูกประมวลผลที่ฝั่ง server
และจะทำการตรวจสอบโครงสร้างของ query กับโครงสร้างข้อมูลที่ได้กำหนดไว้
นั่นหมายความว่า ผู้ให้บริการ API จะต้องทำการกำหนดโครงสร้างของข้อมูลไว้ก่อนเสมอ
ซึ่งเป็นหนึ่งปัญหาหลักของ REST API
ดังนั้น GraphQL จึงเป็นอีกหนึ่งทางเลือกในการสร้าง API ที่ดีกว่า REST
อีกทั้งไม่ได้ผูกติดกับ database และ ที่จัดเก็บข้อมูลใด ๆ ทั้งนั้น
ที่สำคัญมันไม่ใช่ query language สำหรับการดึงข้อมูลจาก database เหมือน SQL นะ
แต่มันเป็นภาษาสำหรับการดึงข้อมูลในระดับ application
ซึ่งสามารถทำงานร่วมกับระบบ backend ใด ๆ ก็ได้ เช่น
- SQL
- RDBMS
- NoSQL
- File system
- Existing system ใด ๆ ก็ได้
![graphql-01]()
โดยรวมแล้ว มันคือ query language ที่มีโครงสร้างชัดเจน (Schema)
คุ้น ๆ กันไหมว่ามันคล้ายอะไร ?
เพื่อความเข้าใจมากยิ่งขึ้น มาสร้าง GraphQL server กันดีกว่า
ซึ่งใน community นั้นมีหลายภาษามาก ๆ
ในบทความนี้จะลองสร้างภาษา JavaScript
โดยตัวอย่าง source code อยู่ที่
Github::Hello GraphQL
สิ่งที่ต้องการสร้างแบบง่าย คือ
สร้าง API สำหรับดึงข้อมูลคะแนนสูงสุด ด้วย query ดังนี้
[code]
query getHighestScore {score}
[/code]
ดังนั้นสิ่งที่เราต้องทำก่อนคือ กำหนด schema ของการ query กันก่อน ประกอบไปด้วย
- ชื่อของ query คือ getHighestScore
- โดย field ที่ต้องการคือ score
สามารถเขียน code ได้ดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="myschema.js"]
จากนั้นทำการ start server และทดสอบ query ข้อมูลผ่าน curl ดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="query01.txt"]
มีคำถามว่า ถ้าเราต้องการอยากรู้ว่า schema มีโครงสร้างอย่างไรบ้าง ? จะดูอย่างไร ?
โดยที่ GraphQL มีคำตอบให้คือ
Introspection
ดังตัวอย่าง
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="query-schema01.txt"]
ตัวอย่างนี้มันดูง่ายไป ดังนั้น ลองมาดูตัวอย่างยาก ๆ ขึ้นมานิดหน่อย
เป็นการดึงข้อมูลผู้ใช้งานทั้งหมดในระบบออกมา
โดยผู้ใช้งานแต่ละคนมีข้อมูลดังต่อไปนี้
[code]
query allUser {
id,
firstname,
lastname,
age
}
[/code]
ผลลัพธ์ที่ต้องการเป็นดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="result_alluser.json"]
ดังนั้นมาเริ่มสร้าง API กันดีกว่า
ขั้นตอนที่ 1 สร้าง UserType ขึ้นมาก่อน เพื่อกำหนดว่าผู้ใช้งานแต่ละคนมีโครงสร้างอย่างไร ดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="usertype.js"]
ขั้นตอนที่ 2 สร้าง query ชื่อว่า allUser ขึ้นมาในส่วนของ query ดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="user_query.js"]
ขั้นตอนที่ 3 ทำการ restart server และทดสอบผ่าน curl ได้ผลดังนี้
ตัวอย่างผู้ใช้งานสามารถเลือก field ที่ต้องการได้อีกด้วย
โดยจะให้แสดงผลข้อมูลเฉพาะ id และ firstname เท่านั้น
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="query_alluser.txt"]
ตัวอย่างที่ผ่านมาคือ API ที่อ่านข้อมูลเพียงอย่างเดียวเท่านั้น
แต่ถ้าเราต้องการแก้ไข เพิ่มเติม และ ลบข้อมูลล่ะ จะทำอย่างไร ?
ซึ่งทาง GraphQL จะเรียกการทำงานเหล่านี้ว่า
Mutations
เช่นต้องการทำ API สำหรับเพิ่มข้อมูลผู้ใช้งานขึ้นมา
จะต้องทำอย่างไร มาดูกัน
[code]
mutation addUser {
id: 4,
first name: “first name 04”,
last name: “last name 04”,
age: 40
}
[/code]
สังเกตุว่าในการสร้าง addUser นั้น
จะต้องทำการกำหนด argument ด้วย
เหมือนกับการประกาศ function/method นั่นเอง
โดยหลังจากที่เพิ่มผู้ใช้งานใหม่ไปแล้ว
จะส่งข้อมูลผู้ใช้งานทั้งหมดกลับมาก
สามารถเขียน code ได้ดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="mutation_adduser.js"]
จากนั้นทำการ run ผ่าน curl ได้ผลลัพธ์ดังนี้
[gist id="b1178a1f94974d3ce6d89e5e251a994d" file="mutation_adduser.txt"]
เพียงเท่านี้ก็สามารถสร้าง GraphQL APIs แบบง่าย ๆ ได้แล้ว
และน่าจะพอทำให้เห็นภาพของ GraphQL มากขึ้นนะครับ
และยังมีรายละเอียดอีกมากมายให้ศึกษายกตัวอย่างเช่น