2011-10-28 53 views
7

嗯,我试图找到一种方式来获得HTTP组件遵循一个重定向,但没有发现任何关于谷歌所以我来到这里寻求帮助 的FUNC:HTTP组件核心遵循重定向

public String GetSite(String site, String path) throws Exception { 

    HttpParams params = new SyncBasicHttpParams(); 
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
    HttpProtocolParams.setContentCharset(params, "UTF-8"); 
    HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1"); 
    HttpProtocolParams.setUseExpectContinue(params, true); 

    HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[]{ 
       // Required protocol interceptors 
       new RequestContent(), 
       new RequestTargetHost(), 
       // Recommended protocol interceptors 
       new RequestConnControl(), 
       new RequestUserAgent(), 
       new RequestExpectContinue()}); 

    HttpRequestExecutor httpexecutor = new HttpRequestExecutor(); 

    HttpContext context = new BasicHttpContext(null); 
    HttpHost host = new HttpHost(site, 80); 

    DefaultHttpClientConnection conn = new DefaultHttpClientConnection(); 
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy(); 

    context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); 
    context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host); 

    try { 

     String[] targets = { 
      path}; 

     for (int i = 0; i < targets.length; i++) { 
      if (!conn.isOpen()) { 
       Socket socket = new Socket(host.getHostName(), host.getPort()); 
       conn.bind(socket, params); 
      } 
      BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]); 
      request.setParams(params); 
      httpexecutor.preProcess(request, httpproc, context); 
      HttpResponse response = httpexecutor.execute(request, conn, context); 
      response.setParams(params); 
      httpexecutor.postProcess(response, httpproc, context); 

      if (!connStrategy.keepAlive(response, context)) { 
       conn.close(); 
      } else { 
      } 
      return (EntityUtils.toString(response.getEntity())); 

     } 
    } finally { 
     conn.close(); 
    } 
    return null; 

} 

对此也有帮助吗?因为我找不到任何东西...

+0

你确定你需要这个复杂的代码吗? http://hc.apache.org/httpcomponents-client-ga/examples.html通常起作用。第一个(响应处理)示例遵循重定向默认值。 – palacsint

+0

已经通过使用urlconnector修复了它。 – Cakestep

+0

在这种情况下,你应该作出新的答案并接受它。我可以帮助其他人解决同样的问题,而其他人不会为你解决问题。 – palacsint

回答

2

我建议你使用基本的DefaultHttpClient,它支持重定向,无需任何调整或额外的代码。其行为可以通过section 5.2 HttpClient parameters中描述的4个参数来控制。

如果你真的不想依赖于httpcomponents-client但仅限于httpcomponents-core,你将不得不拿起implementation from org.apache.http.impl.client.RedirectStrategy并创建自己的代码来解析响应,确定它是否是一个有效的重定向(读HTTP规范认真,这是不是那么简单),并在需要时在循环中触发新的请求。

我的意见:没有理由再次编写这样复杂的代码,并且需要一天的身份验证,您也必须添加该支持。所以,只需要依赖HttpClient。