2012-02-10 32 views
9

Để gắn bó với các khái niệm REST, chẳng hạn như các hoạt động an toàn, idempotency, vv, làm thế nào có thể thực hiện một hoạt động tìm kiếm phức tạp liên quan đến nhiều tham số?Giao diện tìm kiếm REST và idempotency của GET

Tôi đã thấy triển khai của Google và đó là tính sáng tạo. Một lựa chọn khác là gì?

Yêu cầu idempotent là những gì đang vấp ngã tôi, vì hoạt động chắc chắn sẽ không trả lại kết quả tương tự cho cùng tiêu chí, nói rằng tìm kiếm khách hàng có tên "Smith" sẽ không trả lại cùng một tập hợp mọi lúc, bởi vì "Smith" "khách hàng được thêm vào mọi lúc. Bản năng của tôi là sử dụng GET cho điều này, nhưng đối với một tính năng tìm kiếm thực sự, kết quả sẽ không có vẻ là không đáng kể, và sẽ cần được đánh dấu là không thể lưu vào bộ nhớ cache do tập hợp kết quả chất lỏng của nó.

+0

Chỉnh sửa đẹp trên tiêu đề! –

Trả lời

23

Để đặt nó theo một cách khác, những điều cơ bản đằng sau tính không cần thiết là hoạt động GET không ảnh hưởng đến kết quả hoạt động. Nghĩa là, GET có thể được lặp lại một cách an toàn mà không có tác dụng phụ nào.

Tuy nhiên, yêu cầu không có giá trị không liên quan gì đến việc thể hiện tài nguyên.

Hai ví dụ giả tạo:

GET /current-time 

GET /current-weather/90210 

Như nên được rõ ràng, các nguồn lực này sẽ thay đổi theo thời gian, một số tài nguyên thay đổi nhanh hơn so với những người khác. Nhưng hoạt động GET chính nó không phải là germane trong việc ảnh hưởng đến tài nguyên thực tế.

Contrast để:

GET /next-counter 

Đây là, rõ ràng là tôi hy vọng, không phải là một yêu cầu idempotent. Bản thân yêu cầu đang thay đổi tài nguyên.

Ngoài ra, không có gì có thể nói rằng một hoạt động không có tính chất không có tác dụng phụ. Rõ ràng, nhiều truy cập và yêu cầu nhật ký hệ thống, bao gồm cả GET. Do đó, khi bạn thực hiện GET/resource, các bản ghi sẽ thay đổi do kết quả của GET đó. Đó là loại ảnh hưởng phụ không làm cho GET không phải là idempotent. Tiền đề cơ bản là ảnh hưởng đến chính tài nguyên đó.

Nhưng những gì về, nói:

GET /logs 

Nếu các bản ghi đăng ký mọi yêu cầu và GET đang trở lại các bản ghi trong trạng thái hiện tại của họ, điều đó có nghĩa rằng GET trong trường hợp này là không idempotent? Yup! Thật sự nó có ảnh hưởng sao? Không. Không phải cho trường hợp một cạnh này. Chỉ là bản chất của trò chơi.

gì về:

GET /random-number 

Nếu bạn đang sử dụng một bộ tạo số giả ngẫu nhiên, hầu hết những thức ăn khi bản thân họ. Bắt đầu với một hạt giống và cho kết quả của họ trở lại với chính mình để có được số tiếp theo. Vì vậy, bằng cách sử dụng GET ở đây có thể không phải là idempotent. Nhưng nó là? Làm cách nào để biết số ngẫu nhiên được tạo ra như thế nào. Nó có thể là một nguồn tiếng ồn trắng. Và tại sao bạn quan tâm? Nếu tài nguyên chỉ đơn giản là một số ngẫu nhiên, bạn thực sự không biết liệu hoạt động có thay đổi hay không.

Nhưng chỉ vì có thể có ngoại lệ đối với nguyên tắc, không nhất thiết làm mất hiệu lực các khái niệm đằng sau các nguyên tắc đó.

