Bas de page
Page précédente Sommaire Page suivante
Bas de page

IV) LES API JAVA

7) Le protocole HTTP

Le protocole de transfert d'information, appelé HTTP, est un protocole très simple, très semblable aux protocoles
FTP ou NNTP. Le World Wide Web utilise ce protocole afin d'établir une requête sur une machine. Le client
HTTP envoie l'adresse d'un document, avec ou sans mots de recherche et le serveur répond en transférant des
documents en HyperTexte ou en texte. Des extensions sont implantées pour permettre des demandes plus
élaborées avec des formats de négociation. Le protocole tourne sur TCP, utilisant une connexion par demande de
document.

Cette communication se passe en général au-dessus d'une connexion TCP, le port par défaut est le port 80. Quoi
qu'il en soit, HTTP requiert uniquement que le protocole sous-jacent soit sûr.

Plusieurs version du protocole HTTP coexistent sur Internet. Il y a le protocole HTTP 1.0 (RFC 1945) qui est
maintenant obsolète coté serveur mais quand même maintenu coté client (IE 2.0, Netscape 1.0). Le protocole
actuellement utilisé sur Internet est le protocole HTTP 1.1 (RFC 2068) qui permet notamment le multi-hosting
coté adresses IP et coté nom de machines. L'échange des données est basé sur MIME (RFC 1521). Le port par
défaut est le port 80 (il s'agit donc là d'un service considéré comme service système, bien qu'il soit possible de
l'avoir sur la plate-forme de votre choix). Les commandes principales sont :

GET url HTTP/1.0
HEAD url HTTP/1.0
POST url HTTP/1.0


Avec les extensions possibles :

PUT url HTTP/1.0
DELETE url HTTP/1.0
...


Les codes de retour classiques sont :

200 OK
210 Created
202 Accepted
204 No Content
310 Moved Permanently
404 Not Found
...
500 Server Internal Error
503 Service Unavailable



7-1-1) Implémentation d'un GET en utilisant les sockets BSD

String get(String host, int port, String file)
throws IOException
{
Socket s = new Socket(host, port);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
PrintWriter out = new PrintWriter(os);
// Sends the request
out.print("GET " + file + " HTTP/1.0");
out.print((char) 13); out.print((char) 10);
out.print((char) 13); out.print((char) 10);
out.flush();
// Read the answer
int n;
byte[] buffer = new byte[4096];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((n = is.read(buffer)) != -1)
{
bos.write(buffer, 0, n);
}
is.close();
out.close();
s.close();
return bos.toString();
}


7-1-2) Implémentation d'un POST

String post(String host, int port, String script, String[] arg n,
String[] argv)
throws IOException
{
Socket s = new Socket(host, port);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
PrintWriter out = new PrintWriter(os);
out.print("POST " + script + " HTTP/1.0");
out.print((char) 13); out.print((char) 10);
StringBuffer params = new StringBuffer();
for (int i = 0 ; i < argn.length ; ++i)
{
if (i > 0) { params.append("&"); }
params.append(argn[i] + "=" +
URLEncoder.encode(argv[i]));
}
out.print("Content-Length: " + params.length());
out.print((char) 13); out.print((char) 10);
out.print((char) 13); out.print((char) 10);
out.println(params.toString());
out.flush();
int n;
byte[] buffer = new byte[4096];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while ((n = is.read(buffer)) != -1)
{
bos.write(buffer, 0, n);
}
is.close();
out.close();
s.close();
return bos.toString();
}


7-2) Les URI

Les Uniform Resource Identifer (URI) permettent de rechercher des ressources sur tout type de réseau dont la
topologie est similaire à celle d'Internet. Les URI se décomposent en deux types de ressources : les Uniform
Resource Locator et les Uniform Resource Name.

Une URL correspond à un pointeur sur un objet situé quelque part sur le réseau Internet. Il s'agit d'un ensemble
d'informations qui identifie un élément, indiquant où le trouver et une méthode de communication pour y
accéder. Une URL peut faire référence à n'importe quelle source d'information. Une URL est généralement
présentée sous la forme d'une chaîne de caractères, comme une adresse. Etant donné qu'il existe beaucoup de
manières de trouver un élément sur le réseau Internet et que plusieurs systèmes de transport existent, il y a
plusieurs formats différents pour les URL. La plus répandue spécifie quatre éléments :

_Le protocole
_Le nom de la machine
_Le chemin de l'élément
_L'élément lui-même

Ce qui donne la syntaxe suivante, protocole://NomDeLaMachine/Chemin/Element. Le protocole est
un identifiant comme http, ftp. Le nom de la machine correspond à un nom de machine reliée à Internet. Le
chemin et l'élément sont le chemin d'accès de l'objet ainsi que son nom. Des variantes de cette forme sont
possibles, comme l'ajout d'un numéro de port et certains identifiants pour accéder à des parties de l'objet.
L'ensemble du Chemin et de Element constitue ce que l'on appelle l'URI.

