Es muy común que mientras estamos programando algún script nos encontremos con la necesidad de realizar una petición a alguna
página web ó a una
web api para obtener información de ella, en Java tenemos varias soluciones a este problema, las librerías nativas de Java nos ofrecen la librería
java.net, pero en esta ocasión trataremos una librería externa creada por
Apache llamada
HttpComponents Client.
Como es común con los productos de Apache tienen muy buena documentación, pero en este post trataré de explicarlo de una manera más sencilla.
La librería puede obtenerse por
descarga directa o por el
repositorio de Maven.
Petición GET
Para comenzar creamos una clase llamada
Peticiones para poner ahí los métodos que usaremos para crear las peticiones, inicialmente haremos una petición GET a example.com e imprimiremos el resultado en consola, para ello creamos un método de tipo
String llamado
httpGetSimple que llevará como argumento la url.
Para realizar una petición simple necesitamos una instancia de
HttpClient, que como su nombre lo indica es el cliente para realizar las peticiones al que podemos agregar una configuración, por ahora no lo haremos entonces instanciaremos con
createDefault.
HttpClient httpClient = HttpClients.createDefault();
Luego instanciaremos un
HttpGet que es el que contendrá nuestra petición en cuestión.
HttpGet httpGet = new HttpGet(url);
Ahora declararemos un
HttpResponse en que almacenaremos la respuesta de la petición, y con el método
execute del cliente para obtenerla.
HttpResponse httpResponse = httpClient.execute(httpGet);
Finalmente el HTML de la respuesta la obtenemos con la ayuda de
EntityUtils con su método
toString.
String source = EntityUtils.toString(httpResponse.getEntity());
Quedando sí nuestro código.
public String httpGetSimple(String url){
String source = null;
HttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
source = EntityUtils.toString(httpResponse.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
return source;
}
Ahora creamos una instancia en nuestro
main a la clase
Peticiones y ejecutamos
httpGetSimple para imprimirlo, así:
public static void main(String[] args) {
Peticiones peticiones = new Peticiones();
System.out.println(peticiones.httpGetSimple("http://www.example.com/"));
}
Y nos devuelve:
Petición POST
Aquí configuraremos el cliente de la misma forma y aunque en este caso podríamos usar la clase
HttpPost, usaremos
RequestBuilder.
Primero crearemos un método llamado
httpPostSimple que llevará como argumentos la url y otro con argumentos ilimitados para recibir los parámetros.
public String httpPostSimple(String url, NameValuePair...parametros){
}
NameValuePair es la clase usada por la librería para guardar parametros para las peticiones, su uso es de la siguiente manera:
NameValuePair valuePair = new BasicNameValuePair("nombre", "valor");
Creamos una instancia del RequestBuilder de la siguiente manera:
RequestBuilder requestBuilder = RequestBuilder.post().setUri(url);
Ahora pasamos los parámetros al builder y luego "buildeamos" en una
HttpUriRequest
for(NameValuePair parametro:parametros)
requestBuilder.addParameter(parametro);
HttpUriRequest uriRequest = requestBuilder.build();
Luego ejecutamos la petición de la misma manera que en la vez anterior:
try {
HttpResponse httpResponse = httpClient.execute(uriRequest);
source = EntityUtils.toString(httpResponse.getEntity());
} catch (IOException e) {
e.printStackTrace();
}
Ahora probemos su funcionamiento en nuestra clase main, enviaremos la petición a un script en php que imprimirá los parametros que reciba.
public static void main(String[] args) {
Peticiones peticiones = new Peticiones();
NameValuePair parametro = new BasicNameValuePair("nombreParametro", "miValor");
System.out.println(peticiones.httpPostSimple("http://localhost/Prueba01.php", parametro));
}
Y nos devuelve esto:
CookieStore
Si queremos añadir una cookie antes de una petición o almacenar u obtener las cookies luego de alguna petición podemos usar la cookie store que nos ofrece esta librería, su uso:
BasicCookieStore cookieStore = new BasicCookieStore();
HttpClient httpClient = HttpClients.custom().setDefaultCookieStore(cookieStore).build();
Añadir cookie:
Cookie cookie = new BasicClientCookie("nombre", "valor");
cookieStore.addCookie(cookie);
Obtener cookies:
List< Cookie> cookies = cookieStore.getCookies();
for(Cookie cookie: cookies)
System.out.println(cookie.getName() + ":" + cookie.getValue());
Configuración
Estas peticiones también nos permiten configurar otras cosas como timeouts, proxys, máximas redirecciones, etc.
Su uso:
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(8000).build();
requestBuilder.setConfig(requestConfig);
Aquí usamos
setConnectTimeOut para establecer en milisegundos el tiempo máximo que esperara la petición para conectarse al servidor.
Podemos usar muchos otros métodos de configuración que puedes ver
aquí.
Esto es todo por este POST, saludos!