Tôi đang thiết kế một API và tôi tự hỏi liệu có nên gửi một tải trọng JSON lên một yêu cầu GET không?Tải trọng yêu cầu HTTP
Trong câu hỏi này khác Payloads of HTTP Request Methods, chúng ta có thể tìm theo this link:
- HEAD - ngữ nghĩa cơ thể Không xác định.
- NHẬN - Không xác định ngữ nghĩa cơ thể.
- PUT - Thân máy được hỗ trợ.
- BÀI ĐĂNG - Thân máy được hỗ trợ.
- XÓA - Không xác định ngữ nghĩa cơ thể.
- TRACE - Nội dung không được hỗ trợ.
- TÙY CHỌN - Nội dung được hỗ trợ nhưng không có ngữ nghĩa (có thể trong tương lai).
Điều này có nghĩa là tôi không nên gửi yêu cầu GET có tải trọng không? Có rủi ro không?
- Giống như việc một số thư viện máy khách HTTP không thể gửi tải trọng như vậy?
- Hoặc mã Java API của tôi không được di chuyển trên một số máy chủ ứng dụng nhất định?
- Còn gì nữa không?
tôi phát hiện ra rằng ElasticSearch đã sử dụng một tải trọng như vậy trên một yêu cầu GET:
$ curl -XGET 'http://localhost:9200/twitter/tweet/_search?routing=kimchy' -d '{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query" : "some query string here"
}
},
"filter" : {
"term" : { "user" : "kimchy" }
}
}
}
}
'
Vì vậy, nếu THƯ VIỆN phổ biến này làm nó và không ai phàn nàn, thì có lẽ tôi có thể làm như vậy?
Nhân tiện, Tôi muốn biết liệu điều này có được phép trộn các tham số queryString và tải trọng JSON không? Chính xác như truy vấn ElasticSearch này. Nếu có, có quy tắc nào để chúng ta biết đối số nào là tham số queryString hay thông số tải trọng?
Ở đây chúng ta có thể đọc: Cảm nhận HTTP GET with request body
Roy Fielding về bao gồm một cơ thể với một yêu cầu GET.
Có. Nói cách khác, bất kỳ thông báo yêu cầu HTTP nào cũng được phép chứa nội dung thư và do đó phải phân tích cú pháp thư với ý nghĩ đó. Tuy nhiên, máy chủ ngữ nghĩa cho GET bị hạn chế sao cho nội dung, nếu có, không có ý nghĩa ngữ nghĩa đối với yêu cầu. Các yêu cầu về phân tích cú pháp riêng biệt với các yêu cầu về ngữ nghĩa của phương pháp.
Vì vậy, có, bạn có thể gửi nội dung bằng GET, và không, nó không bao giờ hữu ích để làm như vậy.
Đây là một phần của thiết kế lớp của HTTP/1.1 sẽ trở nên rõ ràng một lần nữa khi thông số được phân đoạn (công việc đang tiến hành).
.... Roy
Sau đó, tôi thực sự không hiểu tại sao nó không bao giờ là hữu ích, vì nó có ý nghĩa trong quan điểm của tôi để gửi truy vấn phức tạp đến máy chủ đó sẽ không phù hợp tốt trên queryParam hoặc matrixParam. Tôi nghĩ rằng các nhà thiết kế ElasticSearch API nghĩ giống nhau ...
Tôi đang lên kế hoạch để thiết kế một API mà có thể được gọi như thế:
curl -XGET 'http://localhost:9000/documents/inbox?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/trash?pageIndex=0&pageSize=10&sort=title'
curl -XGET 'http://localhost:9000/documents/search?pageIndex=0&pageSize=10&sort=title' -d '{
"someSearchFilter1":"filterValue1",
"someSearchFilter2":"filterValue2",
"someSearchFilterList": ["filterValue3","xxx"]
... a lot more ...
}
'
Liệu nó có vẻ tốt đẹp đối với bạn? Dựa trên những cân nhắc ở trên.
một rủi ro sẽ là thư viện khách hàng sẽ không cho phép tải trọng được gửi trong một GE T yêu cầu. Tôi thậm chí không nhận ra bạn có thể làm điều này với curl, trung thực. – bdkosher