2010-05-12 2 views
6

일부 리소스를 쿼리 매개 변수를 통해 필터링 할 수있는 REST API를 설계하고 있습니다. 경우에 따라 이러한 필터 값은 동일한 REST API의 리소스가됩니다. 이것은 길고 예쁜 읽을 수없는 URI를 만듭니다. URI가 프로그래밍 방식으로 생성되고 조작되어야하기 때문에 이것이 너무 많은 문제는 아니지만 고통스러운 디버깅이 필요합니다. 나는 필터 값으로 사용되는 URI에 대한 바로 가기를 허용하고 이것이 REST 아키텍처에 따라 허용되는지와 모범 사례가 있는지 궁금하다. 예를 들어REST 호출에서 매개 변수 값으로 URI를 사용하는 모범 사례

:

나는 나에게 자바 클래스를 유도 할 수있는 자원을 가지고있다. 그런 다음 요청은 나에게 모든 자바 클래스를 줄 것이다 :

GET http://example.org/api/v1/class 

나는 Collection 자바 클래스의 모든 서브 클래스가, 나는 다음과 같은 요청을 사용하는 것이한다고 가정 :

GET http://example.org/api/v1/class?has-supertype=http://example.org/api/v1/class/collection 

는 그 요청이 나에게 Vector을 반환을 , ArrayListCollection Java 클래스의 다른 모든 서브 클래스.

그 URI는 꽤 길다. has-supertype의 별칭으로 hs을 허용하여 이미 단축 할 수 있습니다. 그러면 다음과 같이 나타납니다.

URI를 짧게 허용하는 또 다른 방법은 URI 접두사의 별칭을 허용하는 것입니다. 예를 들어 URI 접두어 http://example.org/api/v1/class/의 별칭으로 class을 정의 할 수 있습니다. 나에게 다음과 같은 가능성을 줄 것이다 :

GET http://example.org/api/v1/class?hs=class:collection 

또 다른 가능성은 완전히 클래스 별칭을 제거하고이 내가지지 할 수있는 유일한 일이 항상 http://example.org/api/v1/class/로 매개 변수 값을 앞에하는 것입니다.

GET http://example.org/api/v1/class?hs=collection 

원래 요청이 "단순화"는 URI 여전히 REST 아키텍처의 원칙을 준수 함 :이은으로 Collection의 모든 하위 유형에 대한 요청을 켤까요? 아니면 그냥 끝까지 나갔 니?

추가 : URI에 필터가 한 번에 여러 개있을 수 있습니다. 다른 매개 변수 또는 단일 매개 변수의 값 목록입니다. "인터페이스 X 및/또는 인터페이스 Y를 구현하는 모든 클래스"또는 "인터페이스 X를 구현하고 ABC 패키지에있는 모든 클래스"(패키지는 http://example.org/api/v1/packages/a/b/c과 같은 URI도 처리 할 수 ​​있습니다)

+0

는 질문에 부록을 추가했습니다. – dafmetal

답변

3

GET http://example.org/api/v1/class/java.util.Collection/subclasses 

각 직접 하위 클래스에 대해 하나씩 RESTful API의 다른 항목에 대한 링크 목록을 반환하십시오. 기술자의 일부에 의해 반환 나는 또한 그 정보를 사용할 수 있도록 것입니다 : (. 그것도 앞의 특정 쿼리에 대한 링크를 포함 할 것)

GET http://example.org/api/v1/class/java.util.Collection 

+0

+1 : 쿼리 문자열을 피하십시오. –

+0

질문에 대한 부록을 추가했습니다. @ S.Lott 쿼리 문자열을 피하는 추론을 설명해 주시겠습니까? 나는 이것이 REST API에 좋았다고 생각했다. – dafmetal

+0

@dafmetal : 내가 알 수있는 한, RESTful 인터페이스는 도움을 줄 수있는 복잡한 작업을 수행하지 않습니다. 그들이 할 수없는 곳에, 그들은 쿼리를 만족시키는 리소스에 대한 링크 목록을 반환하는 끔찍한'foo? query = bar' 사건으로갑니다. –

관련 문제