7-2-1) Les URL de Java


7-2-1-1) La classe URL

Cette classe propose une interface de haut niveau pour accéder aux informations du Web en utilisant des URL.
Pour créer un objet de la classe URL nous disposons de quatre constructeurs :

Les trois URL suivantes représentent la même ressource.

new URL("http://www.de3i.gfi-info.fr/index.html");
new URL("http","www.de3i.gfi-info.fr",80,"index.html");
new URL("http://www.de3i.gfi-info.fr/","index.html");


Les méthodes suivantes permettent de comparer deux URL en incluant ou non l'ancre:

public boolean sameFile(URL other)

public boolean equals(Object other)

Pour manipuler les composant de l'URL un ensemble de méthodes est proposé :
_public String getProtocol() :
retourne le protocole ;
_public String getHost() :
retourne le nom de la machine ;
_public int getPort() :
retourne le numéro de port ;
_public String getFile() :
retourne la partie fichier ;
_public String getRef() :
retourne la référence ou ancre dans le fichier ;
_public String toExternalForm() :
retourne la forme canonique de l'URL.
Une fois l'objet URL construit, pour accéder aux informations contenues dans l'URL, il faut construire un objet
URLConnection en utilisant la méthode :

public URLConnection openConnection() throws IOException

Cette méthode crée (si elle n'existe pas déjà) un objet permettant de créer une connexion vers la ressource référée
par l'URL. Cette méthode invoque le bon gestionnaire de protocole (http par exemple).

Exemple :

URLConnection connexion = url1.openConnection() ;

Il est possible si l'on ne désire pas d'informations sur l'objet contenu de le récupérer directement avec la
méthode :

public final Object getContent () throws IOException

qui est un raccourcis pour :

openConnection().getContent()

Exemple :

public class Url
{
public static void main(String[] argv)
{
try
{
URL url = new URL("http://gfi-info.fr/);
String Object texte = (String) url.getContent();
System.out.println(texte);
}
catch(MalformedURLException e)
{
System.out.println(e);
}
catch(IOException e)
{
System.out.println(e);
}
}
}


7-2-1-2) La Classe URLConnection

Cette classe est une classe abstraite qui propose une interface simple pour manipuler les entêtes et le contenu
d'une connexion via une URL, commune à tout les gestionnaire de protocole. Un objet de cette classe est
construit par l'appel à la méthode openConnection() sur un objet de la classe URL.

La première chose à faire consiste à spécifier les entêtes de requêtes au moyen de la méthode suivante :

public void setRequestProperty(String key, String value)

D'autres méthodes raccourcis sont disponibles :

public long getIfModifiedSince() ...

Il faut ensuite ouvrir la connexion et parser les entêtes de réponse au moyen de la méthode :

public abstract void connect() throws IOException

Il est alors possible de récupérer chacune des entêtes par une des méthodes suivantes :
_public String getHeaderField(String name) :
retourne l'entête dont le nom est passé en paramètre si elle est présente et null sinon ;
_public int getHeaderFieldInt(String name, int default) ;
_public long getHeaderFieldDate(String name,long default) ;
_public String getHeaderFieldKey(int n) ;
_public String getHeaderField(int n).
Les méthodes suivantes sont des raccourcis pour les entêtes les plus courantes :
_public int getContentLength () ;
_public String getContentType () ;
_public long getDate () ;
Pour récupérer le contenu du document il suffit d'utiliser la méthode :

public Object getContent() throws IOException

D'autres interactions de plus bas niveau sont également possibles en récupérant les flux d'entrée et de sortie sur la
connexion.

public InputStream getInputStream() throws IOException
public OutputStream getOutputStream() throws IOException


Exemple :

int len = connexion.getContentLength();
InputStream input = connexion.getInputStream();
for(;len != 0; len--)
{
System.out((char)input.read());
}


7-3) HyperTexte et HyperMédia

Un document HyperTexte est un fichier de texte normal contenant des « mots » spéciaux appelés liens. Les liens
se font entre différentes parties de documents HyperTexte, le document source pouvant adresser des parties de
son contenu en destination. Ces documents peuvent être situés sur le même ordinateur mais aussi peuvent être
présents sur un serveur (www, ftp, GOPHER,...). Le terme HyperTexte a été introduit par Ted Nelson en 1965.
Un document HyperMédia n’est autre qu’un document HyperTexte à cette différence près que les liens peuvent
référencer autre chose que du texte. Sons, images, vidéo ont maintenant leurs standards sur le Web.
Le langage standard utilisé sur le WWW pour créer et reconnaître les documents HyperMédia ainsi que leurs
contenus est le HTML.

