2014-10-30 62 views
0

假設我們有以下服務器資源:REST API使用GET PARAMS

api.example.com/event/1 

它返回一些任意的資源,說:

{ 
    id: 1, 
    details: { 
     type: 'webinar', 
     .... 
    }, 
    attendees: [ 
     { 
      user_id: 1, 
      first_name: 'Bob' 
      ... 
     }, 
     ... 
    ] 
} 

爲客戶做出的請求可能是有用的只獲取事件的事件細節,而不是與會者列表。

如果客戶端需要這兩種資源,爲資源提供兩個單獨的URL並強制兩個單獨的請求是否更好?

api.example.com/event/{event_id} 
api.example.com/attendees/{event_id} 

或者是更好地提供相同的兩個端點,而是選擇性地具有第一個支持GET參數去切換與會者上市或關閉

api.example.com/event/{event_id}?listAttendees={true|false} 
api.example.com/attendees/{event_id} 

listAttendees參數將不得不該表示返回與會者列表或不。

是否允許GET參數更改從特定URL返回的表示形式?

+0

客戶是否想要一個沒有事件詳細信息的參加者列表? – Centinul 2014-10-31 00:18:13

+0

我會爲兩個不同的URS,因爲它完全符合REST,並且您要求兩種不同的資源,可以通過兩個不同的URI進行標識。 – 2014-10-31 00:20:16

+0

@Centinul您可能想要緩存事件詳細信息和與會者列表。例如,如果事件詳細信息不會改變,但與會者列表可能會改變。 – moesef 2014-10-31 18:27:34

回答

0

我想說在REST中最正確的方法是使用不同的媒體類型或媒體類型參數,但由於大多數人不使用自定義媒體類型,我經常使用我稱之爲縮放協議。這個想法是,你有一個zoomexpand參數,帶有一個數值,它遞歸地包含子實體,減少參數直到它達到零。

所以,像一個請求:

GET api.example.com/event/1 

返回事件資源平原表示,沒有任何嵌入。一個請求,如:

GET api.example.com/event/1?zoom=1 

將包括事件的直接子女,在你的情況下,出席者。以下是:

GET api.example.com/event/1?zoom=2 

將包括事件的直接子女,出席者的直接子女。

要回答你的問題,在REST中,整個URI是一個原子標識符,所以參數是URI的一部分。如果你使用的東西不會以同樣的方式解釋URI,就像老的緩存服務器不會使用查詢字符串緩存URI一樣,這可能是一個問題。