2011-10-28 6 views
7

Bueno, yo estoy tratando de encontrar una manera de obtener componentes http seguir una redirección, pero no he encontrado ninguna en Google así que he venido aquí para pedir ayuda La func:HTTP componentes del núcleo sigue redirigir

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; 

} 

¿Alguna ayuda con esto también? porque no puedo encontrar nada ...

+0

¿Estás seguro de que necesitas este código complejo? http://hc.apache.org/httpcomponents-client-ga/examples.html generalmente funciona. El primer ejemplo (manejo de respuestas) sigue los redireccionamientos predeterminados. – palacsint

+0

Ya lo arreglé usando un urlconnector. – Cakestep

+0

En ese caso, debe hacer una nueva respuesta y aceptarla. Podría ayudar a otras personas con el mismo problema y otros no intentarán resolverlo de nuevo por usted. – palacsint

Respuesta

2

Le recomendaría que utilice el DefaultHttpClient básico que admite la redirección sin ningún ajuste o código adicional. Su comportamiento puede controlarse mediante 4 parámetros descritos en section 5.2 HttpClient parameters.

Si usted realmente no quiere depender de httpcomponents-client pero sólo en httpcomponents-core, usted tiene que recoger implementation from org.apache.http.impl.client.RedirectStrategy y crear su propio código para analizar la respuesta, determinar si se trata de un cambio de dirección válida (léase HTTP Spec con cuidado, es decir no tan simple) y desencadena una nueva solicitud en bucle si es necesario.

Mi opinión: no hay razón para escribir un código tan complejo de nuevo, y un día será necesaria la autenticación y tendrá que agregar ese soporte también. Entonces, solo confíe en HttpClient.

Cuestiones relacionadas