1. Vue d'ensemble de l'accès HTTP sous Android▲
1-1. API disponibles▲
Android contient le paquetage réseau standard de Java, java.net, qui peut être utilisé pour accéder aux ressources réseau. Android contient également la bibliothèque Apache HttpClient.
La classe de base pour l'accès HTTP dans le paquetage java.net est la classe HttpURLConnection.
La façon privilégiée d'accéder à Internet selon Google est la classe HttpURLConnection, puisque Google concentre ses efforts pour améliorer cette mise en œuvre.
1-2. Autorisations requises▲
Pour accéder à Internet, votre application nécessite l'autorisation android.permission.INTERNET.
Pour vérifier l'état du réseau, votre application nécessite l'autorisation android.permission.ACCESS_NETWORK_STATE.
2. Le « mode strict » Android▲
Dans une application Android, vous devriez éviter d'effectuer des opérations de longue durée sur le fil d'exécution de l'interface utilisateur. Cela inclut l'accès aux fichiers et au réseau.
StrictMode permet d'établir des politiques dans votre application afin d'éviter de faire des choses incorrectes. Ainsi, StrictMode d'Android 3.0 (Honeycomb) est configuré pour s'arrêter avec une exception NetworkOnMainThreadException, si l'accès réseau s'effectue dans le fil d'exécution de l'interface utilisateur.
Si vous ciblez Android 3.0 ou supérieur, vous pouvez désactiver l'accès réseau effectué dans une tâche d'arrière-plan, via le code suivant, au début de la méthode onCreate() de votre activité.
StrictMode.ThreadPolicy policy =
new
StrictMode.
ThreadPolicy.Builder
(
).permitAll
(
).build
(
);
StrictMode.setThreadPolicy
(
policy);
Cette désactivation est déconseillée, mais dans ce tutoriel nous utilisons cette option pour être en mesure d'expliquer l'accès réseau, indépendamment des processus d'arrière-plan.
3. HttpURLConnection▲
HttpURLConnection, qui est également disponible dans la norme Java, est un client HTTP léger à usage général, approprié pour la plupart des applications.
Dans la dernière version, HttpURLConnection supporte la compression transparente de réponse (via l'en-tête Accept-Encoding : gzip),Server Name Indication (extension de SSL et TLS) et un cache de réponse.
L'API est relativement simple. Par exemple, pour récupérer la page Web www.vogella.com.
// Quelque part dans votre code, ceci est appelé
// dans un fil d'exécution qui n'est pas celui
// de l'interface utilisateur
try
{
URL url =
new
URL
(
"http://www.vogella.com"
);
HttpURLConnection con =
(
HttpURLConnection) url
.openConnection
(
);
readStream
(
con.getInputStream
(
));
}
catch
(
Exception e) {
e.printStackTrace
(
);
}
private
void
readStream
(
InputStream in) {
BufferedReader reader =
null
;
try
{
reader =
new
BufferedReader
(
new
InputStreamReader
(
in));
String line =
""
;
while
((
line =
reader.readLine
(
)) !=
null
) {
System.out.println
(
line);
}
}
catch
(
IOException e) {
e.printStackTrace
(
);
}
finally
{
if
(
reader !=
null
) {
try
{
reader.close
(
);
}
catch
(
IOException e) {
e.printStackTrace
(
);
}
}
}
}
La Javadoc suggère de ne pas réutiliser HttpURLConnection. Si vous l'utilisez de cette façon, HttpURLConnection ne posera pas de problèmes de concurrence d'accès, car elle ne sera pas partagée entre les différents fils d'exécution.
4. Vérifiez la disponibilité du réseau▲
Évidemment, le réseau n'est pas toujours disponible sur un appareil Android. Vous pouvez vérifier s'il l'est avec le code suivant.
public
boolean
isNetworkAvailable
(
) {
ConnectivityManager cm =
(
ConnectivityManager)
getSystemService
(
Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo =
cm.getActiveNetworkInfo
(
);
// si aucun réseau n'est disponible, networkInfo sera null
// sinon, vérifier si nous sommes connectés
if
(
networkInfo !=
null
&&
networkInfo.isConnected
(
)) {
return
true
;
}
return
false
;
}
Ceci nécessite l'autorisation ACCESS_NETWORK_STATE.
5. Proxy▲
Ce chapitre vous concerne uniquement si vous testez le simulateur Android derrière un proxy. Vous pouvez configurer le proxy via la classe Settings. Par exemple, vous pouvez ajouter la ligne suivante à votre méthode onCreate dans votre activité.
Settings.System.putString
(
getContentResolver
(
), Settings.System.HTTP_PROXY, "myproxy:8080"
);
Pour modifier les paramètres du proxy, vous devez avoir l'autorisation android.permission.WRITE_SETTINGS dans votre fichier AndroidManifest.xml.
Il semble que la résolution DNS ne fonctionne pas derrière un proxy. Voir le bogue 2764.
6. Liens et littérature▲
7. Remerciements▲
Vous pouvez retrouver l'article original à l'adresse Android HTTP Access - Tutorial. Nous remercions Lars Vogel qui nous a aimablement autorisés à traduire et héberger ses articles.
Nous remercions aussi Mishulyna pour sa traduction, ainsi que Jacques THÉRY pour sa relecture orthographique.