Persisted Queries
Persisted QueriesPersisted Queries

Persisted Queries

Included in the “Power Extensions” bundle

ใช้ GraphQL queries เพื่อสร้าง endpoint ที่กำหนดไว้ล่วงหน้าแบบ REST และรับประโยชน์จากทั้งสอง API

คำอธิบาย

ด้วย REST คุณสามารถสร้าง endpoint หลายตัว โดยแต่ละตัวจะคืนค่าชุดข้อมูลที่กำหนดไว้ล่วงหน้า

ข้อดีข้อเสีย
✅ ใช้งานง่าย❌ การสร้าง endpoint ทั้งหมดเป็นเรื่องที่น่าเบื่อ
✅ เข้าถึงได้ผ่าน GET หรือ POST❌ โปรเจกต์อาจเกิดปัญหาคอขวดในการรอ endpoint ให้พร้อมใช้งาน
✅ สามารถ cache ได้บนเซิร์ฟเวอร์หรือ CDN❌ การสร้างเอกสารประกอบเป็นสิ่งจำเป็น
✅ ปลอดภัย: เปิดเผยเฉพาะข้อมูลที่ตั้งใจไว้❌ อาจช้า (โดยเฉพาะสำหรับแอปมือถือ) เนื่องจากแอปพลิเคชันอาจต้องส่งคำขอหลายครั้งเพื่อดึงข้อมูลทั้งหมด

ด้วย GraphQL คุณสามารถส่ง query ใดก็ได้ไปยัง endpoint เดียว ซึ่งจะคืนค่าข้อมูลที่ร้องขอมาเท่านั้น

ข้อดีข้อเสีย
✅ ไม่มีการดึงข้อมูลมากหรือน้อยเกินไป❌ เข้าถึงได้เฉพาะผ่าน POST เท่านั้น
✅ สามารถรวดเร็วได้ เนื่องจากดึงข้อมูลทั้งหมดในคำขอเดียว❌ ไม่สามารถ cache บนเซิร์ฟเวอร์หรือ CDN ได้ ทำให้ช้าและมีค่าใช้จ่ายสูงกว่าที่ควรจะเป็น
✅ ช่วยให้ทำซ้ำโปรเจกต์ได้อย่างรวดเร็ว❌ อาจต้องประดิษฐ์สิ่งที่มีอยู่แล้วใหม่ เช่น การอัปโหลดไฟล์หรือการ cache
✅ สามารถสร้างเอกสารประกอบตัวเองได้❌ ต้องจัดการกับความซับซ้อนเพิ่มเติม เช่น ปัญหา N+1
✅ มีตัวแก้ไข query (GraphiQL) ที่ช่วยลดความยุ่งยาก 

Persisted queries รวมสองแนวทางนี้เข้าด้วยกัน:

  • ใช้ GraphQL เพื่อสร้างและประมวลผล queries
  • แต่แทนที่จะเปิดเผย endpoint เดียว มันจะเปิดเผย query ที่กำหนดไว้ล่วงหน้าแต่ละตัวภายใต้ endpoint ของตัวเอง

ดังนั้น เราจะได้ endpoint หลายตัวที่มีข้อมูลที่กำหนดไว้ล่วงหน้าแบบ REST แต่สร้างขึ้นด้วย GraphQL ซึ่งได้รับข้อดีจากแต่ละแนวทางและหลีกเลี่ยงข้อเสีย:

