2011-10-28 3 views
7

Beh, io sto cercando di trovare un modo per ottenere componenti HTTP a seguire un reindirizzamento, ma non hanno trovato alcuna su google così ho venuto qui per chiedere aiuto Il func:HTTP nucleo componenti seguire reindirizzare

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; 

} 

Qualsiasi aiuto con questo anche? perché non riesco a trovare nulla ...

+0

Sei sicuro di aver bisogno di questo codice complesso? http://hc.apache.org/httpcomponents-client-ga/examples.html di solito funziona. Il primo esempio (Gestione risposta) segue il reindirizzamento predefinito. – palacsint

+0

Già risolto usando un urlconnector. – Cakestep

+0

In tal caso dovresti fare una nuova risposta e accettarla. Potrei aiutare altre persone con lo stesso problema e altri non cercheranno di risolverlo di nuovo per te. – palacsint

risposta

2

Si consiglia di utilizzare il DefaultHttpClient di base che supporta il reindirizzamento senza alcuna ottimizzazione o codice aggiuntivo. Il suo comportamento può essere controllato da 4 parametri descritti in section 5.2 HttpClient parameters.

Se davvero non si vuole dipendere da httpcomponents-client ma solo su httpcomponents-core, si dovrà prendere implementation from org.apache.http.impl.client.RedirectStrategy e creare il proprio codice per analizzare la risposta, determinare se si tratta di un reindirizzamento valido (LEGGI HTTP spec con attenzione, vale a dire non è così semplice) e attiva una nuova richiesta in loop se necessario.

La mia opinione: nessun motivo per scrivere di nuovo un codice così complesso, e sarà necessario un giorno di autenticazione e dovrai aggiungere anche quel supporto. Quindi, basta affidarsi a HttpClient.