2017-04-26 1 views
0

Spring의 RestTemplate.exchange (url, HTTP.GET, String.class) 서명을 사용하여 URL 및 GET Http 메소드를 사용하여 리소스에 액세스하면 url로 표시된 리소스를 호스팅하는 서버가 다운되었는지 또는 서버가 리소스를 찾을 수 없으므로 HttpStatus 코드 404를 반환하는지 여부를 어떻게 구별 할 수 있습니까?HttpStatus 코드 404가 반환 될 때 url에 리소스를 호스팅하는 서버가 다운되었는지 또는 리소스가 존재하지 않는지를 구별하는 방법

이 차이에 대한 재시도 메커니즘을 기반으로하고 싶습니다. 리소스가없는 경우 다시 시도하지 않습니다. 그러나 서버가 다운 된 경우 서버가 작동하기를 희망하는 구성 가능한 백 오프 시간 후에 재 시도합니다.

I 클래스 스프링 소스에 HTTPStatus 언급하고 URL을 참조 발견 - http://tools.ietf.org/html/rfc7231#section-6.5.5

6.5.4. 404 찾을 수 없음 404 (찾을 수 없음) 상태 코드는 원본 서버가 대상 리소스에 대한 현재 표현을 찾지 못했거나 이 존재한다고 알려주었습니다. 404 상태 코드는 표현의 부족이 일시적인지 또는 영구적인지를 나타내는 이 아닙니다. 오리진 서버가 구성 가능한 수단을 통해 아마도 상태가 영구적 인 것으로 알고있는 경우 410 (사라짐) 상태 코드가 404보다 선호됩니다. 404 응답은 기본적으로 캐시 가능합니다. 즉, 메소드 정의 또는 명시 적 캐시 컨트롤 ( )에 의해 표시되지 않는 한 [[RFC7234]의 섹션 4.2.2 참조).

나는 (Is 404 the right return code for a resource that currently doesn't exist?)과 (What to return when a route/url is found but not the resource behind it?)를 읽었습니다. 하지만 두 시나리오를 구분할 수있는 기사를 찾을 수 없었습니다.

HttpClientErrorException을 처리하고 ResponseBody 필드를 살펴보면 해결할 수 있지만 올바른 방법이 아닐 수 있습니다.

+0

응답 헤더에 뭔가 있어야합니다. – user2793390

+0

당신은 정확합니다. Micheal Peacock도 마찬가지입니다. 중지중인 서버는 클라이언트 측에서 I/O 오류로 처리되고 RestTemplate에 의해 ResourceAccessException이 throw됩니다. ResourceAccessException - 서버가 중단 된 경우. HttpStatusCodeException - 서버가 가동되어 상태 코드가 리턴되었을 때. 감사합니다. –

답변

2

HTTP 404 상태는 실행중인 서버가 요청한 리소스를 찾을 수없는 경우에만 반환 할 수있는 유효한 응답입니다. 그러나 서버가 다운되면 연결이 거부됩니다.

0

중단중인 서버는 클라이언트 측에서 I/O 오류로 처리되고 RestTemplate에 의해 ResourceAccessException이 발생합니다.

ResourceAccessException - 서버가 중단 된 경우.

HttpStatusCodeException - 서버가 가동되어 상태 코드가 반환 될 때 (4xx -series가 서브 클래스 예외 HttpClientErrorException을 throw하면 5xx 계열에서 서브 클래스 예외 HttpServerErrorException이 발생 함).

관련 문제