ข้อดีข้อเสีย
✅ เข้าถึงได้ผ่าน GET หรือ POST❌ การสร้าง endpoint ทั้งหมดเป็นเรื่องที่น่าเบื่อ
✅ สามารถ cache ได้บนเซิร์ฟเวอร์หรือ CDN❌ โปรเจกต์อาจเกิดปัญหาคอขวดในการรอ endpoint ให้พร้อมใช้งาน
✅ ปลอดภัย: เปิดเผยเฉพาะข้อมูลที่ตั้งใจไว้❌ การสร้างเอกสารประกอบเป็นสิ่งจำเป็น
✅ ไม่มีการดึงข้อมูลมากหรือน้อยเกินไป❌ อาจช้า (โดยเฉพาะสำหรับแอปมือถือ) เนื่องจากแอปพลิเคชันอาจต้องส่งคำขอหลายครั้งเพื่อดึงข้อมูลทั้งหมด
✅ สามารถรวดเร็วได้ เนื่องจากดึงข้อมูลทั้งหมดในคำขอเดียว❌ เข้าถึงได้เฉพาะผ่าน POST เท่านั้น
✅ ช่วยให้ทำซ้ำโปรเจกต์ได้อย่างรวดเร็ว❌ ไม่สามารถ cache บนเซิร์ฟเวอร์หรือ CDN ได้ ทำให้ช้าและมีค่าใช้จ่ายสูงกว่าที่ควรจะเป็น
✅ สามารถสร้างเอกสารประกอบตัวเองได้❌ อาจต้องประดิษฐ์สิ่งที่มีอยู่แล้วใหม่ เช่น การอัปโหลดไฟล์หรือการ cache
✅ มีตัวแก้ไข query (GraphiQL) ที่ช่วยลดความยุ่งยาก❌ ต้องจัดการกับความซับซ้อนเพิ่มเติม เช่น ปัญหา N+1 👈🏻 ปัญหานี้ได้รับการแก้ไขโดย engine ที่รองรับ

ตัวแก้ไข Persisted query

การรัน Persisted Query

เมื่อ persisted query ได้รับการเผยแพร่แล้ว เราสามารถรันได้ผ่าน permalink ของมัน

persisted query สามารถรันได้โดยตรงในเบราว์เซอร์ เนื่องจากเข้าถึงได้ผ่าน GET และเราจะได้รับข้อมูลที่ร้องขอในรูปแบบ JSON:

การรัน persisted query ในเบราว์เซอร์

การสร้าง Persisted Query

เมื่อคลิกที่ลิงก์ Persisted Queries ในเมนู จะแสดงรายการ persisted queries ทั้งหมดที่สร้างไว้:

Persisted queries พร้อมคำอธิบาย
Persisted queries พร้อมคำอธิบาย

persisted query คือ custom post type (CPT) หากต้องการสร้าง persisted query ใหม่ ให้คลิกที่ปุ่ม "Add New GraphQL persisted query" ซึ่งจะเปิด WordPress editor ขึ้นมา:

การสร้าง Persisted Query ใหม่

อินพุตหลักคือ GraphiQL client ซึ่งมาพร้อม Explorer ตามค่าเริ่มต้น การคลิกที่ฟิลด์บนแผงด้านซ้ายจะเพิ่มฟิลด์นั้นลงใน query และการคลิกปุ่ม "Run" จะรัน query:

GraphiQL Explorer

เมื่อ query พร้อมแล้ว ให้เผยแพร่ และ permalink ของมันจะกลายเป็น endpoint ลิงก์ไปยัง endpoint (และ source) จะแสดงบนแผงด้านข้าง "Persisted Query Endpoint Overview":

Persisted Query Endpoint Overview

การเพิ่ม ?view=source ต่อท้าย permalink จะแสดง persisted query และการตั้งค่าของมัน (ตราบเท่าที่ผู้ใช้ล็อกอินอยู่และ user role มีสิทธิ์เข้าถึง):

Persisted query source

ตามค่าเริ่มต้น path ของ endpoint สำหรับ persisted query คือ /graphql-query/ และค่านี้สามารถกำหนดค่าได้ผ่าน Settings:

การตั้งค่า Persisted query
การตั้งค่า Persisted query

การตั้งค่า Schema

การกำหนดว่า schema ประกอบด้วยองค์ประกอบใดบ้าง และผู้ใช้จะมีสิทธิ์เข้าถึงอย่างไร นั้นถูกกำหนดไว้ใน schema configuration

