2013-06-23 55 views
5

我有一個REST服務處理網絡上的視頻服務器。它的名字由它的序列號, ,或通過其機號:REST:通過多個ID訪問集合的成員

每個視頻服務器都可以通過多種方式來確定。

對於我的網絡上返回的所有服務器的可用集合,事情 是非常簡單的:我已經定義了以下路線:

[Route("/servers", "GET")] 

和下面的請求類:

public class ServerCollection : IReturn<List<ServerDto>> 
{ 
    ... 
} 

現在,我想從我的收藏中返回一個特定的服務器,通過它的序列號,機器名或機器號來識別 。

爲了這樣做,我已經定義了以下路線:

[Route("/servers/{SerialNumber}", "GET")] 
[Route("/servers/machinenumbers/{MachineNumber}", "GET")] 
[Route("/servers/machinenames/{MachineName}", "GET")] 

和下面的請求類:

public class Server : IReturn<ServerDto> 
{ 
    public uint SerialNumber { get; set; } 
    public uint MachineNumber { get; set; } 
    public string MachineName { get; set; } 
} 

所以,我可以通過訪問我的服務器集合:

GET /servers 

並使用以下方法獲取特定服務器:

GET /servers/3 
GET /servers/machinenumbers/42 
GET /servers/machinenames/supercalifragilisticexpialidocious 

是不是正確的方式進行?我有這種感覺,這是不是很RESTful 。我是否應該將此視爲我的收藏中的搜索,而不是使用「人造」 資源?

回答

2

我將代表,始終是唯一的(序列號可能是正確的)一種方式的服務。

對於查詢我會做類似/servers/?name=[name]/server/?id=[id]或只是/servers/[serial](如果你想直接使用的序列號)。請求名稱或ID時,應將請求中的網址更改爲servers/[serial],以保持網址的唯一性。

1

這很好,只要你重定向(3XX)兩個URI的對方,而不是在所有三個返回相同的表示(2XX)。否則,你將有一段時間讓副本在緩存中保持同步。在您的情況下,將機器編號和機器名資源重定向到服務器/ {id}資源似乎是合理的。

如果有的話,它是用k = V參數是對立的REST通用搜索。請記住,URI的標識資源和查詢字符串是URI的一部分:不同的查詢字串標識不同的資源。由於表單式查詢字符串中的術語集通常很大(爲了方便起見),並且術語可以以任何順序出現,這會導致潛在資源的大量增加(如果您不打算依靠緩存效率,那麼你有很多其他的選擇,但這不是REST)。

2

我相信這是ServiceStack路。只要使uint字段爲空即可,因此在服務實現中,您確定要查找哪個參數。