HttpComponents
- Área: Librerías y Módulos
- Grupo: Librerías para Comunicaciones
- Carácter del recurso: Recomendado
- Tecnologías: Java
Descripción
Antes conocido como Commons HttpClient proyecto de Jakarta ha dejado de ser desarrollado y ha sido reemplazado por el proyecto Apache HttpComponents en su modulo de HttpClient y HttpCore, que ofrece mejor rendimiento y una mayor flexibilidad.
El protocolo de transferencia HTTP es quizás el protocolo más significativo usado en Internet hoy en día. Los servicios Web, las aplicaciones red y el crecimiento de computar de la red continúan ampliando el papel del protocolo HTTP más allá de los navegadores web, mientras que aumentan el número de los usos que requieren de la ayuda del HTTP.
Aunque el paquete de java.net proporciona la funcionalidad básica para los recursos que tienen acceso vía HTTP, no proporciona la flexibilidad o la funcionalidad completa necesitada por muchos usos. El componente HttpComponents de Apache intenta llenar este vacío proporcionando un paquete eficiente, actualizado, y abundantes características que pone el lado del cliente en ejecución de los estándares más recientes y de las recomendaciones del HTTP.
El componente HttpComponents puede ser de interés para cualquier persona que construya aplicaciones del cliente HTTP tales como buscadores web, servicio cliente web, o sistemas que multipliquen o amplíen el protocolo HTTP para la comunicación distribuida.
Ejemplos de Uso
package autentia.tutoriales.httpClient;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.*;
/**
* Ejemplo del uso de Jakarta Commons HttpClient
* @author Carlos García. Autentia Real Business Solutions
* @see http://www.mobiletest.es
*/
public class HttpClientTutorial {
/**
* En caso de salir a Internet a tavés de un Proxy, se deberán modificar los siguientes parámetros
*/
public static final boolean byProxy = false;
public static final String ProxyAddress = "TuProxyAddress";
public static final int ProxyPort = 1234;
/**
* Direcciones que usamos para enviar peticiones
*/
public static final String TargetURLSSL = "https://www.verisign.com";
public static final String TargetURL = "http://www.autentia.es";
/**
* Por defecto haremos una petición HTTP GET. Cambiar a false para peticiones HTTP POST
*/
public static final boolean ByGet = true;
/**
* Si queremos hacer conectarnos a un servidor seguro via SSL poner a true la siguiente variable
*/
public static final boolean BySSL = false;
/**
* En caso de necesitar autentificacion con el servidor modificar los siguientes parámetros
*/
public static final boolean Authenticate = false;
public static final String UsernameCredentials = "TuUsuario";
public static final String PasswordCredentials = "TuPassword";
/**
* Punto de inicio de ejecución del ejemplo.
*/
public static void main(String[] args) {
HttpClient httpClient = null; // Objeto a través del cual realizamos las peticiones
HttpMethodBase request = null; // Objeto para realizar las peticiines HTTP GET o POST
int status = 0; // Código de la respuesta HTTP
BufferedReader reader = null; // Se usa para leer la respuesta a la petición
String line = null; // Se usa para leer cada una de las lineas de texto de la respuesta
// Instanciamos el objeto
httpClient = new HttpClient();
// Especificamos que salimos a través de un Proxy.
if (byProxy){
httpClient.getHostConfiguration().setProxy(HttpClientTutorial.ProxyAddress,
HttpClientTutorial.ProxyPort);
}
if (ByGet){
// Invocamos por GET
// ¿ Nos conectamos a un servidor seguro ?
// Observe que si están bien instalado JSSE (Java Secure Socket Extension),
//el código es exactamente igual
if (BySSL) {
request = new GetMethod(HttpClientTutorial.TargetURLSSL);
} else {
request = new GetMethod(HttpClientTutorial.TargetURL);
}
// Le indicamos que realize automáticamente el seguimiento de las redirecciones
// en caso de que existan.
request.setFollowRedirects(true);
// Añadimos los parámetros que deseemos a la petición
// GET: http://dominio/pagina?nombre=Carlos+Garc%C3%ADa
NameValuePair params[] = {new NameValuePair("nombre", "Carlos García")};
request.setQueryString(params);
} else {
// Invocamos por POST
request = new PostMethod(HttpClientTutorial.TargetURL);
// Añadimos los parámetros que deseemos a la petición
((PostMethod) request).addParameter("nombre", "Carlos García");
}
try {
// Si su servidor requiere autentificación necesitará una línea como la siguiente
if (Authenticate){
UsernamePasswordCredentials credentials = new
UsernamePasswordCredentials(UsernameCredentials, PasswordCredentials);
httpClient.getState().setCredentials(
new AuthScope(request.getURI().getHost(), 80, AuthScope.ANY_REALM), credentials);
// Indicamos que se autentifique si fuese requerido
request.setDoAuthentication(true);
}
// Indicamos reintente 3 veces en caso de que haya errores.
request.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, true));
// Añadimos las cabeceras personalizadas que se requieran, de la siguiente forma:
request.addRequestHeader("HeadKey", "HeadValue");
// Enviamos una cookie personalizada a las que el CookieManager ya tenga
httpClient.getState().addCookie(
new Cookie(request.getURI().getHost(), "nombreCookie", "valorCookie", "/", 3600, false));
// Leemos el código de la respuesta HTTP que nos devuelve el servidor
status = httpClient.executeMethod(request);
// Vemos si la petición se ha realizado satisfactoriamente
if (status != HttpStatus.SC_OK) {
System.err.println("Error\t" + request.getStatusCode() + "\t" +
request.getStatusText() + "\t" + request.getStatusLine());
} else {
// Leemos el contenido de la respuesta y realizamos el tratamiento de la misma.
// En nuestro caso, simplemente mostramos el resultado por la salida estándar
reader = new BufferedReader(
new InputStreamReader(request.getResponseBodyAsStream(), request.getResponseCharSet()));
line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
}
} catch (Exception ex){
System.err.println("Error\t: " + ex.getMessage());
ex.printStackTrace();
} finally {
// Liberamos la conexión. (También libera los stream asociados)
request.releaseConnection();
}
}
}
package autentia.tutoriales.httpClient;
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.params.HttpMethodParams;
import java.io.*;
/**
* Ejemplo del uso de Jakarta Commons HttpClient
* @author Carlos García. Autentia Real Business Solutions
* @see http://www.mobiletest.es
*/
public class HttpClientTutorial {
/**
* En caso de salir a Internet a tavés de un Proxy, se deberán modificar los siguientes parámetros
*/
public static final boolean byProxy = false;
public static final String ProxyAddress = "TuProxyAddress";
public static final int ProxyPort = 1234;
/**
* Direcciones que usamos para enviar peticiones
*/
public static final String TargetURLSSL = "https://www.verisign.com";
public static final String TargetURL = "http://www.autentia.es";
/**
* Por defecto haremos una petición HTTP GET. Cambiar a false para peticiones HTTP POST
*/
public static final boolean ByGet = true;
/**
* Si queremos hacer conectarnos a un servidor seguro via SSL poner a true la siguiente variable
*/
public static final boolean BySSL = false;
/**
* En caso de necesitar autentificacion con el servidor modificar los siguientes parámetros
*/
public static final boolean Authenticate = false;
public static final String UsernameCredentials = "TuUsuario";
public static final String PasswordCredentials = "TuPassword";
/**
* Punto de inicio de ejecución del ejemplo.
*/
public static void main(String[] args) {
HttpClient httpClient = null; // Objeto a través del cual realizamos las peticiones
HttpMethodBase request = null; // Objeto para realizar las peticiines HTTP GET o POST
int status = 0; // Código de la respuesta HTTP
BufferedReader reader = null; // Se usa para leer la respuesta a la petición
String line = null; // Se usa para leer cada una de las lineas de texto de la respuesta
// Instanciamos el objeto
httpClient = new HttpClient();
// Especificamos que salimos a través de un Proxy.
if (byProxy){
httpClient.getHostConfiguration().setProxy(HttpClientTutorial.ProxyAddress,
HttpClientTutorial.ProxyPort);
}
if (ByGet){
// Invocamos por GET
// ¿ Nos conectamos a un servidor seguro ?
// Observe que si están bien instalado JSSE (Java Secure Socket Extension),
//el código es exactamente igual
if (BySSL) {
request = new GetMethod(HttpClientTutorial.TargetURLSSL);
} else {
request = new GetMethod(HttpClientTutorial.TargetURL);
}
// Le indicamos que realize automáticamente el seguimiento de las redirecciones
// en caso de que existan.
request.setFollowRedirects(true);
// Añadimos los parámetros que deseemos a la petición
// GET: http://dominio/pagina?nombre=Carlos+Garc%C3%ADa
NameValuePair params[] = {new NameValuePair("nombre", "Carlos García")};
request.setQueryString(params);
} else {
// Invocamos por POST
request = new PostMethod(HttpClientTutorial.TargetURL);
// Añadimos los parámetros que deseemos a la petición
((PostMethod) request).addParameter("nombre", "Carlos García");
}
try {
// Si su servidor requiere autentificación necesitará una línea como la siguiente
if (Authenticate){
UsernamePasswordCredentials credentials = new
UsernamePasswordCredentials(UsernameCredentials, PasswordCredentials);
httpClient.getState().setCredentials(
new AuthScope(request.getURI().getHost(), 80, AuthScope.ANY_REALM), credentials);
// Indicamos que se autentifique si fuese requerido
request.setDoAuthentication(true);
}
// Indicamos reintente 3 veces en caso de que haya errores.
request.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(3, true));
// Añadimos las cabeceras personalizadas que se requieran, de la siguiente forma:
request.addRequestHeader("HeadKey", "HeadValue");
// Enviamos una cookie personalizada a las que el CookieManager ya tenga
httpClient.getState().addCookie(
new Cookie(request.getURI().getHost(), "nombreCookie", "valorCookie", "/", 3600, false));
// Leemos el código de la respuesta HTTP que nos devuelve el servidor
status = httpClient.executeMethod(request);
// Vemos si la petición se ha realizado satisfactoriamente
if (status != HttpStatus.SC_OK) {
System.err.println("Error\t" + request.getStatusCode() + "\t" +
request.getStatusText() + "\t" + request.getStatusLine());
} else {
// Leemos el contenido de la respuesta y realizamos el tratamiento de la misma.
// En nuestro caso, simplemente mostramos el resultado por la salida estándar
reader = new BufferedReader(
new InputStreamReader(request.getResponseBodyAsStream(), request.getResponseCharSet()));
line = reader.readLine();
while (line != null) {
System.out.println(line);
line = reader.readLine();
}
}
} catch (Exception ex){
System.err.println("Error\t: " + ex.getMessage());
ex.printStackTrace();
} finally {
// Liberamos la conexión. (También libera los stream asociados)
request.releaseConnection();
}
}
}
Ventajas e inconvenientes
Las principales características son:
- Administración automática de Cookies.
- Seguimiento automático de redirecciones.
- Cancelación de peticiones en curso.
- Soporte de gzip para ahorrar ancho de banda en nuestra comunicaciones.
- Administrador de conexiones multihilo para poder tener varias tareas simultaneas en curso. (Descargarnos dos aplicaciones al mismo tiempo, por ejemplo)
- Manejo automático de SSL
- Logs de la información que se envía o recibe: Cabeceras enviadas/recibidas, Cookies, etc. (Muy útil para determinadas aplicaciones o para depuraciones).
- Pool de conexiones para poder reutilizar conexiones sin tener que abrirlas o cerrarlas constantemente.
Lo hace el API, según los parámetros de configuración que se le especifiquen. Por ejemplo, que se cierren automáticamente las conexiones que lleven 2 minutos sin ser usadas.
- Poder subir ficheros vía POST sin tener que cargar en memoria en memoria la información que se desea subir.
Requisitos e incompatibilidades
- Es necesario tener instalado el JDK 1.3 o superior.
- Se encuentre la librería Commons Logging en el proyecto.
- Es necesario incorporar la librería commons-codec.jar