Cấu trúc URL RESTful tốt nhất cho tài nguyên đệ quy là gì?


10

Tôi đang tạo một dịch vụ RESTfull cho cấu trúc tài nguyên giống như cây và đang tự hỏi cấu trúc URL tốt nhất sẽ là gì?

Tôi có ba yêu cầu:

  1. có thể có được một bộ sưu tập các tài nguyên gốc
  2. có thể có được một tài nguyên cá nhân
  3. có thể có được một bộ sưu tập tài nguyên trẻ em

Suy nghĩ hiện tại của tôi là:

/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents

Tôi cũng đã nghĩ đến việc đi các tuyến số ít / số nhiều để biểu thị các danh sách hoặc các thành phần riêng lẻ, nhưng tôi biết rằng tôi sẽ có một tài nguyên giống như số nhiều, vì vậy đã quyết định chống lại điều này.

Có ai có bất kỳ suy nghĩ về những điều trên? hoặc có một cách khác / tốt hơn về cấu trúc này?


Tôi có thể hiểu nhầm câu hỏi nhưng khi chúng ta nói về url thì SEO có phải là vấn đề không?
Jon Hopkins

SEO không phải là một vấn đề, không. Về cơ bản, tôi đang hỏi cấu trúc URL logic tốt nhất cho tài nguyên tự tham chiếu.
Matt Brailsford

Điều đó có vẻ khá thẳng về phía tôi.
Tim Post

Làm thế nào sâu cấu trúc có thể đi?
Martijn Verburg

@Martijn độ sâu không bị giới hạn
Matt Brailsford

Câu trả lời:


11

Điều tôi nghĩ đến là: đừng để API RESTful phản ánh tính đệ quy trong chính URL. Hãy nghĩ về nó, tài nguyên của bạn chỉ là các tài liệu.

Nếu bạn có tài liệu của mình được lưu trữ theo cấu trúc đệ quy, hãy tạo ánh xạ tới một ID duy nhất và sử dụng ID trong URL:

/rest/documents/{id}

Bây giờ, nếu bạn có tài liệu của bạn như thế này:

| Tên tài liệu | Tài liệuPath | Tài liệuID |
--------------------------------------------
| abc | / abc | 1 |
| asd | / abc / asd | 2 |
| asd | / asd | 3 |
| boo | / abc / asd / boo | 4 |
| này | / abc / asd / hey | 5 |

yêu cầu sẽ tham khảo url này cho /abc/asdtài liệu

GET /rest/documents/2

Vì vậy, bây giờ bạn phải cung cấp cho người dùng API phương tiện để vượt qua cấu trúc của bạn với ít nỗ lực. Điều đó có thể được thực hiện bằng cách gói tải trọng phản hồi (tài liệu) của bạn vào một đối tượng, chứa thông tin truyền tải bổ sung, như sau:

{
   data: { /* your document goes here */ },
   parent: {"abc": 1 },
   children: [ { "boo": 4 }, { "hey": 5} ]
}

với điều kiện bạn mong muốn người dùng không tạo quá nhiều tài liệu ở một cấp độ, bạn có thể đưa danh sách trẻ em vào phản hồi. Nếu đó không phải là trường hợp bạn có thể cung cấp cho người dùng để lấy ID tài liệu con như vậy, cho phép ví dụ để phân trang kết quả thông qua các tham số chuỗi truy vấn:

GET /rest/documents/2/children?page=2&size=50

Cuối cùng, nói về các tham số chuỗi truy vấn, bạn cũng có thể cung cấp thông tin đường dẫn trực tiếp thông qua các tham số chuỗi truy vấn:

GET /rest/documents?path=somepath&page=1&size=42

Tất cả các cách tiếp cận được đề cập đều mong đợi rằng đồng bằng GET /rest/documentschỉ trả về các tài liệu gốc.


1
Ý tưởng tốt. Tuy nhiên, mối quan hệ với các tài liệu con không rõ ràng từ API nếu các tài liệu con được đưa vào phản hồi cho một tài liệu. Nếu tài liệu cũng có nguồn phụ khác, ví dụ như nhận xét, bạn thường sẽ truy cập các câu hỏi cho tài liệu bằng cách sử dụng / Documents / {id} / câu hỏi. Để thống nhất và làm cho mối quan hệ với các tài liệu con rõ ràng trong API, tôi sẽ đề xuất rằng các tài liệu con nên được truy cập bởi / Documents / {id} / tài liệu con. Các đại diện được trả về sẽ là Tài liệu giống như / Documents / {id}. Vì vậy, phần còn lại của những gì bạn mô tả ở đây vẫn hoạt động.
Phường Ward

2

Một cái gì đó như thế này có lẽ:

/rest/{rootEntity}/Item/{leafEntity}/{id}
/rest/{entity}/ItemList
/rest/{entity}/ItemList/{leafEntity}

trong đó {rootEntity} là điểm bắt đầu của bộ sưu tập của bạn, {leafEntity} là bất kỳ nút lá có tên nào trong cây của bạn.

Bạn có thể nối thêm một vài tham số bất kỳ ở trên để chọn, nói, Mới nhất hoặc Tất cả hoặc một cái gì đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.