Le HTML est un langage qui correspond à un certain type de format de documents. Les fichiers HTML (aux
extensions en HTM ou HTML) sont des fichiers textes incluant des balises qui correspondent à des codes de
formatage indiquant aux différents arpenteurs, comment afficher le texte, positionner les images ou les
formulaires et comment réaliser les liens HyperTexte.

Le HTML est basé sur une structure de balises. L'arpenteur sait comment il doit interpréter le texte situé entre
deux balises. La première balise est toujours <HTML> et la dernière </HTML> car ce sont elles qui délimitent la
page HTML.

Les éditeurs de pages HTML sont nombreux, néanmoins il convient de citer les deux références en la matière
DreamWeaver (MacroMedia) et HomeSite (Allaire). Ces éditeurs permettent de créer des pages HTML de
manière complètement visuelle (comme sous un traitement de texte évolué), ceci permet d’éviter l’utilisation, peu
confortable, d’un simple éditeur de texte.

Voici un exemple qui recouvre les grandes lignes de la syntaxe HTML il ne fonctionne évidemment pas, mais
vous pouvez le copier dans un fichier texte que vous appellerez <NOM_DESIRE>.html ; puis le lire à l'aide d'un
arpenteur pour voir comment cela fonctionne :

<HTML>
<HEAD>
<TITLE>Test page HTML </TITLE><BR>
<IMG ALIGN="TOP" SRC="/PICTURE/IMAGE.GIF">
</HEAD>
<BODY>
<H1>L'image n'a pas été trouvée</H1>
<H3>Ceci est une page destinée à tester des CGI pour en comprendre le
fonctionnement</H3>
<H4>Objectifs de cette page HTML :</H4>
<UL COMPACT>
<LI> Passer un ordre de commande depuis un arpenteur quelconque.
<LI> Executer l'ordre sur le serveur.
<LI> Retourner le résultat à l'opérateur sous forme d'une page
HTML.
</UL>
<P>Cette adresse n'existe pas, mais <A HREF = "UNKNOWN.HTM">cliquez</A>
quand même.
<FORM METHOD = "POST" ACTION = "http://ADDRESS/CGI-BIN/HELLO.EXE">
Argument <INPUT ARG = "user" SIZE="30"><P>
Ce bouton tente d'exécuter une application CGI avec passage d'arguments.
<INPUT TYPE = SUBMIT VALUE = "Appuyez">
</FORM>
<CENTER>
<FORM METHOD = "POST"
ACTION="http://ADDRESS/CGI-BIN/HELLO_2.EXE">
<SELECT size=5 NAME = "goto">
<option>Yahoo
<option>Netscape
<option>Infoseek
<option>Microsoft
<option>Lycos
<option>RVP
</SELECT><p>
<INPUT TYPE = "SUBMIT"
VALUE = "Aller à">
</FORM>
</CENTER>
<HR width=80%>
<ADDRESS>Auteur : Olivier DE PERTAT</ADDRESS>
</BODY>
</HTML>


Remarque : l'emploi en HTML de majuscules est facultatif.

Ce code est relativement simple, cependant le bouton créé dans les balises FORM mérite une étude plus
approfondie. En effet, en quelques lignes nous définissons une communication avec un serveur avec : un contenu
(le cartouche « user » de 30 caractères de long), un format de donnée (POST) et un destinataire pour ces
informations (l’URL : « http://ADDRESS/CGI-BIN/HELLO.EXE »).

Avec ce cartouche et ce bouton, nous introduisons une nouvelle notion dans les documents HTML, l’interactivité.
Ici pour obtenir un peu d’interactivité, nous utilisons CGI.

L'emploi des CGI se fait dans la balise FORM. On y remarque l'emploi d'une méthode, ici POST, qui peut être de
type POST ou GET. Ces deux méthodes sont détaillées ci-dessous.

L’action est déclenchée par activation du bouton (SUBMIT) de la FORM qui vient d’être créée, l'arpenteur se
connecte alors à l’URL désignée dans la page HTML. Cette dernière est appelée avec un passage d’argument. La
connexion à l’URL va provoquer l’exécution d’un script ou d’un code compilé dans un répertoire prévu à cet
effet. L’application CGI, ici un exécutable C, s’exécute puis renvoie sur la sortie standard un flux de caractères
au format d’une page HTML qui apparaît dans l'arpenteur du client.
Haut de page
Page précédente Sommaire Page suivante
Haut de page
Contactez-nous
Conditions d'utilisation
Qui sommes nous?
© 2001 IsepFAQtory Tous droits réservés