2011-10-24 5 views
0

시나리오는 다음과 같습니다. 원격 C 시스템에 저장된 엔터티에 대한 캐시 역할을하는 RESTful 웹 서비스를 구현하고 있습니다. 웹 서비스의 요구 사항 중 하나는 원격 C 시스템이 오프라인 일 때 마지막 캐시 된 데이터로 GET 요청에 응답하지만이를 "부실"로 표시한다는 것입니다.부실 데이터를 반환 할 수있는 GET 요청에 사용할 HTTP 상태 코드는 무엇입니까?

데이터가 부실하다고 플래그를 지정하는 방식은 200 (확인) 이외의 HTTP 상태 코드를 반환하는 것입니다. 나는 503 (서비스를 사용할 수 없음)을 사용하는 것을 고려했지만, 일부 C#/Java HTTP 클라이언트가 예외를 던지게하고, 간접적으로 사용자가 제어 흐름에 대한 예외를 사용하도록 강요한다고 생각한다.

더 적절한 상태 코드를 제안 할 수 있습니까? 아니면 200을 반환하고 응답 본문에 staleness 플래그를 추가해야합니까? 또 다른 옵션은 연결 상태를 알려주는 별도의 리소스를 정의하고 클라이언트가 별도로 처리하도록합니다.

답변

1

그는 특정 상황에서

을 말한다.

웹 서비스가 중간 캐시처럼 작동합니다.

만료 또는 최대 연령 헤더가 지나면 표현이 유효하지 않습니다. 따라서

Cache-control: Max-age=0 

으로 표현을 반환 한 경우 효과적으로 반환하는 표현이 이미 부실하다고 말합니다.

Cache-control: Max-age=3600 

, 당신은 데이터가 시간이 0이 아닌 양의 신선한 고려 될 수있는 "시스템 C"에서 표현을 검색 할 때, 웹 서비스가 무엇인가 등으로 표현을 반환 할 수 있다고 가정하면 클라이언트는 캐시를 확인하실 수 있습니다 max-age == 0에 대한 제어 헤더를 사용하여 처음 검색되었을 때 표현이 부실했는지 여부를 판별하십시오.

+0

모든 대답이 유효하지만, 이는 내 문제에 대해 가장 의미 론적으로 일치하는 것으로 간주됩니다. 감사! – PaoloVictor

4

Last-Modified 헤더를 적절하게 설정하고 클라이언트가 부실하다고 판단하게하십시오. 부실 데이터의 경우 Last-Modified 날짜가 "normal"보다 뒤쪽에 있습니다. 최신 데이터의 경우 Last-Modified 헤더를 최신으로 유지하십시오. 이 에서 네트워크 연결이 끊어 때, 예를 들어 - - 캐시가 원 서버 확인하지 않고 부실 응답 서비스를 제공 할 수 마크 노팅엄의 caching article에서

2

당신이 오래된 응답을 RFC-2616 제공하는 경우는 말한다 :

저장된 응답이 신중하게 고려 상황에서, 클라이언트 모두의 가장 제한 신선도 요구 사항과 원 서버가 "충분한 신선한"가 아닌 경우 캐시 은 헤더 (13.1.5 및 14.46 절 참조)를 사용하여 응답을 반환 할 수 있습니다 (예 : "no-store"캐시 지시문 또는 " no-cache "cache-request-directive, 14.9 절 참조).

즉, 200 번째를 제공하는 것은 완벽합니다.

2

200 OK와 적절한 애플리케이션 별 응답을 반환합니다.응답을 사용할지 결정하는 방법과 응답을 클라이언트에 전달하기 때문에 다른 HTTP 상태 코드는 적절하지 않습니다. 또한 표준 HTTP 캐시 제어 헤더를 사용하지 말 것을 권장합니다. 제 3 자 (중개자 및 클라이언트) 캐시를 제어하는 ​​데만 사용할 것입니다. 이 헤더를 사용하여 응용 프로그램 특정 정보를 전달하면 응용 프로그램 논리를 캐시 제어에 비합리적으로 연결합니다. 즉각적으로 명확하지는 않지만 애플리케이션 로직 및 캐싱 전략을 독립적으로 개발할 수있는 능력에는 장기적인 이점이 있습니다.

관련 문제