2013-08-12 8 views
0

항목에 대한 세부 정보 페이지가 있다고 가정 해 봅시다 :/items/{id}. 사용자는 임의의 임의의 ID를 시도 할 수 있지만 해당 항목에 대한 액세스 권한이없는 경우 데이터가없는 세부 정보 페이지를 반환합니다. 이는 그리 좋지 않습니다. 차라리 404 또는 204를 대신 반환하고 싶습니다. 그러나 Breeze Web API를 사용하면 IQueryable을 반환하므로 오류를 반환 할 수 없으며 클라이언트에서 빈 세트를 처리해야합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 결과가 비어 있는지 확인한 다음 사용자 정의 404 페이지로 리디렉션을 시도하고 있지만 더 좋은 방법이 있는지 궁금해하고 있습니까?Breeze.js : 빈 결과 처리

감사

답변

1

, 당신은 의식적인 결정 만든처럼 된 IQueryable 방법 내에서 404 오류를 던질 수 그 HTTP 리소스는 컬렉션입니다. 컬렉션은 비어있을 수 있지만 빈 컬렉션은 전체 컬렉션과 같은 유효한 리소스입니다. 컬렉션이 발견되었고 정확한 응답은 404가 아닌 200입니다.

HTTP 요청이 특정 항목 (예 : .. 인 경우, 경로가 ~/customers/: id), 404 상태의 HTTP 응답을 반환하는 것이 좋습니다. 원하는 경우 두 가지 종점을 모두 가질 수 있습니다. Breeze는 당신을 IQueryable로 강제하지 않습니다. 그것은 단지 선택 사항입니다. 두 종류의 엔드 포인트를 혼합하여 사용할 수 있습니다.

더 큰 관심사는 데이터 (고객)와 UI (페이지) 사이에 혼동을 일으킬 수 있다는 점입니다. 웹 API가 페이지를 리턴하지 않습니다. 그것은 데이터를 반환합니다.

세부 화면이있는 "단일 페이지 응용 프로그램"을 만들고 있다고 가정합니다. 세부 화면으로 이동하여 ID로 해당 화면의 엔티티를 가져 오려고 시도하고 그러한 엔티티가 존재하지 않는다는 것을 발견하면 실제로 어떤 일이 일어나야하는지 결정해야합니다. 이제 어디를 가야할지 결정해야합니다.

해당 결정은 HTTP 상태 코드와 별개입니다. HTTP 상태 코드를 염려하지 않고 클라이언트 측 화면을 안전한 위치 (예 : 고객 목록)로 리디렉션 할 수 있습니다. HTTP 상태 코드는 웹 통신을위한 HTTP 프로토콜의 일부입니다. 애플리케이션의 자체 클라이언트 화면 탐색 기능이 웹을 넘지 않으므로 해당 프로토콜을 채택 할 필요가 없습니다.

웹 API가 빈 콜렉션을 반환했음을 감지해야합니다. 당혹스럽지 않습니다. HTTP 경찰은 당신을 체포하지 않을 것입니다. 적절한 방향으로 재 전달하십시오.

+0

감사 와드와 제이. 이 경우 재 방향이 가장 합리적이라고 생각합니다. +1 재미있는 대답 :) –

1

당신은 당신이 된 IQueryable를 반환하는 서비스/웹 API 컨트롤러 방법을 쓸 때이

[HttpGet] 
public IQueryable<Customer> CustomersWithHttpError() { 
    // throw new HttpResponseException(HttpStatusCode.NotFound); 
    var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound); 
    responseMsg.Content = new StringContent("Custom error message"); 
    responseMsg.ReasonPhrase = "Custom Reason"; 
    throw new HttpResponseException(responseMsg); 
} 
+0

이 접근 방식의 문제점은 필터가 일반적으로 클라이언트에 있다는 것입니다. 예를 들어, 서버에서 나는 보통 'IQueryable Customers() {// 모든 고객을 돌려줍니다}'라고합니다. 그런 다음 클라이언트에서 브리즈 조건부를 사용하여 필터링합니다. 술어가 결과 세트를 비 웁니다. 'EFContextProvider'에서 그것을 포착 할 수있는 방법이 있습니까? –

+0

'EFContextProvider'의 서브 클래스,'EFContextProvider를 감싸는 저장소 클래스, 또는 웹 API 컨트롤러 메소드에서 그것을 감지 할 수 있습니다. 그러나 어떤 접근 방식을 취한 후에도 서버에서 먼저 쿼리를 실행해야하며이 작업을 수행하고 싶지는 않습니다. *이 * 이유 때문이 아닙니다. 나는 도움이되지 않는 순수성에 대한 열매없는 개념에 사로 잡혀 있다고 생각합니다. 내 대답을 보라. – Ward