- เสนอ
QUERY ซึ่งเป็นเมธอด HTTP ใหม่
- เมธอดคำขอที่สามารถส่งคอนเทนต์พร้อมกับรีเควสต์ได้ และมีคุณสมบัติ safe กับ idempotent
- ใช้วิธีนี้ได้เมื่อข้อมูลที่ส่งในรีเควสต์มีขนาดใหญ่เกินกว่าจะเข้ารหัสเป็น URI ได้
- หากพารามิเตอร์ของคิวรีมีขนาดตั้งแต่หลาย KB ขึ้นไป หลายอิมพลีเมนเทชันจะกำหนดข้อจำกัดไว้
- หลายครั้งไม่สามารถรู้ข้อจำกัดนี้ล่วงหน้าก่อนส่งรีเควสต์ได้ และยังไม่มีประสิทธิภาพเพราะต้องเข้ารหัส
- ดังนั้นหลายอิมพลีเมนเทชันจึงใช้
POST แทน GET เพื่อทำคิวรี
- แต่หากไม่มีความรู้เฉพาะเกี่ยวกับเซิร์ฟเวอร์ ก็จะไม่รู้ว่าปลอดภัยและเป็น idempotent หรือไม่ จึงยังมีข้อจำกัดพื้นฐานเช่นเดียวกับ
GET
- เมธอด
QUERY มอบโซลูชันเพื่อเชื่อมช่องว่างระหว่างการใช้ GET และ POST
- เช่นเดียวกับ
POST อินพุตสำหรับงานคิวรีจะถูกส่งอยู่ในคอนเทนต์ของรีเควสต์ แทนที่จะเป็นส่วนหนึ่งของ URI ของรีเควสต์
- แต่ต่างจาก
POST เมธอดนี้ถูกกำหนดไว้อย่างชัดเจนว่า safe และ idempotent จึงรองรับความสามารถอย่างการแคชและการลองใหม่อัตโนมัติได้
Request
QUERY /contacts HTTP/1.1
Host: example.org
Content-Type: example/query
Accept: text/csv
select surname, givenname, email limit 10
Response
HTTP/1.1 200 OK
Content-Type: text/csv
Content-Location: /contacts/responses/42
Location: /contacts/queries/17
surname, givenname, email
Smith, John, john.smith@example.org
Jones, Sally, sally.jones@example.com
Dubois, Camille, camille.dubois@example.net
7 ความคิดเห็น
ผมไม่เข้าใจว่าทำไมถึงต้องเพิ่มสิ่งนี้เข้าไปในโปรโตคอล
มีสถานการณ์ที่พารามิเตอร์ของคิวรีมีขนาดเกินหลาย KB บ่อยขนาดนั้นเลยเหรอ?
https://www.baeldung.com/cs/http-get-with-body
ดูเหมือนว่าสเปก HTTP เปิดช่องให้ผู้อ่านตีความกันเองและมีการเปลี่ยนแปลงอย่างไม่สม่ำเสมอ จนถึงขั้นเหมือนกำลังจะสร้างเมธอดใหม่ขึ้นมาเลย
GET พร้อม request body
ไลบรารีฝั่ง client บางตัวไม่มีวิธีส่ง request body มากับการร้องขอแบบ GET เลย ดังนั้นมันก็ดูเหมือนจะเป็นทางเลือกทดแทนได้ครับ
ถ้ามองจากมุมของตัวไลบรารีที่นำไปใช้งาน ผมกลับรู้สึกว่านี่เป็นข้อเสนอให้เปลี่ยนมาตรฐานที่ไม่จำเป็นยิ่งกว่าเดิมหรือเปล่าครับ?
ตามสเปกมาตรฐานแล้ว GET ไม่สามารถมี request body ได้ แต่ไลบรารีกลับส่ง request body ไปเองตามอำเภอใจ...
ถ้าอย่างนั้น แค่ทำเมธอดแบบกำหนดเองไว้ที่ชั้นไลบรารีไปเลยก็ไม่น่าจะมีปัญหาไม่ใช่หรือครับ?
แม้จะปฏิเสธความจำเป็นไปเสียทั้งหมดก็คงยาก แต่เมื่อเทียบกับ PUT, PATCH, DELETE ที่เกิดขึ้นตอนขยับจาก HTTP 1.0 ไปเป็น 1.1 แล้ว ก็รู้สึกว่ามีน้ำหนักในการโน้มน้าวน้อยกว่าครับ.
https://www.rfc-editor.org/rfc/rfc9110.html#name-method-definitions
https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET
https://stackoverflow.com/questions/978061/http-get-with-request-body
https://elastic.co/guide/en/…
ในสเปกมาตรฐาน GET Method ไม่ได้ระบุส่วนของ body ไว้ แต่ก็ไม่เคยบอกว่าห้ามใส่
มีกรณีที่ server framework ไม่ประมวลผล body ใน GET Method ดังนั้น MDN จึงแนะนำว่าไม่ควรใส่ body ใน GET Method
Elasticsearch รองรับ Body ใน GET Method
ผมคิดว่าการที่สเปกต้องถูกเปลี่ยนเพราะการอิมพลีเมนต์ของไลบรารี น่าจะต้องพิจารณาให้รอบคอบมากกว่านี้ไหม