Client XML-RPC en java
Publié le 10 Février 2010
Aujourd'hui j'ai eu besoin de développer un petit client java pour tester une application qui utilise XML-RPC.
Comme il s'agit d'un client très simple, je me suis dit que ça pourrait faire l'objet d'un article.
Alors voilà ce dont j'avais besoin:
Un client XML-RPC capable de charger une requête XML-RPC depuis un fichier texte, de l'envoyer au serveur puis de m'afficher la réponse à l'écran.
Rien de plus facile (ou presque):
- on utilise la classe java.net.Socket pour établir une connexion avec le serveur.
- on ouvre les flux d'écriture (envoi) et de lecture (réception) de la socket.
- on ouvre également un flux de lecture (InputStream) pour lire le fichier contenant la requête XML-RPC
- puis on formate et on envoie la requête
- et on affiche la réponse
Voilà pour le principe maintenant voyons à quoi ça ressemble côté java :
Comme il s'agit d'un client très simple, je me suis dit que ça pourrait faire l'objet d'un article.
Alors voilà ce dont j'avais besoin:
Un client XML-RPC capable de charger une requête XML-RPC depuis un fichier texte, de l'envoyer au serveur puis de m'afficher la réponse à l'écran.
Rien de plus facile (ou presque):
- on utilise la classe java.net.Socket pour établir une connexion avec le serveur.
- on ouvre les flux d'écriture (envoi) et de lecture (réception) de la socket.
- on ouvre également un flux de lecture (InputStream) pour lire le fichier contenant la requête XML-RPC
- puis on formate et on envoie la requête
- et on affiche la réponse
Voilà pour le principe maintenant voyons à quoi ça ressemble côté java :
package com.over-blog.potatos.net;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class XmlRpcClient {
// Synonymes pour éviter de manipuler les index
// du tableau args[] directement
public static final int HOST = 0;
public static final int URL = 1;
public static final int REQUEST = 2;
public static void main(String[] args) throws Exception {
// valeur par défaut
if(args == null || args.length == 0) args = new String[3];
if(!isDefined(args, HOST)) args[HOST] = "localhost";
if(!isDefined(args, URL)) args[URL] = "/potatos/servlet/";
if(!isDefined(args, REQUEST)) args[REQUEST] = "src/main/resources/requete.xml";
// connexion au serveur (ouverture de la socket)
Socket socket = new Socket(args[HOST], 80);
// récupération des flux d'écriture et de lecture
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
System.out.println("ENVOI REQUETE:");
// génération de l'entête
StringBuffer header = new StringBuffer();
header.append("POST "+args[URL]+" HTTP/1.0\n");
header.append("Content-Type: text/xml\n");
// la taille de la requête correspond à la taille du fichier
// qui contient la requete XML-RPC
header.append("Content-Length: "+(new File(args[REQUEST]).length()+2)+"\n");
header.append("\n");
// envoi de l'entête (écriture sur le flux de sortie)
byte[] buffer = header.toString().getBytes("UTF-8");
out.write(buffer);
// et affichage à l'écran
System.out.write(buffer);
// chargement de la requête XML-RPC
InputStream src = new FileInputStream(args[REQUEST]);
buffer = new byte[1024];
int b = 0;
while((b = src.read(buffer)) >= 0){
// écriture de la requête sur le flux de sortie
out.write(buffer, 0, b);
// et affichage à l'écran
System.out.write(buffer, 0, b);
}
//fin de la requete (2 sauts de lignes)
buffer = "\n\n".getBytes("UTF-8");
out.write(buffer);
System.out.write(buffer);
System.out.println("RECEPTION REPONSE:");
// affichage de la réponse
while((b = in.read(buffer)) >= 0){
System.out.write(buffer, 0, b);
}
// fermeture des différents flux
out.close();
src.close();
in.close();
}
public static boolean isDefined(String[] array, int index){
try{
return array[index] != null;
}
catch(ArrayIndexOutOfBoundsException e){
return false;
}
}
}