2013-06-23 18 views
5

Mam usługi wideo REST obsługujące serwery wideo w sieci.REST: uzyskiwanie dostępu do członków kolekcji za pomocą wielu identyfikatorów

Każdy serwer wideo można zidentyfikować na kilka sposobów: numerem seryjnym, według nazwy lub numerem maszyny.

Na powrocie zbiór wszystkich serwerach dostępnych w mojej sieci, rzeczy są bardzo proste: Mam zdefiniowane następującą trasę:

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

oraz następujące klasy żądanie:

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

Teraz chciałbym zwrócić określony serwer z mojej kolekcji, identyfikując go numerem seryjnym, nazwą komputera lub numerem maszyny.

Za to, że zostały zdefiniowane następujących trasach:

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

i następujące klasy żądanie:

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

Tak, można uzyskać dostęp do mojej kolekcji serwera poprzez:

GET /servers 

i uzyskaj określony serwer, używając:

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

Czy to właściwy sposób postępowania? Mam wrażenie, że nie jest to bardzo restrykcyjne . Czy powinienem traktować to jako wyszukiwanie w mojej kolekcji, zamiast korzystać z "sztucznych" zasobów ?

Odpowiedz

2

Chciałbym reprezentować usługę w jeden sposób, który jest zawsze unikalny (numer seryjny może być poprawny).

W przypadku kwerendy zrobiłbym coś w rodzaju /servers/?name=[name] lub /server/?id=[id] lub po prostu /servers/[serial] (jeśli chcesz użyć numeru seryjnego bezpośrednio). Gdy żądasz nazwy lub identyfikatora, zmień adres URL żądania na servers/[serial], aby zachować unikatowy adres URL.

1

To dobrze, o ile przekierowujesz (3xx) dwa identyfikatory URI do drugiego, zamiast zwracać tę samą reprezentację (2xx) we wszystkich trzech. W przeciwnym razie będziesz mieć trochę czasu na synchronizowanie kopii w pamięci podręcznej. W twoim przypadku logiczne wydaje się przekierowanie zasobów machinenumbers i machinenames do serwerów/zasobów {id}.

Jeśli cokolwiek, to ogólne wyszukiwanie przy użyciu parametrów k = v, które są sprzeczne z REST. Pamiętaj, że identyfikatory URI identyfikują zasoby, a zapytania są częścią URI: różne zapytania identyfikują różne zasoby. Ponieważ zestaw terminów w typowym stylu querystring jest zwykle duży (w interesie wygody), a terminy mogą pojawiać się w dowolnej kolejności, powoduje to eksplozję potencjalnych zasobów (jeśli nie planujesz polegać na buforowaniu dla wydajność, to masz dużo innych opcji, ale to nie jest REST).

2

Wierzę, że jest to sposób ServiceStack. Po prostu zmień zarówno pole uint, jak i zerowe, więc w implementacji usługi masz pewność, którego parametru użyć.

Powiązane problemy