Tạo mối quan hệ thực thể trong REST: Tôi có thể tạo cha mẹ bằng cách đăng lên id con không?


9

Chúng tôi hiện đang thiết kế API REST để truy cập dữ liệu khách hàng cổ điển. Một trong những yếu tố trong API là tài sản của người dùng. Các tài sản được thêm vào theo một dịch vụ nhất định. API phụ trợ sẽ chỉ thêm một tài sản cho người dùng theo một dịch vụ nhất định. Vì vậy, không có mối quan hệ Người dùng - Tài sản, mà là mối quan hệ Người dùng - [Dịch vụ] - Tài sản.

URI của chúng tôi sẽ trông như thế này:

/users/{id}/assets/{id}/services/{id}

Sử dụng API sẽ biết id tài sản và id dịch vụ để tạo mục nhập mới. Những gì chúng tôi đang đấu tranh với việc tạo ra mối quan hệ này.

Một cách đơn giản là đăng toàn bộ quan hệ /users/{id}/assets/

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

nhưng sau đó chúng tôi không thực sự tạo ra một tài sản như URI có thể chỉ ra, mà là mối quan hệ dịch vụ tài sản.

Để thay thế, chúng tôi đang xem xét POST cho URI giải quyết mối quan hệ, như thế này:

POST /users/{id}/assets/{id}/service/{id}
{attribute1:"{var}", attribute2:"{var}"}

Nhưng trong trường hợp này, đường dẫn tài nguyên /users/{id}/assets/{id}sẽ không tồn tại trước POST và sẽ được tạo như một hiệu ứng phụ.

POST có phải là một đường dẫn tài nguyên chưa tồn tại được cho phép không?

Cảm ơn những suy nghĩ của bạn,

Gerard.

Câu trả lời:


3

Có vẻ như bạn đang đề xuất rằng, bất cứ khi nào người dùng đăng bài đầu tiên lên một mối quan hệ không tồn tại, bạn sẽ tạo nó như một phần của bài đăng.

Nếu bạn đang hỏi liệu loại mẫu tạo truy cập này có phải là mẫu phát triển hợp lệ, có thể chấp nhận hay không, thì câu trả lời là có - đó là cả mẫu hợp lệ và mẫu khá phổ biến để xem.


1
Cảm ơn câu trả lời. Bất kỳ con trỏ đến một số tài liệu tham khảo mà tôi có thể tham khảo?
maasg

2

Có nhiều điểm ở đây: Thứ nhất: Bạn không nên đặt id khi tạo tài nguyên mới vì id này có thể đã tồn tại hoặc có thể là hệ thống sử dụng kỹ thuật cụ thể để tạo id và bạn buộc nó phải sử dụng tài nguyên của bạn và cho đề xuất rằng id phải được tạo bởi hệ thống, thuộc tính tiêu đề vị trí phải được đặt trong trường hợp tài nguyên tạo, để lấy lại nguồn cấp dữ liệu với id được tạo.

Thứ hai: JSON của bạn không chính xác, bạn phải xử lý dịch vụ như một đối tượng khác bên trong đối tượng nội dung cũng như trong dịch vụ URI tài nguyên "s" mà bạn phải xử lý dưới dạng mảng.

POST /users/{id}/assets    
{asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"}

phải là:

POST /users/{id}/assets    
{services:[{ attribute1:"var", attribute2:"var"}]}

Nếu bạn sẽ sử dụng theo cách này

Thứ ba: Tôi không thích sử dụng cách này để đề xuất thiết kế, nếu trường hợp này thất bại làm sao bạn có thể biết nó bị lỗi trong khi tạo tài sản hoặc dịch vụ,


0

Đây là một dòng suy nghĩ khác nhau:

POST /relationships
{ relationship:${id}, asset:{id}, service:{id}, user:{id}, data:"some data" }

Bằng cách này, bạn đang bảo vệ các mối quan hệ dưới dạng liên kết ba chiều giữa tài sản, dịch vụ và người dùng và không ngụ ý bất kỳ mối quan hệ phân cấp nào

Sau đó, bạn có thể truy xuất một mối quan hệ cụ thể bằng cách:

GET /relationships?id="2144321"

hoặc tìm kiếm một tập hợp con các mối quan hệ bằng cách:

GET /relationships?user="43434"

hoặc là

GET /relationships?asset="12433"

Cách ban đầu không sai, nhưng cách tiếp cận này có thể giúp bạn linh hoạt hơn so với người được sử dụng.

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.