2013-10-08 54 views
0

考慮下面的類(注:這些類不會被討論,他們只是存在這種方式)REST-ful api是否應該與您的域模型密切相關?

class Foo {} 

class Bar {} 

class Event { 

    Foo foo; 
    Bar bar; 
    String event; 

    public Event(Foo foo, String event){ 
    .. 
    } 

    public Event(Bar bar, String event){ 
    .. 
    } 
} 

事件是依賴於富或酒吧,但從來沒有到兩個。

你建模你的REST API等(或多或少感覺自然你的API的用戶):

POST /foo/{FOO-ID}/event 
GET /foo/{FOO-ID}/event --> gets the list of events for FOO with the given id 
GET /foo/{ID}/event/{EVENT-ID} 

POST /bar/{BAR-ID}/event 
GET /bar/{BAR-ID}/event --> gets the list of events for BAR with the given id 
GET /bar/{BAR-ID}/event/{EVENT-ID} 

,或者你希望(這或多或少反映域模型):

POST /event 
GET /event?id=123&type=FOO --> gets the list events of for FOO with id = 123 
GET /event?id=456&type=BAR --> gets the list of events for BAR with id = 456 
GET /event/{EVENT-ID} 
GET /event --> not implemented, it would logically return ALL events(both FOO and BAR), but this has no business meaning 

2個api中的哪個是'最''REST-ful?爲什麼?

+3

「大多數」RESTful的問題充滿了分歧和意見,使其成爲StackOverflow問題和答案格式的糟糕候選人。 –

+0

有框架使用這兩種解決方案,也有網站使用這兩種解決方案,所以你更喜歡哪一種?它是由你決定。 –

+0

@TetsujinnoOni事實上,他們都是正確的?其實,這是我的根本問題。 – davidcyp

回答

3

從您的模型,Event是一個實體和資源本身。

第一種方法發送不同的消息:從這個角度來看,Event是一個FooBar一個子資源,這意味着它取決於這些一個存在,並且如果它的「父」不再存在,所以不它。

現在我不認爲你的模型有這樣的關係。如果沒有Foo/Bar,確定Event可能沒有意義,但它確實有意義。明天,Event可能與其他新實體有關,所以Event依賴於它們,Event在開始追蹤它們時應該改變,而不是相反。

最後,查詢參數的使用對於算法資源是常見的,或者作爲集合的「範圍」過濾器,您的第二個場景。

如果FooBar作爲類具有Event類型的屬性,則可以應用第一種方法。

這兩種方法都是「RESTFul」。粗略地說,REST是關於使用HTTP方法的正確方法,並使用唯一的URI來標識獨特的資源。問題在於第二種方法更好地將您的模型(及其關係)描述爲一組資源。

相關問題