Java DefaultHttpClient con autenticazione base

By | 4 January 2011

Uno dei compiti più comuni che incontriamo durante la fase di sviluppo di una applicazione è quella di realizzare un client http. A volte, inoltre, non dobbiamo solo effettuare una richiesta via http in get o in post, ma abbiamo anche la necessità che la nostra richiesta sia autenticata.  Un tipo di autenticazione che possiamo incontrare si chiama Apache Basic Authentication. Questa tipo di autenticazione è molto semplice perché consiste nell’inviare al server una coppia di utente e password in chiaro.
La classe Java DefaultHttpClient ci permette di fare una richiesta http via get/post con questo tipo di autenticazione. Questa classe non è inclusa nel SDK Java standard, ma fa parte del pacchetto (package) di librerie chiamato Apache HttpComponents.

Possiamo avere maggiori informazioni riquardo a questo package qui:
httpd.apache.org/docs/2.0/howto/auth.html.

Vediamo di seguito un esempio del suo utilizzo.


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.CoreConnectionPNames;

public class HttpAuthRequest
{
	public static void main(String[] args)
	{
		DefaultHttpClient client = null;

		try
		{
			// Set url
			URI uri = new URI("http://yourdomain.com/yourpage?yourparamname=yourparamvalue");

			client = new DefaultHttpClient();

			client.getCredentialsProvider().setCredentials(
					new AuthScope(uri.getHost(), uri.getPort(),AuthScope.ANY_SCHEME),
					new UsernamePasswordCredentials("youruser", "yourpass"));

			// Set timeout
			client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);
			HttpGet request = new HttpGet(uri);

			HttpResponse response = client.execute(request);
			if(response.getStatusLine().getStatusCode() == 200)
			{
				InputStream responseIS = response.getEntity().getContent();
				BufferedReader reader = new BufferedReader(new InputStreamReader(responseIS));
				String line = reader.readLine();
				while (line != null)
				{
					System.out.println(line);
					line = reader.readLine();
				}
			}
			else
			{
				System.out.println("Resource not available");
			}
		}
		catch (URISyntaxException e)
		{
			System.out.println(e.getMessage());
		}
		catch (ClientProtocolException e)
		{
			System.out.println(e.getMessage());
		}
		catch (ConnectTimeoutException e)
		{
			System.out.println(e.getMessage());
		}
		catch (IOException e)
		{
			System.out.println(e.getMessage());
		}
		catch (Exception e)
		{
			System.out.println(e.getMessage());
		}
		finally
		{
			if ( client != null )
			{
				client.getConnectionManager().shutdown();
			}
		}
	}
}

Per realizzare questo esempio è necessario includere questi file jar nel nostro progetto:

Questo è tutto!
Buona fortuna!