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 :

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;
        }
    }
}


Rédigé par Bliz

Publié dans #Java

Repost 0
Commenter cet article

wade 15/02/2011 12:21



Salut, merci pour ce tuto, toutefois si possible d'avoir plus d'infos (structure du fichier...) je débute dans les rpc ayant dejà une bonne base de programmation java.


Bon article