2009-02-01 32 views
13

Tôi đang thiết kế một REST api cần phân trang (mỗi x) thi hành từ phía máy chủ.Thiết kế RESTful: Paging Collections

Điều gì sẽ là đúng cách để trang thông qua bất kỳ tập hợp các nguồn lực:

Lựa chọn 1:

GET /resource/page/<pagenr> 
GET /resource/tags/<tag1>,<tag2>/page/<pagenr> 
GET /resource/search/<query>/page/<pagenr> 

Phương án 2:

GET /resource/?page=<pagenr> 
GET /resource/tags/<tag1>,<tag2>?page=<pagenr> 
GET /resource/search/<query>?page=<pagenr> 

Nếu 1, tôi nên làm gì với GET/tài nguyên? Chuyển hướng đến/resource/page/0, trả lời với một số lỗi hoặc trả lời với chính xác giống như/resource/page/0 mà không chuyển hướng?

+0

Cá nhân tôi muốn đi với trang = . Nhưng tôi nghĩ bạn có nhiều câu hỏi cơ bản hơn để trả lời về thiết kế của bạn dựa trên các tùy chọn ở trên. :) –

+0

Bạn có nghĩa là vì tôi phải sử dụng phân trang? –

+0

Có thể xem http://stackoverflow.com/questions/924472/paging-in-a-rest-collection – zehrer

Trả lời

4

Với sự hiểu biết hạn chế của tôi về những gì REST là về, sau đó sau đây có thể là "nhất" yên tĩnh.

GET /resource/?page=<pageenr>&asof=<datetime> 

Vì nội dung của đại diện sẽ không bao giờ thay đổi đột ngột và có thể sử dụng bộ nhớ đệm.

Nhưng để thực sự trả lời câu hỏi của bạn, tôi nghĩ trang tham số là phương thức được ưu tiên.

+1

Không chỉ vậy, nhưng phân trang không phải là một phần của tài nguyên. Cho dù bạn sử dụng phân trang hay không, và ở dạng nào, không thay đổi tài nguyên, chỉ là cách bạn yêu cầu để xem nó. Cũng vậy với thứ tự sắp xếp và thậm chí là lọc. –

+1

@Dave Van den Eynde: Đúng vậy. RFC 3986 (URI Generic Syntax) nói (Phần 3.4): ** "Thành phần truy vấn chứa dữ liệu phi phân cấp ** * cùng với dữ liệu trong thành phần đường dẫn (Phần 3.3), * ** phục vụ để xác định tài nguyên ** * trong phạm vi của lược đồ và quyền đặt tên của URI (nếu có) "* (đánh dấu của tôi). Trang hai là một tài nguyên khác với trang 1. Nhưng trong mọi trường hợp, nó không liên quan đến RESTfulness. – mogsie

+0

Bởi RFC, phần "mảnh" của URI nên được sử dụng để phân trang/phân loại. Nhưng tôi nghiêm túc nghi ngờ rằng RFC này áp dụng ở đây. Bạn đã thử cái này chưa? Tôi không nghĩ rằng các trình duyệt tạo ra một sự khác biệt giữa hai URI, nơi chỉ có các mảnh khác nhau. Có lẽ tôi nên nói một cách khác đi. Nếu trong một api REST, 'tài nguyên' thực sự là những gì được xác định bởi PATH, thì QUERY có thể được sử dụng để hoàn thành tài nguyên với phân trang/phân loại. Nhưng 'tài nguyên' là gì với REST, khác với tài nguyên trong ngữ cảnh của một URI. –

4

Tôi muốn sử dụng tùy chọn (2). Tại sao?

  1. Sau đó bạn có thể thêm tham số kích thước trang vào truy vấn để khách hàng có thể chỉ định kích thước trang.
  2. Trong trường hợp không có thông số trang nào được chỉ định, bạn chỉ có thể trả lại trang đầu tiên (mặc định). Trong nhiều trường hợp, khách hàng của bạn có thể chỉ cần trang đầu tiên, vì vậy nó đơn giản hóa giao thức giữa máy khách và máy chủ.
13

URI trông như thế nào không phải là phần quan trọng nhất. Những gì bạn nên suy nghĩ về thay vào đó là cách nó được trình bày cho người dùng. Ví dụ, một trang có liên kết đến trang "tiếp theo" và một liên kết khác đến trang "trước đó" (nếu có). Hãy xem RFC 5005 Feed Paging and Archiving

+0

Tại sao điều này lại bị bỏ phiếu? Đó là câu trả lời đúng! – mogsie

+0

Liên kết đẹp - Tôi chưa từng thấy RFC trước đó. – ladenedge

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