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!