假設我想要設計一個REST api來討論歌曲,專輯和藝術家(實際上我是這樣做的,就像1312414之前的人一樣)。RESTful處理資源之間雙向關係的方式
歌曲資源總是與它所屬的專輯相關聯。相反,專輯資源與其包含的所有歌曲相關聯。這些關聯通過鏈接在資源表示中表達。
因此,陳述會是這個樣子:
{
song: 'xyz',
links: [
{ rel: 'album', url: '.../albums/abc' }
]
}
{
album: 'abc',
links: [
{ rel: 'song', url: '.../songs/xyz' },
{ rel: 'song', url: '...' },
{ rel: 'song', url: '...' },
{ rel: 'song', url: '...' }
]
}
考慮,我想這是成立的(也許問題就出在「給定」),怎麼那麼我設計我的API ,使得專輯或歌曲資源的創建對先前存在的歌曲或專輯資源沒有副作用?
這是某種雞/雞蛋的問題。如果我首先創建歌曲資源(POST/songs /),然後創建專輯資源(POST/albums /),歌曲資源將作爲專輯創建的一部分進行修改(根據REST原則,這是不好的),因爲關聯兩個資源之間的服務器正在更新。同樣,對於我首先創作專輯的場景,其次是歌曲。
我想我可以通過避免服務器上的副作用並將管理雙向關係的負擔傳遞給客戶端來避免整個問題。
此外,我不希望專輯和歌曲作爲一個整體自動創建。
我現在唯一能想到的就是在API的語義中包含前面提到的副作用,通過使用一個表示來響應資源創建,該表示包含已修改爲請求的結果。這使副作用明確,但仍然不安寧。
創建一首歌曲,如果它有一個專輯字段,並且該專輯不存在,請創建該專輯。創建一個專輯,如果它有一首不存在的歌曲,請創建歌曲。 – zzzzBov 2012-02-07 21:00:32
查看它的一種方式是每個專輯,歌曲是一個封裝資源,鏈接只是將它們相互連接起來的圖形。更改鏈接會改變資源之間的關係,但資源實際上並未改變。 – abraham 2012-02-07 21:09:02
「歌曲資源被修改爲專輯創建的一部分(根據REST原則,這是不好的)」這個原則是什麼?你能提供一個鏈接嗎?根據我的經驗,更新資源一直對其他資源有副作用。 – 2012-02-07 22:43:31