2016-08-17 3 views
1

기존 제품 데이터베이스의 꼭대기에 (읽기 전용) REST 서비스를 배치해야합니다. "실제로이 서비스의 호출자가 아니라 같은 (상점의 ID와 특정 프로세스의 기반으로 자신의 관련 제품을 얻을해야합니다, 지금REST API 디자인 : 하위 리소스가 될 수있는 리소스를 처리하는 방법

/api/products/ 

: 쉬운 부분처럼, 최상위 제품 리소스를 가지고있다 소매 "). 이러한 두 가지 값을 조합하면 구성 요소의 하위 집합이 생성됩니다. 이것은 발신자에게 투명해야하며 "제품 포트폴리오"에 대해 알 필요가 없습니다.

그래서 나는 1234가을 StoreID이고 소매는 과정이고,이 같은 URI를 설계에 대해 생각 :

/api/stores/1234/retail/products 

여기 온다 내가 여기 또는 URI에 대한 모든 제품을 반환해야하는 경우입니다 첫 번째 질문 .../api/products/...에있는 개별 리소스는 호출자가/api/products에서 각 개별 제품을 검색 할 필요가 없다는 것을 분명히 알 수 있습니다./api/products에 캐싱 두통을 일으킬 수 있습니다. 상점/1234/retail/products URI.

물건을 복잡하게하는 것은 당연히 그 제품에도 가격이 있습니다. 여기에도 제품에는 하나의 가격이 없지만 다른 요인 외에 StoreID 및 프로세스에도 종속 된 여러 제품이 있습니다. 실제로, 가격 때문에, 제품의 직접 자녀 :

/api/stores/1234/retail/products/ABCD/prices 
:을 StoreID 및 프로세스와 관련된으로

/api/products/ABCD/prices 

다시 확실한 선택,하지만 것처럼, URI에이 가격을 사전 필터링

이 더 적절할 것입니다.

동시에 제품 세부 정보와 같이이 URI에 속하지 않는 다른 하위 제품이 있습니다. 그것들은 저장소 나 프로세스에 의존하지 않으므로 분명히/api/products/ABCD/details 아래에서만 의미가 있습니다.

그러나 이것은 어쩐지 나에게 지저분 해 보입니다. 그러나 동시에 만 queryparam 필터가 직접 제품 리소스에 그것을 해결함으로써이 문제를 해결, 훨씬 좋네요하지 않고 모두를 제공하기 위해 발신자를 적용하지 않습니다, STOREID 및 프로세스 : 더욱

/api/products?store=1234&process=retail 
/api/products/ABCD/prices?store=1234&process=retail 

, 프로세스 또는 storeid는 제품과 관련이 없으므로 직접 제품에 대해 질의하는 것이 이상하게 보입니다. 가격을 생각하면 이해할 수 있습니다.

제 질문은 : 제가보기에는이 문제를 해결할 수있는 좋은 방법이 있습니까? 그리고 : 하위 제품 일 때 전체 제품을 반환하는 것이 좋습니다. 그렇게 할 때 캐싱 (HTTP) 캐싱에 대해 어떻게 생각합니까? [...] 사기꾼이 될 것이 이 원인이 것이 내가/API/제품 /에 개별 자원에 여기에 제품이나 URI를 전체 반환해야하는 경우 여기에 오는

+0

'store'와'process'가'products' 리소스의 매개 변수라면, 하위 리소스를 가져 오더라도 거기에 보관하는 것이 더 깔끔한 것 같습니다. 구조를위한 행렬 매개 변수 -'/ api/products; store = 1234; process = retail/ABCD/prices'. 일반적으로 말하자면, 좋은 URI 디자인은 클라이언트를 어쨌든 서버 응답에서 필요한 모든 것을 배우게 될 것이기 때문에보다 복잡한 RESTful 서비스를 만드는 것은 아닙니다. 진정한 RESTful 환경입니다. 대부분의 REST 서비스는 스스로를 RESTful하게 호출해서는 안되며 HTTP 또는 ASOTOH의 최상위에있는 API 서비스 –

+0

절대적으로 의미가 있지만,/api/products URI를 통해 직접 노출하는 것과 관련된 한 가지 문제점은 저장소와 프로세스의 조합이 실제로 특별한 의미를 가지며 내가 선택한 데이터 집합을 줄입니다. 예를 들어 저장소 ID 만 전달하면 모든 제품에서 계속 선택되지만 두 제품 모두 전달하면 구성된 하위 집합에서만 선택됩니다. 그래서 특별한 시나리오를 쿼리 할 때 특수한 URI를 사용하는 것이 저장소와 프로세스가 제품과 직접적으로 관련이 없으므로 더욱 의미가 있다고 생각했습니다. – CodingByLuck

답변

0

첫 번째 질문은/api/stores/1234/retail/products URI에 캐싱 두통.

전 제품을 분명히 반환 할 것입니다. 고객이 단순히 제품 이름 목록을 표시하려는 경우 고객이해야 할 금액을 생각해보십시오.이상적으로는이 끝점에 페이지 매김이 적용됩니다 (예 : &pageSize=10&pageNumber=2과 같은 쿼리 문자열 포함).

또한 여기에는 다양한 캐싱 솔루션이 있습니다. 예를 들어 Redis와 같은 데이터 구조 서비스에서 모든 제품을 캐시 할 수 있습니다.

물론, 그 제품은 물론 가격 [...] 및 세부 subresource 있습니다. 링크가 놀이에 와서 어디 Richardson Maturity Model level 3 보면

,이 것, 당신은 제품 자원에서 이런 식으로 뭔가를 할 수 :

<link rel = "/linkrels/products/ABCD/prices" 
     uri = "/products/ABCD/prices?store=1234&process=retail"/> 

및 제품 정보 자원에 대한 다른 유사한 링크를.

@Roman이 맞다. REST는 검색 가능하도록되어있다. 클라이언트는 (예 : SOAP와 같이) 암기하는 대신 링크를 따라 가야한다 (긴/못생긴 uris를 가질 수있다).

+0

감사합니다. Alexandru. 가격에 대해 생각해 볼 때, 제품과 비교할 때이 스토어/프로세스 조합의 일부가 아니므로/stores/... URI 아래에 두지 않는 것이 좋습니다. 그것들에 대해서도 질의를 할 수는 있지만 가격의 선택을 줄이지는 못한다. 반면에이 조합이 주어지면 제품의 경우가 그렇다. 따라서 저장소/프로세스 조합에 대해 구성된 하위 집합을 고려해야 할 때 특수 URI가 있어야한다고 생각하는 반면 on/api/products는 항상 전체 데이터 집합에서 선택하는 것이 좋습니다. – CodingByLuck

+0

링크에 관해서는 그렇습니다. 그렇게 할 계획인데, 내 응답에서 하위 또는 관련 리소스에 대한 링크를 제공합니다. 그러나 나는 HATEOAS를 구현할 계획이 없습니다. 그래서 RESTful을 언급하지 않았습니다. :) – CodingByLuck

+1

@CodingByLuck이 게시물을 업데이트하고 제목과 태그에서'REST' 키워드를 제거하십시오. RESTful 솔루션은 HATEOAS를 포함하고 있습니다. 이것은 몇 가지 아키텍처 제약 중 하나입니다. (https://en.wikipedia.org/wiki/Representational_state_transfer#Architectural_constraints) REST가 있습니다! –

관련 문제