Tôi đang trong quá trình tạo API REST và hiện tại, tôi đang gặp phải sự cố sau:
Foo
là tài nguyên đầu tiên. Hoạt động CRUD có thể được áp dụng thông qua/foo/
URI.Bar
là tài nguyên thứ hai. Hoạt động CRUD có thể được áp dụng thông qua/bar/
URI.- Mỗi
Foo
được liên kết với không hoặc mộtBar
. Lý do tại sao tôi không coiBar
là nguồn cung cấp phụFoo
là bởi vì cùng mộtBar
trường hợp có thể được chia sẻ giữaFoo
các môn sinh. Vì vậy, tôi nghĩ rằng tốt hơn là truy cập nó thông qua một URI độc lập thay vì/foo/[id]/bar
.
Vấn đề của tôi là trong một số lượng đáng kể các trường hợp, khách hàng yêu cầu một Foo
ví dụ cũng quan tâm đến Bar
trường hợp liên quan . Hiện tại, điều này có nghĩa là họ phải thực hiện hai truy vấn thay vì một truy vấn. Tôi muốn giới thiệu một cách cho phép nhận cả hai đối tượng với một truy vấn duy nhất, nhưng tôi không biết cách mô hình hóa API để thực hiện điều đó. Những gì tôi đã đưa ra cho đến nay:
- Tôi có thể giới thiệu một tham số truy vấn tương tự như sau :
/foo/[id]?include_bar=true
. Vấn đề với cách tiếp cận này là biểu diễn tài nguyên (ví dụ cấu trúc JSON) của phản hồi sẽ cần trông khác nhau (ví dụ: một thùng chứa{ foo: ..., bar: ... }
thay vì chỉ là một chuỗiFoo
), làm choFoo
điểm cuối tài nguyên trở nên "không đồng nhất". Tôi không nghĩ đó là một điều tốt. Khi truy vấn/foo
, khách hàng phải luôn có cùng biểu diễn tài nguyên (cấu trúc), bất kể tham số truy vấn. - Một ý tưởng khác là giới thiệu một điểm cuối chỉ đọc mới, ví dụ
/fooandbar/[foo-id]
. Trong trường hợp này, không có vấn đề gì khi trả về một đại diện như thế{ foo: ..., bar: ... }
, bởi vì đó chỉ là đại diện "chính thức" củafooandbar
tài nguyên. Tuy nhiên, tôi không biết liệu điểm cuối của người trợ giúp như vậy có thực sự RESTful không (đây là lý do tại sao tôi viết "có thể" trong tiêu đề của câu hỏi. Tất nhiên là về mặt kỹ thuật có thể, nhưng tôi không biết liệu đó có phải là ý hay không).
Bạn nghĩ sao? Có khả năng nào khác không?
Bar
không thể tồn tại mà không được liên kết với a Foo
. Tuy nhiên, như tôi đã viết ở trên, có thể nhiều người Foo
chia sẻ giống nhau Bar
. Có thể tạo ra Foo
mà không có Bar
liên kết, vì vậy tôi không nghĩ Bar
nên được coi là cha mẹ.