les Web Services : introduction

Architecture 3-tiers ... n-tiers

XML-RPC, ancêtre de SOAP

RPC en XML


Source de TwiceClient.java
import java.net.URL;
import com.flat502.rox.client.XmlRpcClient;
public class TwiceClient {
  public static void main(String[] args) {
    try {
      Integer valeur = null;
      String url = "http://localhost:8080/";
      if (args.length == 2) {
        url = "http://"+args[0];
        valeur = new Integer(args[1]);
      } else if (args.length == 1) 
      valeur = new Integer(args[0]);
      else {
        System.out.println("usage : TwiceClient [host:port] entier");
        System.exit(1);
      }
      System.out.println("Connection a " + url);
      XmlRpcClient client = new XmlRpcClient(new URL(url));
      Object[] data = new Object[] { valeur };
      Object reponse = client.execute("service.twice", data);
      Integer resultat = (Integer)reponse;
      System.out.println("twice() = "+reponse.toString());
    } catch (Exception e) {
      System.out.println("erreur :"+e.getMessage());
      e.printStackTrace();
    }
  }
}

Source de TwiceServer.java
import java.net.InetAddress;
import java.util.Iterator;
import java.util.List;
import com.flat502.rox.marshal.RpcCall;
import com.flat502.rox.marshal.RpcResponse;
import com.flat502.rox.marshal.xmlrpc.XmlRpcMethodResponse;
import com.flat502.rox.server.SyncRequestHandler;
import com.flat502.rox.server.XmlRpcServer;

public class TwiceServer implements SyncRequestHandler {
  public RpcResponse handleRequest(RpcCall call)
                throws Exception {
    Object[] parametres = call.getParameters();
	System.out.println("fonction : "+call.getName()
        +" appelee avec "+parametres.length+" donnees :");
	for (int i = 0; i < parametres.length; i++) 
	  System.out.println("--> "+parametres[i]);
	if (call.getName().equals("service.twice")) {
      int valeur = ((Integer)parametres[0]).intValue();
	  Integer resultat = new Integer(2*valeur);
	  return new XmlRpcMethodResponse(resultat);
	} else 
	  throw new NoSuchMethodException();
	}
	// usage : TwiceServer [port]
  public static void main(String[] args) {
	try {
	  int port = 8080;
	  if (args.length > 0) 
		port = Integer.parseInt(args[0]);
	  XmlRpcServer server = new XmlRpcServer(port);
	  server.registerHandler(null, "^service\\.", 
                             new TwiceServer());
	  server.start();
	} catch (Exception e) {
	  e.printStackTrace();
	}
  }
}

EXECUTION


$ java TwiceClient 193.49.185.41:2000 56
Connection a http://193.49.185.41:2000
twice() = 112
$
(sur machine 193.49.185.41)
$ java TwiceServer 2000



fonction : service.twice appelee avec 1 donnees :
--> 56

la conversion des données en XML

Source de SommeClient.java
import java.net.URL;
import com.flat502.rox.client.XmlRpcClient;
public class SommeClient {
  public static void main(String[] args) {
    try {
      int[] TabValeurs = null;
      String url = null;
      if (args.length > 2) {
        url = "http://"+args[0];
        TabValeurs = new int[args.length-1];
        for (int i=args.length-1; i>0; --i)
          TabValeurs[i-1] = Integer.parseInt(args[i]);
      } else {
        System.out.println("usage : SommeClient host:port entier entier ....");
        System.exit(1);
      }
      System.out.println("Connection a " + url);
      XmlRpcClient client = new XmlRpcClient(new URL(url));
      Object[] data = new Object[] { TabValeurs };
      Object reponse = client.execute("service.somme", data);
      Integer resultat = (Integer)reponse;
      System.out.println("somme() = "+reponse.toString());
    } catch (Exception e) {
      System.out.println("erreur :"+e.getMessage());
      e.printStackTrace();
    }
  }
}
Source de SommeServer.java
import java.net.InetAddress;
import java.util.Iterator;
import java.util.List;
import com.flat502.rox.marshal.RpcCall;
import com.flat502.rox.marshal.RpcResponse;
import com.flat502.rox.marshal.xmlrpc.XmlRpcMethodResponse;
import com.flat502.rox.server.SyncRequestHandler;
import com.flat502.rox.server.XmlRpcServer;
public class SommeServer implements SyncRequestHandler {
  public RpcResponse handleRequest(RpcCall call)
         throws Exception {
    Object[] parametres = call.getParameters();
    System.out.println("fonction : "+call.getName()+" appelee avec "
                         +parametres.length+" donnees :");
    for (int i = 0; i < parametres.length; i++) 
      System.out.println("--> "+parametres[i]);
    if (call.getName().equals("service.somme")) {
      Integer som = new Integer(sommer((List)call.getParameters()[0]));
      return new XmlRpcMethodResponse(som);
    } else 
      throw new NoSuchMethodException();
  }
  private int sommer(List list) {
    int total = 0;
    Iterator i = list.iterator();
    while (i.hasNext())
      total += ((Integer) i.next()).intValue();    
    return total;
  }
  // usage : SommeServer [port]
  public static void main(String[] args) {
    try {
      int port = 8080;
      if (args.length > 0) 
      port = Integer.parseInt(args[0]);
      XmlRpcServer server = new XmlRpcServer(port);
      server.registerHandler(null, "^service\\.", new SommeServer());
      server.start();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
EXECUTION



java SommeClient  linux93:2000 34 89 555 
Connection a http://linux93:2000
somme() = 678
$
(sur machine linux93)
$ java SommeServer 2000




fonction : service.somme appelee avec 1 donnees :
--> [34, 89, 555]

l'Api RoX : RPC over XML

exercices