2013-11-15 4 views
12

RESTful API의 일반적인 패턴은 포함 된 링크가있는 단일 객체를 반환하는 것이므로 관련 객체를 검색하는 데 사용할 수 있습니다. 그러나 때로는 편의를 위해 한 번에 객체 그래프의 전체 덩어리를 되 돌리고 싶습니다.RESTful API에 포함/포함/연결

예를 들어, 당신이 고객, 주문반환와 저장 응용 프로그램을 가정 해 봅시다. 고객 ID 12345에 대해 개인 정보, 모든 주문 및 모든 반품을 함께 표시하려고합니다 (의 경우 항상을 반환하고 고객의 개인 정보가 포함 된 주문서를 반환해야합니다).

  1. GET /
    • 고객
  2. ,691,363를 쿼리 하나를 포함, 링크 템플릿의 목록을 반환 이렇게 뭔가처럼 (210) GET /customers/12345
  3. 이 고객의 주문을받을
    • 반환 고객의 개인 정보
    • 반환 링크 (/에서 링크 템플릿을 기반으로) 및 반환
  4. GET /orders?customerId=12345
    • (응답 /customers/12345에서)는 주문을 얻는다 고객 용 12345
  5. GET /returns?customerId=12345
    • 고객 12345

에 대한 수익을 얻을하지만은 customers URI가 한 쿼리에서 모든 다시이 문제를 풀 수 있도록 일단은 좋은 것 (응답 /customers/12345에서) . 여러 가지 요청을하는 대신 링크의 일부 또는 전부를 다른 곳으로 옮길 수있는 편리한 쿼리가있는 가장 좋은 방법이 있습니까? 나는 다음과 같은 것을 생각하고있다 :

GET /customers/12345?include=orders,returns 

그러나 만약 사람들이 이것을하고 있다면 나는 뭔가를 만들어 내고 싶지 않다.

(FWIW, 내가 가게를 구축하고 있지 않다, 그래서이 모델 또는 방법이 실제 제품, 또는 무엇이든 드릴 다운 겁니다에 적합한 개체 여부에 대해 애매한하지 말자.)

추가 업데이트

: 그것은 HAL speak 이러한 '가 포함 된 리소스'라고처럼 보이지만 표시된 예에 포함 할 리소스를 선택할 수있는 방법이 될 것 같지 않습니다.내가 쿼리 매개 변수로 embed를 사용하여, 내가 위에서 설명한 것처럼 뭔가를 제안 one blog post 발견

GET /ticket/12?embed=customer.name,assigned_user 

이 표준 또는 반 표준 관행, 또는 한 블로거가 만든 뭔가인가?

답변

1

이러한 유형의 매개 변수의 의미를 지원하는 각 링크 관계에 대해 문서화해야한다는 점과 이것이 코딩해야 할 내용이 더 많다는 것을 나는 알고있다. 이것을 표현하는 표준 방식을 가짐으로써 얻을 수있는 모든 것. URL 구조는 특정 표준 또는 모범 사례가 아닌 서버가 반환하는 것이 가장 쉽거나 가장 신중한 방법에 의해 유도 될 가능성이 큽니다.

그렇다면 영감을 얻으려면 OData가 $expand parameter으로 무엇을하고 있는지 확인하고 그 링크 관계를 모델링 할 수 있습니다. 관계의 계약을 명확하게 정의해야합니다. 그렇지 않으면 클라이언트 프로그래머는 OData와 같은 규칙을 볼 수 있으며 앱이 완전히 OData를 준수하며 (동일한 방식으로) 작동한다고 가정합니다.

+1

제공하신 $ expand 매개 변수 링크가 깨졌습니다. –

+1

깨진 링크는 [이 페이지] (http://www.odata.org/blog/enhancing-odata-support-for-querying-derived-types-revisited/)의 $ 확장 섹션을 참조하십시오. – Leith

+0

감사합니다, Leith! 결정된. –

관련 문제