2012-06-04 127 views
2

試想一下,返回JSON數據的電視節目表應用程式,例如zap2it TV listings.REST設計API訪問多個資源

它基本上電視頻道列表以及每個頻道的節目是在當前和以後的API。目前,我有一個API返回所有頻道GET /channels。但是,需要爲該數據中的每個頻道添加當前的節目。我正在考慮添加一個新的API,GET /channels/on_now,以區別於當前的API。 我想清楚這個新的API,我不想爲每個頻道打個別電話,現在的數據需要返回所有頻道。這是一個很好的REST API設計嗎?

當前GET /channels JSON數據

[ 
    "channel": { 
     "channelName": "KRON4", 
    }, 
    "channel": { 
     "channelName": "KTOV5", 
    }, 
    ... 
] 
新的API GET /channels/on_now

預期JSON數據低於

[ 
    { 
    "channel": { 
     "channelName": "KRON4", 
    }, 
    "on_now": { 
     "startTime": "2012-06-04T11:30:00", 
     "endTime": "2012-06-04T12:00:00", 
     "shortDescription": "Latest local, statewide & national news events, along with sports & weather.", 
     "shortTitle": "4:30am Newscast" 
    } 
    }, 
    { 
    "channel": { 
     "channelName": "KTOV5", 
    }, 
    "on_now": { 
     "startTime": "2012-06-04T11:30:00", 
     "endTime": "2012-06-04T12:30:00", 
     "shortDescription": "Local morning news and weather report", 
     "shortTitle": "Morning Newscast" 
    } 
    }, 
    ...next channel... 
] 
+0

嗨鮑勃,我是lloking爲zap2it電視節目單的RESTful API,但互聯網上無法得到任何請你能爲zap2it的REST API提供鏈接電視列表。 –

回答

1
/Channels -----------------------> Get All Channels 
/Channels/bbc ------------------> Get BBC Channel 
/Channels/bbc/Shows -------------> Get All shows in BBC 
/Channels/bbc/Shows/Baseball ----> Get the show called "Baseball", in bbc channel 
/Channels/bbc/Shows/current -----> Get the Current show running, in bbc channel 

假設你不(不會)有一個節目叫Current任何的你的頻道! :)。

+0

好的建議,但這並不完全符合我的需求,請參閱預期JSON數據的更新問題。我需要get-all-channels API中每個頻道的show-on-now信息。 – Bob

1

在追加上述答案:

/Channels/bbc/Shows/time/now -----> Get all the show played on BBC now 
/Channels/bbc/Shows/time/2011-03-27T03:00:00.000+02:00 -----> Get all the show played on BBC on 2011-03-27T03:00:00.000+02:00 . 

這是更具擴展性和你不會擔心名爲當前的任何節目。

編輯: 你可以做這樣的事情的一個很好的領先地位,如果你能在這裏得到一個api-doc的訪問https://developer.sdp.nds.com/page/about

按照我,會有更多的數據需要和API會是這樣的: // EPG?時間= &開始= 0 &上限= 1周&時間=

這將定義一個通用的API來獲取基於基於時間和持續時間tv_listing信息的位置。結果將與在給定時間範圍內出現的頻道列表之間的所有節目分頁。

+0

我不想爲每個頻道打個別電話,請查看更新後的問題。 – Bob

+0

我同意Bart對此的回答,你不應該在渠道路徑中,使用/顯示嗎?過濾器 – biplav

3

我會建議集中內容,而不是網址。

例子:你有一個切入點, '/'。這是API中唯一的網址。 GET IT投資回報ST像

{ 
    "channels" : { 
     "href" : "path.to/channels" 
     }, 
    "programs" : { 
     "href" : "path.to/programs" 
     } 
} 

要檢索的頻道列表,你會得到相應的URL - 你再不需要知道之前 - 而獲得,例如:

[ 
    { 
     "name" : "BBC", 
     "id" : 452, 
     "href" : "path.to/channels/452" 
    }, 
    { 
     "name" : "FOO", 
     "id" : 112, 
     "href" : "path.to/channels/112" 
    } 
] 

有關BBC的相關詳細信息,你上提供的網址:

{ 
    "name" : "BBC", 
    "id" : 452, 
    "self" : "path.to/channels/452", 
    "live_url" : "link.to.bbc.cast", 
    "whatever" : "bar", 
    "current" : "path.to/channels/452/current", 
    "program" : "path.to/channels/452/program" 
} 

等。即時發現網址;你可以隨時修改它們。是什麼讓你的API是內容:你與客戶同意關於什麼是返回(字段,類型,...)。 您最終調用上面的「當前」URL來獲取有關當前程序的信息。

這裏閱讀更多:http://kellabyte.com/2011/09/04/clarifying-rest/

