2013-07-15 3 views
1

OData를 사용하고 HTTP 캐싱의 이점을 얻고 싶습니다. "하나의 엔티티에 하나의 URI가 있음"규칙을 정했습니다. 하나의 엔티티에 쿼리를 수행하는 방법에는 여러 가지가 있습니다, 함께 제품을 말할 수 SKU = 123 (PK 인) :HTTP 캐싱 OData 쿼리를 처리하는 올바른 방법은 무엇입니까?

/MyService.svc/Product(123) 

또는

/MyService.svc/Product?$filter=sku eq 123 

또는

/MyService.svc/Product(123)?$filter=sku eq 123 

이 제품을 쿼리하는 가장 모호한 방법은 제목을 통해입니다 :

/MyService.svc/Product?$filter=title eq 'Some handy product' 

(이 쿼리는 하나의 엔티티 - 제품 123을 반환합니다.)

내 질문 : 가장 비슷한 OData-way 어떻게 이러한 종류의 쿼리에 응답합니까?

몇 가지 조사 후, 마지막 의견입니다 : $ 필터의 경우

  • 입니다

    • 하자 제품 (123) 작품으로 = HTTP (302) 및 위치 헤더 SKU EQ 123/아이디 EQ (123) 응답 제품 (123)을 가리 킵니다.
    • 제품 (123)의 경우? $ filter = sku eq 123이 400 (Bad Request)으로 응답하려면 바보이기 때문에. 또는 302 리디렉션을 사용하여 제품 (123) ...

    하지만 마지막 사례는 어떻게해야할까요?

  • 답변

    2

    제품 (123) -> 당신은 당신의 응답 페이로드에서 하나의 개체를 반환해야합니다

    제품 (123) $ 필터 = SKU EQ (123) -> 그건 정말 이해가되지 않습니다 - 필터를 적용 할 예정이다 Product (123)은 하나의 개체 (항상)를 식별합니다. 오늘날 대부분의 OData 서비스는 비헤이비어 또는 초기 서버 스택으로 인해이를 무시하지만 쿼리 옵션이 적용되지 않기 때문에 400을 사용할 수 있습니다.

    제품은 엔티티 집합을 식별하므로 엔티티 집합 (AKA 피드)을 반환해야합니다. 특정 쿼리가 단일 엔터티를 식별하는 경우에도 단일 엔터티가 포함 된 피드는 REQUIRED 응답이어야합니다.

    제품? $ filter = title eq '유용한 제품'-> 예상 응답과 관련하여 sku eq 123과 동일합니다. 단일 리소스를 식별 할 수는 있지만 엔터티 집합에 여전히 피드를 응답으로 포함해야한다는 사실은 변경되지 않습니다.

    당신은 하나의 엔티티에 하나의 URL이 있다는 규칙을 잡고 싶다고 말했습니다. OData에서 하나의 URL은 엔티티를 식별하지만 여러 URL이 동일한 정보를 제공 할 수 있습니다. 그래서 나는 당신이 괜찮다고 주장 할 것입니다. 리소스를 식별하는 하나의 URL을 정식 URL이라고합니다. 제품 (123)은 정식 URL입니다. JSON 페이로드에서 odata.id는 엔티티의 표준 URL을 제공합니다.

    그럼 SEEM이 같은 엔티티를 참조하는 다른 쿼리는 어떻게됩니까? 유효한 필터 예제 (3 번째 및 4 번째 필터 예제)에서 경로는 위에서 설명한대로 콜렉션을 식별합니다. 컬렉션에 하나의 엔티티 만 포함된다는 사실은 부적합합니다. 리소스를 식별하는 경로는 여전히 Product (123)입니다.다른 URL은 '식별'하지 않고 해당 엔티티에 대한 정보를 제공 할 수 있습니다. 그래서 나는 당신이 어떤 식 으로든 진술을 부러 뜨렸다 고 생각하지 않습니다.

    질문의 3xx 부분에 답하십시오. HTTP의 일부인 리디렉션과 함께 요청에 항상 자유롭게 응답 할 수 있으며 OData는이를 변경하지 않습니다. 그러나 원래 요청과 동일한 모양이 아닌 무언가로 리디렉션하는 것은 잘못된 서버 동작입니다. 예를 들어 Product (123)? $ filter = 제품 엔터티 컬렉션을 식별하는 모든 것. 제품 (123)으로 리디렉션하는 것은 내 생각에 나쁜 생각입니다. 단일 항목을 식별하기 때문입니다. 당신이 쓰는 응답은 다르게 보일 것입니다! 기존 OData 클라이언트가이를 처리 할 수 ​​있다면 놀랍지 만, 새로운 OData 클라이언트도이를 처리 할 것으로 기대하지는 않습니다.

    HTTP 캐싱의 의미는 무엇입니까? 글쎄, 솔직히 말해서 적어도 주어진 시나리오에서 나는 특별한 것을해야한다고 생각하지 않는다.

    관련 문제