//Dans la suite de mes tutos sur le HTTP, voici l'arme ultime : /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++ + The POSTman v1 par sirius_black + + No licence, Open Source, GPL et tout ce qu'on veut :) + +++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ import java.net.*; //on charge les librairies réseau pour avoir le type Socket et le type URL import java.io.*; //on charge les Entrées/Sorties standards pour pouvoir utiliser les différents flux (Stream) public class HttpClient{ //On déclare une classe HttpClient qui possède son propre point d'entrée URL url; //On déclare une variable de type URL qui nous permettra de décomposer une URL Socket socket; //Notre Socket String texte; //String qui récupérera le résultat de notre requête String req; //La String qui contiendra notre requête int port; //le port HTTP (généralement 80) InputStream input; //InputStream et OutputStream sont les flux de base. Ils ne peuvent pas être instancié OutputStream output; // (pas de new()) car ce sont des classes dites 'abstraites'. BufferedReader breader; // Les classes Buffered* sont des classes filles des classes InputStream* et OutputStream* // elles même filles de InputStream et OutputStream BufferedWriter bwriter; public static void usage() //On arrive ici si il n'y a pas le bon nombre d'arguments { System.out.println("Usage: java HttpClient complete_URL [headers_to_send]"); System.out.println("\tcomplete_URL must look like:"); System.out.println("\thttp://host/page.ext?variable1=value1&variable2=value2"); System.out.println("\n\theaders_to_send must look like:"); System.out.println("\thead1:value1&head2:value2"); System.exit(0); //On quitte // Le programme sert à transformer une méthode GET en méthode POST. On l'utilise de cette façon : // java HttpClient http://www.google.fr/main/index.php?login=toto&pass=titi Referer:http://membres.lycos.fr/lotfree&User-Agent:POSTman1 } public void sendReq() //la fonction qui enverra nos données { try{ req=req.concat("\r\n"+url.getQuery()+"\r\n\r\n"); //on ajoute les variables à la requête System.out.println("--------------------Requête-------------------"); System.out.println(req); //on l'affiche output.write(req.getBytes()); // on envoie notre requête sous la forme d'une suite de Byte à notre // flux de sortie lié à notre socket texte=new String(); // l'allocation ne se fait pas obligatoirement dans le constructeur texte=breader.readLine(); //Le type BufferedReader permet de faire une lecture ligne après ligne while(texte!=null){ //tant que ya de quoi lire on lit System.out.println(texte); //et on l'affiche texte=breader.readLine(); //c ici kon lit } } catch(IOException ex){ System.out.println(System.err); } } //ya une belle surcharge du constructeur par là :) public HttpClient(String param1,String param2) //Le constructeur avec deux arguments : URL_avec_données et headers { this(param1); //On fait appel au constructeur avec un seul argument (toujours appeler en premier dans ce cas) param2=param2.replaceAll("&","\r\n"); //On découpe les headers avec le '&' comme spérarateur req=req.concat(param2+"\r\n"); } public HttpClient(String param) //Constructeur appelé dans tous les cas (param= URL_avec_données) { try{ url=new URL(param); //On transforme la String passée en argument en une variable de type URL qui nous permettra de récupérer // nom d'hôte, déterminer le port, récupérer les arguments, le chemin de la page sur le serveur etc // /!\ Attention : l'URL passée en argument doit commencer par 'http://' System.out.println("Host: "+url.getHost()); //On affiche les données trouvées if(url.getPort()==-1)port=80; //Si le port n'est pas spécifié, on prend le 80 par défaut else port=url.getPort(); System.out.println("Port: "+port); System.out.println("Path: "+url.getPath()); System.out.println("Query: "+url.getQuery()); socket=new Socket(url.getHost(),port); // Constructeur de la Socket : Socket(String host,int port) input=socket.getInputStream(); //On lie un flux d'entrée à notre Socket (pas de new car classe InputStream abstraite) breader=new BufferedReader(new InputStreamReader(input)); // A partir du Stream de base on crée un InputStreamReader à partir duquel on crée un BufferedReader //Pareil avec les flux de sortie. Il n'est pas rare de voire ce genre de constructions en Java output=socket.getOutputStream(); bwriter=new BufferedWriter(new OutputStreamWriter(output)); //La requête POST est formée selon le standard HTTP/1.1 req=new String("POST /"+url.getPath()+" HTTP/1.1\r\nHost: "+url.getHost()+"\r\n"); req=req.concat("Content-Type:application/x-www-form-urlencoded\r\n"); req=req.concat("Content-Length:"+(url.getQuery()).length()+"\r\n"); //Le prog plante s'il n'y a pas de données (après le ?) } catch(Exception exp){exp.printStackTrace();System.out.println(System.err);} //Les exceptions permettent de gérer les erreurs. Il est obligatoire de les mettre quand cela est demandé //Le compilateur dit automatiquement si une instruction nécessite que l'on utilise une exception //et quel type d'exception doit être utilisé } public static void main(String args[]) //Le point d'entrée { HttpClient connexion=null; if (args.length==0 || args.length>2) usage(); // si ya pas le bon nombre d'arguments on affiche l'aide if (args.length==1) connexion=new HttpClient(args[0]); //Si ya un seul argument if (args.length==2) connexion=new HttpClient(args[0],args[1]); //Si yen a 2 connexion.sendReq(); // Dans tout les cas (si on a les arguments) on envoie la requête } }