ดังนั้น เราต้องสร้าง schema configuration และเลือกจาก dropdown:

การเลือก schema configuration

การจัด Persisted Queries ตามหมวดหมู่

บนแผงด้านข้าง "Endpoint categories" เราสามารถเพิ่มหมวดหมู่เพื่อช่วยจัดการ Persisted Query:

หมวดหมู่ endpoint เมื่อแก้ไข Persisted Query

ตัวอย่างเช่น เราสามารถสร้างหมวดหมู่เพื่อจัดการ endpoint ตาม client, แอปพลิเคชัน หรือข้อมูลที่จำเป็นอื่นๆ:

รายการหมวดหมู่ endpoint

ในรายการ Persisted Queries เราสามารถดูหมวดหมู่ของแต่ละรายการได้ และการคลิกที่ลิงก์หมวดหมู่ หรือการใช้ตัวกรองด้านบน จะแสดงเฉพาะรายการในหมวดหมู่นั้น:

รายการ Persisted Queries พร้อมหมวดหมู่

Persisted queries แบบส่วนตัว

การตั้งค่าสถานะของ Persisted Query เป็น private จะทำให้ endpoint เข้าถึงได้เฉพาะผู้ใช้ที่เป็น admin เท่านั้น ซึ่งป้องกันไม่ให้ข้อมูลของเราถูกแบ่งปันโดยไม่ตั้งใจกับผู้ใช้ที่ไม่ควรมีสิทธิ์เข้าถึง

ตัวอย่างเช่น เราสามารถสร้าง Persisted Queries แบบส่วนตัวที่ช่วยจัดการแอปพลิเคชัน เช่น การดึงข้อมูลเพื่อสร้างรายงานด้วย metrics ของเรา

Persisted Query แบบส่วนตัว

Persisted queries ที่ป้องกันด้วยรหัสผ่าน

หากเราสร้าง Persisted Query สำหรับ client เฉพาะรายหนึ่ง เราสามารถกำหนดรหัสผ่านเพื่อให้ระดับความปลอดภัยเพิ่มเติม ทำให้มีเฉพาะ client นั้นเท่านั้นที่สามารถเข้าถึง endpoint ได้

Persisted Query ที่ป้องกันด้วยรหัสผ่าน

เมื่อเข้าถึง persisted query ที่ป้องกันด้วยรหัสผ่านเป็นครั้งแรก เราจะพบหน้าจอที่ขอรหัสผ่าน:

Persisted Query ที่ป้องกันด้วยรหัสผ่าน: การเข้าถึงครั้งแรก

เมื่อป้อนและตรวจสอบรหัสผ่านแล้วเท่านั้น ผู้ใช้จึงจะสามารถเข้าถึง endpoint ที่ต้องการได้

การทำให้ persisted query ไดนามิกผ่านพารามิเตอร์ URL

ค่าสำหรับแต่ละตัวแปรสามารถตั้งค่าได้ผ่านพารามิเตอร์ URL (โดยใช้ชื่อตัวแปร) เมื่อรัน persisted query หากเปิดใช้งานตัวเลือก "Do URL params override variables?" พารามิเตอร์ URL จะมีความสำคัญสูงกว่า หากไม่เปิดใช้งาน ค่าที่กำหนดไว้ใน variables dictionary จะมีความสำคัญสูงกว่า (ถ้ามี)

ตัวอย่างเช่น ใน query นี้ จำนวนผลลัพธ์ถูกควบคุมผ่านตัวแปร $limit โดยมีค่าเริ่มต้นเป็น 3:

การใช้ตัวแปรใน persisted query

เมื่อรัน persisted query นี้ โดยส่ง ?limit=5 จะรัน query ที่คืนค่า 5 ผลลัพธ์แทน:

การแทนที่ค่าตัวแปรใน persisted query