編輯OP-後評論:

你可以引入一個 '嵌入' 參數,以限制請求量:

GET path.to/channels/452?embed=current 

會退貨:

{ 
    "name" : "BBC", 
    "id" : 452, 
    "self" : "path.to/channels/452", 
    "live_url" : "link.to.bbc.cast", 
    "whatever" : "bar", 
    "current" : { 
     "self" : "path.to/channels/452/current", 
     "name" : "Morning Show", 
     "start_time" : "(datetime here)", 
     "end_time" : "(datetime here)", 
     "next"  : "whatever.comes.ne/xt" 
     }, 
    "program" : "path.to/channels/452/program" 
} 
+0

使頂層發現服務是一個好主意,但它仍不能解決我的基本需求,請參閱更新題。 – Bob

+0

我按照以下方式解決了這個問題:我堅持面向實體的事務,並引入了一個'嵌入'參數:GET path.to/channels/452?embed=current將返回上述數據,包括擴展數據'當前'屬性。看我的編輯。 – jmclem

+0

我很欣賞這個建議,但即使是更新後的例子,我仍然需要爲每個頻道分別撥打電話,在您的情況下,英國廣播公司的ID爲452.我不希望這樣,我想要1個電話,返回所有的頻道和對於每個頻道,現在正在進行。 – Bob

2

你問:

這是一個很好的REST API設計?

,它是。

與其他已回答的人相反,您可以自由定義任何您想要的資源,只要它代表一個名詞即可。這包括時間相關的服務,例如「現在電視上有什麼」或者這個卑鄙的例子,「當前天氣在<城市裏」。這些服務資源與代表節目或頻道的更多靜態資源一樣有效。

但是我會改變URI。 /channels看起來像一個集合資源URI。我希望它的孩子成爲渠道,如/channels/kron4(您可以使用任何唯一的字符串,而不是身份證,以識別實例資源)。
因此,/channels/on_now看起來很奇怪。它看起來像一個名爲「on_now」的頻道。雖然沒有什麼能夠阻止你使用它,但它可能會在以後與名爲「On Now」的的頻道發生衝突! 我只是簡單地使用/on_now作爲你的URI。/channels/kron4/on_now對於單個頻道的響應顯然也會有好處。

1

我不是API專家,但我認爲你應該思考你回來的是什麼,而不是放置資源的「看起來有意義」的地方。

解決方案之一是將on_now當作資源。

所以你的API將是:

/channels (all channels) 
/channels/{channel-id} (the {channel-id} channel - could be bbc and can have a collection of shows) 
/channels/{channel-id}/shows (shows of channel-id) 
/channels/{channel-id}/shows?filter=on_now (you are filtering a result, so i guess it's better to use query string, as if you were doing a query) 

那麼你要返回什麼現在的上,這是沒有一個通道的屬性,但其自身的資源。那麼如何實現呢?

/on_now/ (return a collection of on_now objects, which may be anything, channels, shows, whatever) 
/on_now/?channel={channel-id} (this is a filter of the list by channel-id, you are just narrowing the list) 

所以不/channels/{channel-id}/shows?filter=on_now 一樣/on_now/?channel={channel-id}

實際上,

在第一個uri中,您獲取由on_now過濾的節目。 在第二個你正在獲得on_nows(它可以是任何表示,不只是一個節目)按頻道過濾。

爲什麼我認爲on_now應被視爲資源,爲什麼它很重要?

雖然您將此資源分開,但您現在可以對資源有不同的表示形式。你也有更大的靈活性,沒有碰撞。比方說,明天你還想在另一個'節目'中顯示不在任何頻道的節目,這可以很容易地完成,而只需在頻道上進行。 您也可以稍後使用不同的標準過濾on_now,因爲它們是獨立的對象。

你也可以這樣做:

/on_now/{on_now_id} 

,這將使目前顯示細節,比如什麼時候開始,什麼時候會結束,也是一個地方/shows/{show-id}一個位置,這樣你可以在以後它的後達到它現在不再有了。

然而,我認爲最好的解決方案是將節目作爲頻道的無關資源。 但最重要的是,我想你也應該要問自己,如果你想顯示要基本渠道... 的什麼暗示想那是

I don't want to make individual call for each channel, the show-on-now data needs to be returned for all channels

部分。

這使我認爲節目不應該在/channels/的路徑中。

這是因爲如果您只是返回節目,另一種方法將是/shows/?filter=on_now

你可以有:

/shows/?filters=on_now&channel=bbc 

我喜歡把資源作爲「東西」我獨自返回關係本位思想,而不是。圖中的底層對於物業來說非常棒,對收集「其他物品」並不太確定。

按照同樣的例子,我寧願有/channels/{channel-id}/program,而不是/channels/{channel-id}/shows