2011-10-22 2 views
1

HttpClient를 사용하여 URL에서 전체 리디렉션 기록을 캡처 할 수 있습니까?HTTPClient - 모든 리디렉션 목록 캡처

예를 들어 URL-B로 리디렉션되는 URL-A는 URL-C로 최종 전송됩니다. URL A, B 및 C가있는 URL을 캡처하는 방법이 있습니까?

가장 확실한 옵션은 헤더에서 위치 태그를 수동으로 찾고 HTTP 200에 도달하면 중지하는 것입니다. 이것은 순환 리디렉션 등을 찾는 데 필요한 간단한 프로세스가 아닙니다.

HttpContext context = new BasicHttpContext(); 
    HttpResponse response = hc.execute(httpget, context); 
    //..... 
    for(URI u : ((RedirectLocations)context.getAttribute(DefaultRedirectStrategy.REDIRECT_LOCATIONS)).getAll()){ 
       System.out.println(u); 
    } 

이 사용하는 경우에 작동합니다

지금 나는의 라인을 따라 뭔가를 있으리라 믿고있어?

답변

3

HttpClient는 사용자 지정 RedirectHandler을 지원합니다. 기본 구현 (DefaultRedirectHandler)을 재정 의하여 모든 리디렉션을 캡처 할 수 있습니다.

DefaultHttpClient hc = new DefaultHttpClient(); 

HttpGet httpget = new HttpGet("http://google.com"); 
HttpContext context = new BasicHttpContext(); 


hc.setRedirectHandler(new DefaultRedirectHandler() { 
    @Override 
    public URI getLocationURI(HttpResponse response, 
           HttpContext context) throws ProtocolException { 

     //Capture the Location header here 
     System.out.println(Arrays.toString(response.getHeaders("Location"))); 

     return super.getLocationURI(response,context); 
    } 
}); 

HttpResponse response = hc.execute(httpget, context); 
+0

예를 들어 주셔서 감사합니다! 이 질문에 사용 된 위의 방법은 내가 원하는 것을하지 않을 것이고 자신의 리디렉션 처리기를 구현해야 함을 의미합니까? 우리는 실제로 모든 리디렉션 목록을 얻는 것 외에 다른 작업을 수행 할 필요가 없습니다. – NightWolf

+0

내가 한 것을 재사용했습니다. 나는 당신이 참조하는 어떤 수업의 적절한 의존성을 얻을 수 없었다. 간단히 말해서 테스트 해 보겠습니다. Google은 유스 케이스의 한 예입니다. (google.com -> www.google.com -> www.google.?) 또는 빠른 테스트 서버를 사용하십시오. – h3xStream

+0

Google에서 테스트 해 주셔서 감사합니다. 위의 접근법을 테스트 해 보면, 잘 작동하는 것처럼 보이지만 접근 방법과 함께 사용하는 것이 더 안전하고 유연합니다. – NightWolf