¿Por qué mi clase HttpClient se congela con ciertas URL?
-
29-10-2019 - |
Pregunta
Actualmente me estoy familiarizando con las nuevas bibliotecas HttpClient para crear una clase básica que devuelva html / css / etc. de la URL solicitada. Usando el ejemplo tomado de aquí
Puede ver el ejemplo a continuación:
package test;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
public class Test {
public final static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet("http://www.cwjobs.co.uk/");
System.out.println("executing request " + httpget.getURI());
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println(responseBody);
} finally {
httpclient.getConnectionManager().shutdown();
}
}
}
El problema que tengo es que si tuviera que establecer la URL que quiero solicitar en algo como http:// www .google.com y luego imprime la respuesta que necesito. Sin embargo, cuando utilizo una URL como www.cwjobs.co.uk (utilizada simplemente como ejemplo), se congela en el método de ejecución.
Soy bastante nuevo en Java y entiendo los conceptos básicos de HTTP, así que me encantaría saber si: - Aunque he utilizado un ejemplo básico, lo he hecho mal al perder algo que debe agregarse para acceder a esa URL específica - No es posible obtener la respuesta que deseo de esa URL específica debido a la configuración del entorno en el lado del servidor. - Cualquier literatura o enlaces adicionales que pueda recomendarme para que los revise fuera del sitio de Apache.org
Gracias, Marcar
Solución
Debe establecer el tiempo de espera en DefaultHttpClient para la conexión.Ver: http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html?is-external=true#SO_TIMEOUT
Otros consejos
Este código ahora está obsoleto (obtenga HttpParams, etc.).Una mejor forma es:
RequestConfig defaultRequestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BEST_MATCH).setExpectContinueEnabled(true).setStaleConnectionCheckEnabled(true).setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST)).setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).build();
HttpGet httpGet = new HttpGet(url);
RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig).setSocketTimeout(5000).setConnectTimeout(5000).setConnectionRequestTimeout(5000).build();
httpGet.setConfig(requestConfig);