재귀 리소스에 가장 적합한 RESTful URL 구조는 무엇입니까?


10

트리와 같은 리소스 구조를 위해 RESTfull 서비스를 만들고 있는데 최고의 URL 구조가 무엇인지 궁금하십니까?

세 가지 요구 사항이 있습니다.

  1. 루트 리소스 모음을 얻을 수있다
  2. 개별 자원을 얻을 수있다
  3. 아동 자료 모음을 얻을 수있다

내 현재 생각은 :

/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents

또한 목록 또는 개별 요소를 나타 내기 위해 단수 / 복수 경로를 사용하려고 생각했지만 단수와 동일한 복수 수의 리소스를 사용한다는 것을 알고 있으므로 이에 대해 결정했습니다.

아무도 위의 생각이 있습니까? 아니면 이것을 구조화하는 다른 / 더 나은 방법이 있습니까?


나는 질문을 오해 할 수도 있지만 URL에 대해 이야기 할 때 SEO가 문제입니까?
Jon Hopkins

SEO는 문제가되지 않습니다. 기본적으로 자체 참조 리소스에 가장 적합한 논리적 URL 구조를 요구하고 있습니다.
Matt Brailsford

그것은 나에게 매우 똑바로 보인다.
Tim Post

그 구조는 얼마나 깊을 수 있습니까?
Martijn Verburg

@Martijn 깊이는 제한이 없습니다
Matt Brailsford

답변:


11

내 마음에 오는 것은 RESTful API가 URL 자체의 재귀를 반영하지 않도록하십시오. 생각해 보면 당신의 자원은 문서 일뿐입니다.

재귀 구조에 따라 문서를 실제로 저장 한 경우 고유 ID에 대한 맵핑을 작성하고 URL에서 ID를 사용하십시오.

/rest/documents/{id}

이제 다음과 같은 문서가 있다면 :

| DocumentName | DocumentPath | DocumentID |
--------------------------------------------
| ABC | / abc | 1 |
| asd | / abc / asd | 2 |
| asd | / asd | 3 |
| 부 | / abc / asd / boo | 4 |
| 이봐 | / abc / asd / hey | 5 |

요청은이 URL을 참조하여 /abc/asd문서 를 작성합니다.

GET /rest/documents/2

따라서 이제 API 사용자에게 적은 노력으로 구조를 통과 할 수있는 수단을 제공해야합니다. 응답 페이로드 (문서)를 다음과 같은 추가 순회 정보를 포함하는 오브젝트로 랩핑하여 수행 할 수 있습니다.

{
   data: { /* your document goes here */ },
   parent: {"abc": 1 },
   children: [ { "boo": 4 }, { "hey": 5} ]
}

사용자가 단일 레벨에서 너무 많은 문서를 작성하지 않을 것으로 예상되는 경우 하위 목록을 응답에 포함시킬 수 있습니다. 그렇지 않은 경우 사용자에게 하위 문서 ID를 검색하도록 제안 할 수 있습니다 (예 : querystring 매개 변수를 통한 결과 페이징 허용).

GET /rest/documents/2/children?page=2&size=50

마지막으로 querystring 매개 변수를 말하면 querystring 매개 변수를 통해 경로 정보를 직접 제공 할 수도 있습니다.

GET /rest/documents?path=somepath&page=1&size=42

언급 된 모든 접근 방식은 일반 GET /rest/documents문서가 루트 문서 만 반환 할 것으로 예상합니다 .


1
좋은 생각. 그러나 하위 문서가 문서 응답에 포함 된 경우 하위 문서와의 관계가 API에서 명확하지 않습니다. 문서에 다른 하위 리소스 (예 : 주석)가있는 경우 일반적으로 / documents / {id} / questions를 사용하여 문서의 질문에 액세스합니다. 일관되고 API에서 하위 문서와의 관계를 명확하게하기 위해 / documents / {id} / child-documents에서 하위 문서에 액세스해야한다고 제안합니다. 반환되는 표현은 / documents / {id}와 같은 문서입니다. 따라서 여기에 설명 된 나머지 부분도 여전히 작동합니다.
Nathan Ward

2

아마도 이런 것 :

/rest/{rootEntity}/Item/{leafEntity}/{id}
/rest/{entity}/ItemList
/rest/{entity}/ItemList/{leafEntity}

여기서 {rootEntity}는 컬렉션의 시작점이며 {leafEntity}는 트리 내의 명명 된 리프 노드입니다.

위의 매개 변수 중 몇 가지를 추가하여 최신 또는 모두 등을 선택할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.