Thay đổi tài nguyên, đó là một thực tế đơn giản của cuộc sống. Việc thể hiện tài nguyên không phải là phổ quát hoặc nhất quán giữa các yêu cầu hoặc nhất quán giữa người dùng. Theo nghĩa đen, sự biểu diễn của một nguồn tài nguyên là những gì mà GET mang lại, và nó phụ thuộc vào ứng dụng, sử dụng ai biết tiêu chí nào để xác định biểu diễn đó cho mỗi yêu cầu. Các yêu cầu không có giá trị là rất tốt vì chúng hoạt động tốt với phần còn lại của mô hình REST - những thứ như bộ nhớ đệm và thương lượng nội dung.

Hầu hết các tài nguyên không thay đổi nhanh chóng, và dựa vào các giao dịch cụ thể, sử dụng động từ không phải ngẫu nhiên, cung cấp giao diện có thể đoán trước và nhất quán hơn cho khách hàng. Khi một phương thức được cho là không có giá trị, khách hàng sẽ rất ngạc nhiên khi nó không trở thành trường hợp. Nhưng cuối cùng, nó lên đến ứng dụng và giao diện tài liệu của nó.

2

Nó sẽ là idempotent cho cùng một tập dữ liệu. Bạn có thể đạt được điều này với một bộ lọc dấu thời gian.

+0

Điều đó sẽ yêu cầu các bản ghi khổng lồ để tôi có thể tái tạo lại biểu diễn "tại thời điểm đó", đúng không? Db sẽ được cập nhật thông qua PUT, và bất kỳ hàng nào do đó được tìm nạp trong tương lai thông qua GET đó sẽ phải được biểu diễn trong các biểu mẫu trước của chúng. Trong khi hoàn thành idempotency, đó là vô dụng đối với chúng tôi; chúng ta cần truy vấn. Ta còn làm gì khác được nữa? Tôi không thể là người duy nhất có nhu cầu thực hiện tìm kiếm thông qua REST. Đây là nhược điểm duy nhất mà tôi có thể thấy. Ngay cả GET trên một thực thể sẽ không phải lúc nào cũng trả về cùng một biểu diễn, bởi vì các thực thể có thể sửa đổi được. Mọi người triển khai REST như thế nào trên các thực thể năng động? –

+0

Tại sao không có bộ nhớ cache hết hạn? – Chriseyre2000

+0

Tôi thích ý tưởng đó. Vậy, ý chính là gì? Tôi lưu trữ kết quả truy vấn của họ trong một thời gian được xác định trước để phục vụ lại đại diện đó? –

9

GET an toàn và không cần thiết khi được triển khai đúng cách. Điều đó có nghĩa:

  1. Nó sẽ không gây khách hàng có thể nhìn thấy tác dụng phụ ở phía máy chủ
  2. Khi đạo diễn tại cùng một URI, nó gây ra cùng một chức năng server-side được thực hiện mỗi lần, bất kể như thế nào nhiều lần nó được ban hành, hoặc khi

là gì không nói trên là GET với cùng URI luôn trả về cùng một dữ liệu.

TẮT làm cho cùng một chức năng phía máy chủ được thực thi mỗi lần và chức năng đó thường là "trả về đại diện của tài nguyên được yêu cầu". Nếu tài nguyên đó đã thay đổi kể từ lần GET cuối cùng, máy khách sẽ nhận được dữ liệu mới nhất. Hàm mà máy chủ thực hiện là nguồn của idempotency, không phải dữ liệu mà nó sử dụng làm đầu vào (trạng thái của tài nguyên được yêu cầu).

Nếu dấu thời gian được sử dụng trong URI để đảm bảo rằng dữ liệu máy chủ được yêu cầu giống nhau mỗi lần, điều đó chỉ có nghĩa là một cái gì đó đã không tải (chức năng thực hiện GET) sẽ hoạt động trên cùng một dữ liệu, do đó đảm bảo cùng một kết quả mỗi lần.

Các vấn đề liên quan