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
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");
public boolean sameFile(URL other)
public boolean equals(Object other)
public URLConnection openConnection() throws IOException
URLConnection connexion = url1.openConnection() ;
public final Object getContent () throws IOException
openConnection().getContent()
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);
}
}
}
public void setRequestProperty(String key, String value)
public long getIfModifiedSince() ...
public abstract void connect() throws IOException
public Object getContent() throws IOException
public InputStream getInputStream() throws IOException
public OutputStream getOutputStream() throws IOException
int len = connexion.getContentLength();
InputStream input = connexion.getInputStream();
for(;len != 0; len--)
{
System.out((char)input.read());
} <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>|
© 2001 IsepFAQtory Tous droits réservés
|