Giả sử tôi có hai tài nguyên cấp cao nhất Foo
và Bar
. Bây giờ, Foo
cần được liên kết với một số trong số Bar
. Trong một lớp Java này có thể trông như thế này:Thiết kế REST API: liên kết tài nguyên
public class Foo {
Set<Bar> bars;
}
public class Bar { … }
Tôi muốn hình đại diện XML của Foo
một cái gì đó như thế này:
GET /foos/1
<foo>
…
<atom:link rel="self" href="/foos/1" />
<atom:link rel="bars" href="/foos/1/bars" />
</foo>
Vì vậy, tôi khá nhiều để lộ tất cả Bar
giao đến một Foo
làm tài nguyên lồng nhau. Điều đó có nghĩa là tài nguyên Bar
có vòng đời cá nhân (tổng hợp thay vì thành phần). Tài nguyên được lồng nhau sau đó có thể tiếp xúc với tất cả các liên kết Bar
một cái gì đó như thế này:
GET /foos/1/bars
<bars>
<atom:link rel="bar" href="/foos/1/bars/1" />
<atom:link rel="bar" href="/foos/1/bars/2" />
</bars>
Alteratively tôi có thể inline bộ sưu tập trong <foo>
yếu tố trả trước. Tuy nhiên, tôi vẫn bị mắc kẹt với một số câu hỏi: Mặc dù điều này cho phép tôi xóa độc đáo một số Bar
từ một số Foo
bằng cách kích hoạt yêu cầu DELETE
ví dụ: /foos/1/bars/1
nhưng làm thế nào để gán Bar
cho Foo
sau đó? Giả sử khách hàng sẽ truy cập /bars
nhận:
GET /bars
<bars>
<bar>
…
<atom:link rel="self" href="/bars/4711" />
</bar>
</bars>
và quyết định nó muốn gán /bars/1
-/foo/1/bars
. Tôi đã suy nghĩ về yêu cầu POST
đến /foo/1/bars
nhưng không chắc chắn về những gì thực sự gửi. Phần tử link
trỏ đến tài nguyên Bar
như sau?
POST /foos/1/bars
<atom:link href="/bars/4711" />
Điều này có vẻ khá ổn khi khách hàng vẫn không cần phải tạo URL và chúng tôi vẫn đáp ứng ràng buộc REST. Tuy nhiên, có vẻ hơi lạ với POST
liên kết đến máy chủ. Có một giải pháp tốt hơn cho kịch bản này?
Tôi sẽ không ngần ngại trong việc đăng liên kết để thiết lập mối quan hệ giữa hai tài nguyên. Một số người tin rằng bạn nên truy xuất tài nguyên và sau đó POST để tự mô tả, nhưng tôi không tin rằng nó là cần thiết. –
Đó là những gì tôi cũng cảm thấy nguyên nhân bạn đang tạo ra sự trò chuyện không cần thiết và b) không thực sự cần toàn bộ repesentation ở phía máy chủ để thực sự tạo liên kết. –