2013-06-23 1 views
5

네트워크에서 비디오 서버를 처리하는 REST 서비스가 있습니다.REST : 여러 ID를 통해 컬렉션 구성원에 액세스

각 비디오 서버는 일련 번호, 해당 이름 또는 컴퓨터 번호로 등 여러 가지 방법으로 식별 할 수 있습니다.

내 네트워크에서 사용할 수있는 모든 서버의 컬렉션을 반환 들어 가지 꽤 많이 간단하다 :

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

다음과 같은 요청 클래스 :

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

나는 다음과 같은 경로를 정의 이제 컬렉션에서 특정 서버를 반환하고 이라는 일련 번호를 해당 일련 번호, 해당 컴퓨터 이름 또는 해당 컴퓨터 번호로 식별하여 반환하고 싶습니다.

GET /servers 
: 나는 통해 내 서버 모음에 액세스 할 수 있습니다, 그래서

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

:

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

다음과 같은 요청 클래스 : 그렇게 들어

, 나는 다음과 같은 경로를 정의

다음 중 하나를 사용하여 특정 서버를 가져 오십시오.

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

계속 진행하는 것이 맞습니까? 나는 이것이 매우 RESTful이 아니라는 느낌을 가지고 있습니다. "인공" 리소스 대신 내 컬렉션의 검색으로 간주해야합니까?

답변

2

나는 서비스가 항상 유일하다 (일련 번호가 맞을 수도 있음).

질문에 대해서는 /servers/?name=[name] 또는 /server/?id=[id] 또는 /servers/[serial] (직접 일련 번호를 사용하려는 경우)과 같은 작업을 수행합니다. 이름이나 ID를 요청할 때는 요청의 URL을 servers/[serial]으로 변경하여 고유 한 URL을 유지해야합니다.

1

3 개의 URI 모두에서 동일한 표현 (2xx)을 반환하는 대신 URI의 두 개를 다른 URI로 리디렉션하는 것이 좋습니다. 그렇지 않으면 캐시 내에서 사본을 동기화 상태로 유지하는 데 시간이 많이 걸릴 것입니다. 귀하의 경우 machinenumbers 및 machinenames 리소스를 서버/{id} 리소스로 리디렉션하는 것이 논리적 인 것 같습니다.

무엇이든 그것은 REST와 반대되는 k = v 매개 변수를 사용하는 일반적인 검색입니다. URI의 식별 리소스와 쿼리 문자열은 URI의 일부이므로 다른 쿼리 문자열은 다른 리소스를 식별합니다. 양식 스타일 쿼리 링의 용어 집합은 일반적으로 (편의상) 크기가 크고 용어가 순서에 관계없이 나타날 수 있으므로 잠재적 인 자원이 폭발적으로 늘어납니다 (캐싱에 의존하지 않을 경우). 효율성, 그럼 당신은 다른 옵션이 많이 있지만 그것은 휴식이 아니에요).

2

저는 이것이 ServiceStack 방식이라고 생각합니다. uint 필드를 모두 null로 만들면 서비스 구현에서 어떤 매개 변수로 검색할지 확실하게 알 수 있습니다.

관련 문제