Séance 1 : prise en main§
Pierre-Antoine Champin & Michael Mrissa
Département Informatique, IUT Lyon 1Ce travail est sous licence Creative Commons Attribution-ShareAlike 3.0 France.
Pierre-Antoine Champin & Michael Mrissa
Département Informatique, IUT Lyon 1Ce travail est sous licence Creative Commons Attribution-ShareAlike 3.0 France.
Comment faire pour intégrer dans votre application :
?
Note
Comment feriez-vous pour le faire à la main?
Aller chercher l’information sur le Web.
HTTP est basé sur l’échange de messages…:
Chaque échange est indépendant des autres (messages auto-suffisants).
GET /france/lyon HTTP/1.1
Host: meteo.example.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686;
fr; rv:1.9.1) Gecko/20090624 Firefox/3.5
Accept: text/html,application/xhtml+xml,
application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Connection: keep-alive
Keep-Alive: 300
(pas de contenu)
POST /passer-commande HTTP/1.1
Host: marchand.example.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686;
fr; rv:1.9.1) Gecko/20090624 Firefox/3.5
Accept: text/html,application/xhtml+xml,
application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: UTF-8,*
Connection: keep-alive
Keep-Alive: 300
Content-Type: application/x-www-form-urlencoded
Content-Length: 12345
nom=PA+Champin&addresse=12+rue+Turing&articles=...
HTTP/1.x 200 OK
Date: Mon, 02 Jan 2016 22:46:26 GMT
Server: Apache/2
Accept-Ranges: bytes
Content-Type: text/html; charset=utf-8
Content-Length: 29794
Etag: "7462-477341dcfb940;89-3f26bd17a2f00"
Last-Modified: Mon, 02 Jan 2016 12:00:00 GMT
Content-Location: Home.html
Vary: negotiate,accept
Cache-Control: max-age=600
Expires: Mon, 02 Nov 2009 22:56:26 GMT
Connection: close
<!DOCTYPE html>
<html><head><title>Météo de Lyon</title>
...
HTTP/1.x 303 See also
Date: Mon, 02 Jan 2016 22:46:26 GMT
Server: Apache/2
Accept-Ranges: bytes
Location: /commande/12345
Connection: close
(pas de contenu)
HTTP/1.x 404 Not Found
Date: Mon, 02 Jan 2016 22:46:26 GMT
Server: Apache/2
Content-Type: text/html; charset=utf-8
Content-Length: 2979
Connection: close
<!DOCTYPE html>
<html><head><title>Cette ressource n'existe pas</title>
...
HTTP définit 40 codes de statut, répartis en cinq catégories :
Catégorie | Exemple |
---|---|
1xx : Information | 100 Continue |
2xx : Succès | 200 OK |
3xx : Redirection | 301 Moved Permanently |
4xx : Erreur client | 404 Not Found, 401 Unauthorized |
5xx : Erreur serveur | 500 Internal Server Error |
Ces catégories améliorent l’interopérabilité: une bibliothèque HTTP pourra par exemple décider de lancer une exception lorsqu’un code 4xx ou 5xx est reçu.
Note
Notez que ce n’est pas le cas de la bibliothèque standard de Java, que nous utilisons dans la suite.
// préparation de la requête
URL url = new URL("http://httpbin.org/");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET"); // facultatif : c'est GET par défaut
conn.addRequestProperty("Accept-language", "fr");
// définition d'autres en-têtes, au besoin...
// envoi de la requête
conn.connect();
// exploitation de la réponse
int status = conn.getResponseCode();
String contentType = conn.getHeaderField("content-type");
InputStream bodyStream = conn.getInputStream();
BufferedReader bodyReader =
new BufferedReader(new InputStreamReader(bodyStream));
String line = bodyReader.readLine();
while (line != null) {
doSomethingWith(line);
line = bodyReader.readLine();
}
L’objectif de ce TP est d’écrire une classe qui, étant donnée une page Web, vérifie l’état de tous les liens contenus dans cette page (y compris les images, les feuilles de styles, etc.) et compte combien de ces liens sont valides, brisés ou non-HTTP.
Pour réaliser ce travail, clonez ce dépôt git,
et complétez la classe LinksChecker
.
La classe TestTP1
contient un jeu de test
qui vous permet de vérifier la conformité de votre implémentation.
Note
La classe TestTP1
utilise notamment cette page,
qui contient un échantillon représentatif des types de liens que doit pouvoir gérer votre programme.
De nombreux liens présents sur une page HTML sont des liens relatifs.
La classe URL
permet heureusement de construire une URL absolue,
à partir d’une URL de base (URL
) et d’un lien relatif (String
) :
URL lienAbsolu = new URL(base, lienRelatif);
Pour extraire les URLs des liens,
on pourra utiliser l”expression régulière suivante :
(src|href)\s*=\s*["']([^"']*)["']
String htmlCode = "(...)";
Pattern regex = Pattern.compile(
"(src|href)\\s*=\\s*[\"']([^\"']*)[\"']");
Matcher matcher = regex.matcher(htmlCode);
while (matcher.find()) {
test_link(matcher.group(2));
}
Sur le réseau de l’université, il peut être nécessaire de rediriger vos requêtes HTTP à travers un serveur appelé proxy.
Pour ce faire,
vous devez créer une instance de java.net.Proxy
et la passer en paramètre de openConnection
comme ci-dessous:
Proxy proxy = new Proxy(Proxy.Type.HTTP,
new InetSocketAddress("proxy.univ-lyon1.fr", 3128));
conn = url.openConnection(proxy);