"Bộ lọc dưới dạng tài nguyên" là nguyên tắc hoàn hảo cho việc này.
Bạn có thể PUT định nghĩa bộ lọc cho tài nguyên bộ lọc và có thể trả về ID bộ lọc.
PUT là idempotent, vì vậy ngay cả khi bộ lọc đã có, bạn chỉ cần phát hiện rằng bạn đã xem bộ lọc trước đó, vì vậy bạn có thể trả lại ID thích hợp cho bộ lọc.
Sau đó, bạn có thể thêm thông số bộ lọc vào các yêu cầu khác của mình và họ có thể lấy bộ lọc để sử dụng cho các truy vấn.
GET/thuốc? Lọc = 1234 & page = 4 & pagesize = 20
tôi sẽ chạy các bộ lọc thô thông qua một số loại quá trình hợp quy, chỉ để có một bộ bình thường, do đó, ví dụ bộ lọc "firstname = Bob lastname = Eubanks" giống với "lastname = Eubanks firstname = Bob". Đó chỉ là tôi.
Mối quan tâm thực sự duy nhất là, khi thời gian trôi qua, bạn có thể cần phải lỗi thời một số bộ lọc. Bạn có thể chỉ đơn giản là lỗi ra yêu cầu nếu ai đó thực hiện một yêu cầu với một bộ lọc bị thiếu hoặc lỗi thời.
Chỉnh sửa câu hỏi trả lời ...
Hãy bắt đầu với các nguyên tắc cơ bản.
Đơn giản, bạn muốn chỉ định bộ lọc để sử dụng trong truy vấn, nhưng những bộ lọc này (có khả năng) có liên quan và phức tạp. Nếu nó là đơn giản/thuốc/1234, điều này sẽ không là một vấn đề.
Có hiệu quả, bạn luôn cần phải gửi bộ lọc cho truy vấn. Câu hỏi đặt ra là cách trình bày bộ lọc đó.
Vấn đề cơ bản với những thứ như phiên trong hệ thống REST là chúng thường được quản lý "ngoài băng". Khi bạn, nói, đi và tạo ra một loại thuốc, bạn PUT hoặc POST để các nguồn tài nguyên thuốc, và bạn nhận được một tài liệu tham khảo trở lại thuốc đó.
Với phiên, bạn sẽ (thường) lấy lại cookie hoặc có thể một số mã thông báo khác đại diện cho phiên đó. Nếu PUT của bạn để các nguồn tài nguyên thuốc tạo ra một phiên cũng có, sau đó, trong sự thật, yêu cầu của bạn tạo ra hai nguồn lực: một loại thuốc, và một phiên.
Thật không may, khi bạn sử dụng một cái gì đó như cookie và bạn yêu cầu cookie đó cho yêu cầu của bạn, tên tài nguyên không còn là biểu diễn thực sự của tài nguyên nữa. Bây giờ là tên tài nguyên (URL) và cookie. Vì vậy, nếu tôi thực hiện GET trên tài nguyên có tên/thuốc/tìm kiếm và cookie biểu thị một phiên và phiên đó xảy ra để có bộ lọc trong đó, bạn có thể thấy hiệu quả, tên tài nguyên đó,/thuốc/tìm kiếm, không thực sự hữu ích chút nào. Tôi không có tất cả thông tin tôi cần để sử dụng hiệu quả, vì tác dụng phụ của cookie và phiên và bộ lọc trong đó.
Bây giờ, bạn có thể viết lại tên:/drugs/search? Session = ABC123, nhúng cookie hiệu quả vào tên tài nguyên.
Nhưng bây giờ bạn đã tham gia vào hợp đồng điển hình của phiên, đáng chú ý là chúng ngắn ngủi. Vì vậy, tài nguyên được đặt tên đó ít hữu ích, lâu dài, không vô ích, chỉ kém hữu ích hơn. Ngay bây giờ, truy vấn này cung cấp cho tôi dữ liệu thú vị. Ngày mai? Chắc là không. Tôi sẽ nhận được một số lỗi khó chịu về phiên làm việc đã biến mất.
Vấn đề khác là các phiên thường không được quản lý dưới dạng tài nguyên.Ví dụ, chúng thường là một tác dụng phụ, được quản lý một cách rõ ràng qua GET/PUT/DELETE. Phiên cũng là "đống rác" của trạng thái ứng dụng web. Trong trường hợp này, chúng tôi chỉ hy vọng rằng phiên họp được điền đúng với những gì cần thiết cho yêu cầu này. Chúng tôi thực sự không thực sự biết. Một lần nữa, đó là một tác dụng phụ.
Bây giờ, hãy biến nó trên đầu một chút. Hãy sử dụng/thuốc/tìm kiếm? Filter = ABC123.
Rõ ràng, tình cờ, điều này trông giống hệt nhau. Chúng tôi chỉ thay đổi tên từ 'phiên' thành 'bộ lọc'. Nhưng, như đã thảo luận, Bộ lọc, trong trường hợp này, là một "tài nguyên lớp học đầu tiên". Chúng cần phải được tạo, quản lý, vv giống như một loại thuốc, một JPEG, hoặc bất kỳ tài nguyên nào khác trong hệ thống của bạn. Đây là điểm khác biệt chính. Chắc chắn, bạn có thể coi "phiên" là tài nguyên lớp học đầu tiên, tạo chúng, đưa nội dung trực tiếp vào chúng, v.v. Nhưng bạn có thể thấy cách, ít nhất từ quan điểm rõ ràng, một phiên "lớp học đầu tiên" không thực sự là một trừu tượng tốt cho trường hợp này. Sử dụng một phiên, nó giống như đi đến các chất tẩy rửa và bàn giao toàn bộ ví hoặc vali của bạn. "Yea, vé ở đó đâu đó, đào ra những gì bạn muốn, cho tôi quần áo của tôi", đặc biệt là so với một cái gì đó rõ ràng như một bộ lọc.
Vì vậy, bạn có thể thấy như thế nào, ở độ cao 30.000 feet, không có nhiều khác biệt trong trường hợp giữa bộ lọc và phiên. Nhưng khi bạn phóng to, chúng khá khác nhau.
Với tài nguyên bộ lọc, bạn có thể chọn làm cho chúng trở thành một điều liên tục mãi mãi và lâu dài. Bạn có thể hết hạn, bạn có thể làm bất cứ điều gì bạn muốn. Phiên có xu hướng có ngữ nghĩa được hình thành trước: thời lượng ngắn, thời lượng kết nối, v.v. Bộ lọc có thể có bất kỳ ngữ nghĩa nào bạn muốn. Chúng hoàn toàn tách biệt với những gì đi kèm với một phiên.
Nếu tôi làm điều này, tôi sẽ làm việc với bộ lọc như thế nào?
Tôi cho rằng tôi thực sự không quan tâm đến nội dung của bộ lọc. Cụ thể, tôi nghi ngờ tôi sẽ truy vấn "tất cả các bộ lọc tìm kiếm theo tên". Tại thời điểm này, nó có vẻ như thông tin không thú vị, vì vậy tôi sẽ không thiết kế xung quanh nó.
Tiếp theo, tôi sẽ bình thường hóa các bộ lọc, như tôi đã đề cập ở trên. Đảm bảo rằng các bộ lọc tương đương thực sự là tương đương. Bạn có thể làm điều này bằng cách sắp xếp các biểu thức, đảm bảo tên trường là tất cả chữ hoa hoặc bất kỳ thứ gì.
Sau đó, tôi sẽ lưu bộ lọc dưới dạng tài liệu XML hoặc JSON, tùy theo điều kiện nào phù hợp hơn cho ứng dụng. Tôi sẽ cung cấp cho mỗi bộ lọc một khóa duy nhất (tự nhiên), nhưng tôi cũng sẽ lưu trữ một băm cho tài liệu thực tế với bộ lọc.
Tôi sẽ thực hiện việc này để có thể nhanh chóng tìm thấy nếu bộ lọc đã được lưu trữ. Vì tôi đang chuẩn hóa nó, tôi "biết" rằng XML (nói) cho các bộ lọc tương đương hợp lý sẽ giống hệt nhau. Vì vậy, khi ai đó đi đến PUT, hoặc chèn một bộ lọc mới, tôi sẽ làm một kiểm tra trên băm để xem nếu nó đã được lưu trữ trước đó. Tôi cũng có thể lấy lại nhiều hơn một (băm có thể va chạm, tất nhiên), vì vậy tôi sẽ cần phải kiểm tra các tải trọng XML thực tế để xem liệu chúng có phù hợp hay không.
Nếu bộ lọc phù hợp, tôi trả lại tham chiếu đến bộ lọc hiện tại. Nếu không, tôi sẽ tạo một cái mới và trả lại cái đó.
Tôi cũng sẽ không cho phép UPDATE/POST lọc. Vì tôi đang đưa ra các tham chiếu đến các bộ lọc này, tôi sẽ làm cho chúng không thay đổi nên các tham chiếu có thể vẫn hợp lệ. Nếu tôi muốn một bộ lọc bằng "vai trò", nói "bộ lọc thuốc hết hạn", thì tôi sẽ tạo một tài nguyên "được đặt tên bộ lọc" liên kết tên với cá thể bộ lọc để dữ liệu bộ lọc thực tế có thể thay đổi nhưng tên vẫn giữ nguyên.
Tâm trí, ngoài ra, trong quá trình tạo, bạn đang ở trong tình trạng đua (hai yêu cầu cố gắng tạo cùng một bộ lọc), vì vậy bạn phải tính đến điều đó. Nếu hệ thống của bạn có khối lượng bộ lọc cao, điều này có thể là một nút cổ chai tiềm ẩn.
Hy vọng điều này sẽ làm rõ vấn đề cho bạn.
Đây là một trong những giải thích tốt nhất mà tôi đã thấy tại sao các phiên không phù hợp với kiến trúc kiểu REST. –
+1: Câu trả lời tuyệt vời, Will! –
giải thích tốt @Will – jayraynet