Trước khi bạn đọc câu trả lời của tôi, tôi muốn nói rằng tôi đã đồng ý với @Neil. Chúng tôi phải chọn các trận chiến của chúng tôi. Chúng tôi thường muốn làm hết sức mình, nhưng đôi khi có quá ít chỗ để thảo luận và chúng tôi phải đưa ra quyết định trái với ý muốn của chúng tôi.
Dù sao, trong câu trả lời của Neil, tôi bỏ lỡ một điều nữa. Tài liệu . Chỉ để đảm bảo rằng các nhà phát triển biết rằng các yêu cầu POST /search
được an toàn.
Mà nói.
1. Cho một cơ hội để NHẬN
Hãy xem xét GET
lựa chọn đầu tiên. Kiểm tra độ dài tối đa của URL câu hỏi này . Đánh giá xem chuỗi truy vấn dài nhất của bạn có dài hơn 2000 ký tự hay không. Nếu không, và bạn không mong đợi nó xảy ra, hãy đi cùng GET
. Nó có vẻ xấu, nhưng ít nhất bạn có thể đánh dấu URL và tất nhiên, nó có tất cả các lợi thế xuất phát từ ngữ nghĩa của phương thức (idempotence, an toàn và bộ nhớ đệm)
1.1 Thử mã hóa chuỗi truy vấn
Ví dụ: trong cơ sở 64. Ngay cả javascript cũng hỗ trợ mã hóa cơ sở 64 .
Đây là cách nó hoạt động:
- Xây dựng JSON với tất cả các bộ lọc và chuẩn hóa nó.
- Phân tích nó thành chuỗi
- Mã hóa nó
- Gửi JSON được mã hóa theo yêu cầu param (
/search?q=SGVsbG8gV29ybGQh....
).
- Về phía máy chủ, giải mã param q .
- Giải nén chuỗi JSON
Trước đây, tạo chuỗi JSON dài nhất có thể, mã hóa nó và lấy độ dài. Đánh giá nếu chuỗi được mã hóa phù hợp với URL. Tôi đã triển khai đoạn mã sau trên Fiddle.js để bạn kiểm tra. (Tôi hy vọng nó vẫn hoạt động) 1
Mã hóa cơ sở 64 có tính xác định và có thể đảo ngược, do đó không có cơ hội va chạm.
Với các truy vấn được mã hóa, chúng tôi cũng có thể lưu các tìm kiếm trong DB, đánh dấu URL, chia sẻ liên kết, v.v. Và tất nhiên, chúng tôi không phải thoát / hủy bỏ chuỗi.
1.2 Thử với bí danh
Đọc blog này về cách thiết kế API REST, tôi nhớ thêm một lựa chọn khác. Bí danh cho các truy vấn phổ biến .
Tôi thấy những điều này là thú vị cho những lý do tiếp theo
Rút ngắn độ dài chuỗi truy vấn. Nó làm cho API sạch hơn và thân thiện với người dùng
NHẬN / vé /? Status = đã đóng & đã đóngAt = xxx so với
GET / vé / gần đây đã đóng /
Kết hợp với nhiều bí danh hoặc nhiều tham số yêu cầu hơn.
NHẬN / vé /? Status = đã đóng & đã đóngAt = xxx & trong vòng = 30 phút so với
NHẬN / vé / gần đây đã đóng /? Trong vòng = 30 phút
Chúng ta có thể kết hợp bí danh với các chuỗi truy vấn được mã hóa
NHẬN / vé /? Status = đã đóng & đã đóngAt = xxx & trong vòng 30 phút so với
NHẬN / vé / đã đóng gần đây /? Q = SGVsbG8g ...
1: Tôi đã sử dụng JSON, nhưng chúng tôi có thể sử dụng các định dạng khác ngay khi chúng tôi có thể giải tuần tự hóa nó ở phía máy chủ.
search?q=t
,search?q=te
,search?q=test
, và vân vân. Xem xét việc giới hạn tần suất truy vấn được gửi để tránh làm tổn thương máy chủ của bạn. Bạn cũng có thể trả lại rất nhiều thông tin và về phía khách hàng thực hiện lọc. Điều đó hoạt động tốt nếu người dùng nhập các danh mục rộng có thể thu hẹp mọi thứ rất nhiều.