2013-12-16 159 views
0

我想設計一個談論公交車站的REST API。資源之間的REST 1:1關係

例如現在

GET /stations/1asca2dac34 
    { 
     name: 'Queen str.' 
     lat: 50.45 
     lon: 9.63 
    } 

我的目標是代表距離站之間。例如,站點AAA和BBB之間的距離是5km。我不是關於REST設計的專家。設計這種1:1關係的最佳方法是什麼?

我可以考慮以下解決方案,但我不確定它們是否適合REST風格。

的你的例子1)

GET /distances/?station1=AAA&station2=BBB 
{ 
    uid: 123 
    station1=AAA 
    station2=BBB 
    km: 5 
} 

2)

GET /distances/AAA/BBB 
{ 
    uid: 123 
    station1=AAA 
    station2=BBB 
    km: 5 
} 

3)

GET /distances/123 
{ 
    uid: 123 
    station1=AAA 
    station2=BBB 
    km: 5 
} 

回答

3

我就可以使用像這樣的東西:

/stations/1asca2dac34/distance?from=432dscas 

客戶端出發點可能是/站在那裏他將得到所有的站(姓名,身份證,地理位置,那種運輸像總線列表,火車等),這是你的API所知道的。

從那裏,通過使用HATEOAS您可以提供客戶端鏈接到所有的潛在資源,例如:

/stations/{id}/distance?from={id} 

也許還有一些其他站相關的東西:

/stations/{id}/trains/timetable 
/stations/{id}/trains/{train_id}/timetable 
/stations/{id}/foobar 

如果您從/距離出發是一種奇怪的,因爲我不能「猜測」它會返回什麼樣的列表。讓我先說,沒有任何選擇是錯誤的,但底線是讓你的客戶消費者明智/「可猜測」。

同意Joshua Moore所說的問題。 「距離」資源是否對您的消費者有意義,或者是否可以從一個起點(例如電臺)將所有內容分散出來,因爲這就是您的API所有/僅關心的內容?

+0

超好用的超媒體 - 很好看。來自/ stations/AAA的初始響應可以以/ stations/AAA/distance?from = {id}的形式返回URL模板,這將使客戶端能夠在運行時發現URL。然後應該用鏈接關係標記該URL模板,以便客戶端可以通過link-rel-id查找模板。請參閱HAL的實例,瞭解包含鏈接的媒體類型(http://stateless.co/hal_specification.html)。 –

1

所有實際上REST風格的URI。這是一個意見和適用性的問題。考慮你的目標受衆。 #1由於您正在爲查詢提供參數,因此具有很大意義。對於API的使用者來說#2似乎很難理解,#3更加抽象,並假設你的API使用者知道數據的用途。

你應該問「這些最適合我的消費者需求?

只是我謙卑的意見。

1

我建議你在站上的出發點是/stations/{id},從那裏你可以暴露鏈接/stations/{id}/distances。這第二個URI將列出從這個電臺到所有其他電臺的距離,您想如何呈現該數據取決於您。最終的URI將採用/stations/{id-a}/distances/{id-b}的形式,可以返回一個非常簡單的數字。作爲一般規則,如果可以的話,我會避免使用查詢字符串。

0

另一個沒有查詢的RESTful可能性是使用URI分隔符。

GET /站/ {ST_A; ST_B}

有了這個設計您的URI是簡單,清洗容易。分號意味着可互換的ID(Richardson第一本書)。

返回的JSON是一個簡單的值。 距離是I資源,因爲它是來自計算的值。