- Đề xuất một phương thức HTTP mới là QUERY
- Phương thức yêu cầu có thể truyền nội dung khi request, đồng thời an toàn và có tính idempotent
- Có thể dùng cách này khi dữ liệu gửi trong request quá lớn để mã hóa vào URI
- Khi tham số truy vấn lớn hơn vài KB, nhiều implementation đặt ra giới hạn
- Thường không thể biết trước giới hạn này trước khi gửi request, và vì phải mã hóa nên cũng kém hiệu quả
- Vì vậy, nhiều implementation dùng POST thay cho GET để thực hiện truy vấn
- Nhưng nếu không có hiểu biết cụ thể về server, sẽ không thể biết liệu nó có an toàn và idempotent hay không, nên vẫn có những hạn chế cơ bản giống GET
- Phương thức QUERY cung cấp một giải pháp thu hẹp khoảng cách giữa việc dùng GET và POST
- Tương tự POST, dữ liệu đầu vào cho thao tác truy vấn được truyền trong nội dung của request thay vì là một phần của URI request
- Tuy nhiên, khác với POST, phương thức này được xác định rõ ràng là an toàn và idempotent, nên có thể hỗ trợ các tính năng như caching và tự động thử lại
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 bình luận
Tôi không hiểu vì sao phải thêm cái này vào giao thức.
Có thật là có nhiều tình huống mà tham số truy vấn vượt quá vài KB đến vậy không?
https://www.baeldung.com/cs/http-get-with-body
Có vẻ như đặc tả HTTP đã để ngỏ quá nhiều chỗ cho người đọc tự diễn giải và thay đổi thiếu nhất quán, đến mức họ đang muốn tạo hẳn một method mới.
GET với phần thân yêu cầu
Một số thư viện client thậm chí không có cách nào để gửi request body khi thực hiện GET, nên có vẻ đây có thể là một phương án thay thế.
Nếu nhìn từ góc độ các bản triển khai thư viện thì chẳng phải đây lại là một đề xuất thay đổi tiêu chuẩn còn ít cần thiết hơn sao?
Theo đặc tả tiêu chuẩn thì
GETkhông thể có request body, vậy mà thư viện lại tự ý gửi request body...Nếu vậy thì chẳng phải chỉ cần triển khai một method tùy chỉnh ngay ở tầng thư viện cũng không có vấn đề gì sao?
Dù khó có thể phủ nhận hoàn toàn nhu cầu của nó, nhưng so với
PUT,PATCH,DELETExuất hiện khi HTTP 1.0 chuyển lên 1.1 thì có vẻ sức thuyết phục kém hơn.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/…
Trong đặc tả tiêu chuẩn, phương thức GET không quy định phần body, chứ không hề nói là không được đưa vào.
Có trường hợp framework phía server không xử lý body trong phương thức GET, nên MDN khuyến nghị không nên đưa body vào phương thức GET.
Elasticsearch hỗ trợ body trong phương thức GET.
Có lẽ việc phải thay đổi đặc tả theo cách triển khai của thư viện cần được cân nhắc nhiều hơn.