3

Я хотел бы перейти из Commons HttpClient (3.x) в HttpComponents Client (4.x), но с трудом справился с переадресацией. Код работает правильно в Commons HttpClient, но прерывается при переносе на клиент HttpComponents. Некоторые из ссылок получают нежелательные переадресации, но когда я устанавливаю «http.protocol.handle-redirects» на «false», большое количество ссылок перестает работать вообще.Миграция из Commons HttpClient в HttpComponents Клиент

Commons HttpClient 3.x:

private static HttpClient httpClient = null; 
private static MultiThreadedHttpConnectionManager connectionManager = null; 
private static final long MAX_CONNECTION_IDLE_TIME = 60000; // milliseconds 

static { 
    //HttpURLConnection.setFollowRedirects(true); 
    CookieManager manager = new CookieManager(); 
    manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
    CookieHandler.setDefault(manager); 

connectionManager = new MultiThreadedHttpConnectionManager(); 
connectionManager.getParams().setDefaultMaxConnectionsPerHost(1000); // will need to set from properties file 
connectionManager.getParams().setMaxTotalConnections(1000); 
httpClient = new HttpClient(connectionManager); 
} 




/* 
* Retrieve HTML 
*/ 
public String fetchURL(String url) throws IOException{ 

    if (StringUtils.isEmpty(url)) 
     return null; 

    GetMethod getMethod = new GetMethod(url); 
    HttpClient httpClient = new HttpClient(); 
    //configureMethod(getMethod); 
    //ObjectInputStream oin = null; 
    InputStream in = null; 
    int code = -1; 
    String html = ""; 
    String lastModified = null; 
    try { 
     code = httpClient.executeMethod(getMethod); 

     in = getMethod.getResponseBodyAsStream(); 
     //oin = new ObjectInputStream(in); 
     //html = getMethod.getResponseBodyAsString(); 
     html = CharStreams.toString(new InputStreamReader(in)); 

    } 


    catch (Exception except) { 
    } 
    finally { 

     try { 
     //oin.close(); 
     in.close(); 
     } 
     catch (Exception except) {} 

     getMethod.releaseConnection(); 
     connectionManager.closeIdleConnections(MAX_CONNECTION_IDLE_TIME); 
    } 

    if (code <= 400){ 
     return html.replaceAll("\\s+", " "); 
    } else { 
     throw new Exception("URL: " + url + " returned response code " + code); 
    } 

} 

HttpComponents Client 4.x:

private static HttpClient httpClient = null; 
private static HttpParams params = null; 
//private static MultiThreadedHttpConnectionManager connectionManager = null; 
private static ThreadSafeClientConnManager connectionManager = null; 
private static final int MAX_CONNECTION_IDLE_TIME = 60000; // milliseconds 


static { 
    //HttpURLConnection.setFollowRedirects(true); 
    CookieManager manager = new CookieManager(); 
    manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
    CookieHandler.setDefault(manager); 


connectionManager = new ThreadSafeClientConnManager(); 
connectionManager.setDefaultMaxPerRoute(1000); // will need to set from properties file 
connectionManager.setMaxTotal(1000); 
httpClient = new DefaultHttpClient(connectionManager); 



    // HTTP parameters stores header etc. 
    params = new BasicHttpParams(); 
    params.setParameter("http.protocol.handle-redirects",false); 

} 




/* 
* Retrieve HTML 
*/ 
public String fetchURL(String url) throws IOException{ 

    if (StringUtils.isEmpty(url)) 
     return null; 

    InputStream in = null; 
    //int code = -1; 
    String html = ""; 

// Prepare a request object 
HttpGet httpget = new HttpGet(url); 
httpget.setParams(params); 

// Execute the request 
HttpResponse response = httpClient.execute(httpget); 

// The response status 
//System.out.println(response.getStatusLine()); 
int code = response.getStatusLine().getStatusCode(); 

// Get hold of the response entity 
HttpEntity entity = response.getEntity(); 

// If the response does not enclose an entity, there is no need 
// to worry about connection release 
if (entity != null) { 

     try { 
      //code = httpClient.executeMethod(getMethod); 

      //in = getMethod.getResponseBodyAsStream(); 
      in = entity.getContent(); 
      html = CharStreams.toString(new InputStreamReader(in)); 

     } 


     catch (Exception except) { 
      throw new Exception("URL: " + url + " returned response code " + code); 
     } 
     finally { 

      try { 
       //oin.close(); 
       in.close(); 
      } 
      catch (Exception except) {} 

      //getMethod.releaseConnection(); 
      connectionManager.closeIdleConnections(MAX_CONNECTION_IDLE_TIME, TimeUnit.MILLISECONDS); 
      connectionManager.closeExpiredConnections(); 
     } 

    } 

    if (code <= 400){ 
     return html; 
    } else { 
     throw new Exception("URL: " + url + " returned response code " + code); 
    } 


} 

Я не хочу переадресаций под HttpClient 4.x, если включить переадресацию, то я получаю некоторые которые являются нежелательными, например http://www.walmart.com/ =>http://mobile.walmart.com/. В HttpClient 3.x таких переадресаций не происходит.

Что нужно сделать для переноса HttpClient 3.x на HttpClient 4.x без нарушения кода?

ответ

2

Это не проблема с HttpClient 4.x, возможно, так, как целевой сервер обрабатывает запрос, поскольку пользовательский агент является httpclient, он может обрабатываться как мобильный (целевой сервер может рассматривать, кроме доступных браузеров, например, , Chrome, Mozilla и т.д., как мобильный телефон.)

Пожалуйста, используйте ниже код, чтобы установить его вручную

httpclient.getParams().setParameter(
      org.apache.http.params.HttpProtocolParams.USER_AGENT, 
      "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2" 
     );