13 điểm bởi xguru 2024-09-18 | 7 bình luận | Chia sẻ qua WhatsApp
  • Đề 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

 
regentag 2024-09-19

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?

 
savvykang 2024-09-19

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.

 
nemorize 2024-09-18

GET với phần thân yêu cầu

 
beoks 2024-09-19

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ế.

 
nemorize 2024-09-20

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ì GET khô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, DELETE xuấ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.

 
babadudu 2024-09-23

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/…

  1. 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.

  2. 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.

  3. Elasticsearch hỗ trợ body trong phương thức GET.

 
vwjdalsgkv 2024-09-20

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.