Ajouter à DotClear des fonctionnalités WebServices
Il est possible d'ajouter à DotClear une interface Webservices pour accéder aux fonctionnalités principales de la classe Blog. Ceci dans le but de pouvoir piloter son blog DotClear depuis un téléphone portable supportant le J2ME.
Pour cela je vais utiliser la librairie Php NuSoap, facile d'utilisation et simple à mettre en place. NuPhp est constituée que d'un seul fichier, cette librairie est donc très facile d'utilisation et d'intégration.
Après avoir téléchargé ce fichier, vous pouvez créer un nouveau répertoire dans le répertoire 'ecrire/tools/' dans le répertoire de DotClear, celui-ci va accueillir notre WebService de test.
Commençons le codage du WebService 'test.php':
// Insert the NuSOAP code
require_once("nusoap.php");
// Insert dotclear classes
require_once("../../../inc/prepend.php");
require_once("../../../layout/class.xblog.php");
// Connexion C la base de donnC)es
$con = new connection(DB_USER,DB_PASS,DB_HOST,DB_DBASE);
if($con->error()) {
header('Content-Type: text/plain');
echo 'MySQL Error : '.$con->error();
exit;
}
// Instanciation de l'objet Blog
$blog = new xblog($con,DB_PREFIX,1,dc_encoding);
Je reconnais que les Includes ne sont pas vraiment propres :) ....
Maintenant que nous avons une instance de la classe Blog, nous pouvons donc l'exploiter :
// Register the method to expose
$server->register('statusPost', // method name
array('id' => 'xsd:string'), // input parameters
array('return' => 'xsd:boolean'), // output parameters
'urn:dotclearwsdl', // namespace
'urn:dotclearwsdl#statusPost', // soapaction
'rpc', // style
'encoded', // use
'Return the status of a post' // documentation
);
// This is the method
function statusPost($id) {
return $blog->statusPost($id);
}
// This returns the result
$server->service($HTTP_RAW_POST_DATA);
// DC)connexion C la base de donnC)es
$con->close();
Voilà, pour la partie serveur.
Maintenant pour tester, il vous suffit de vous rendre sur l'URL :
http://votreblog/ecrire/tools/votrerepertoire/test.php
Vous devriez avoir une belle fenêtre, vous proposant à la fois d'obtenir la signature du service, mais aussi un lien qui vous propose de visualiser le WSDL.
Désormais, des clients peuvent obtenir le statut d'un post à partir de son Id. Il est vrai que ce n'est pas vraiment utile, des fonctions comme l'ajout d'un post, et la visualisation des derniers commentaires seraient beaucoup plus pratique, mais cependant, beaucoup plus complexes à comprendre.
Maintenant que nous avons la partie Serveur du WebService, nous pouvons nous attaquer à la partie Cliente. Nous allons nous amuser à coder un client en J2ME.
Un très bon tutoriel est présenté ici.
Je vais donc le reprendre et l'adapter à notre exemple :
package org.geeek.wsblog.dotclear;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.TextBox;
import javax.microedition.midlet.MIDlet;
import org.ksoap.SoapObject;
import org.ksoap.transport.HttpTransport;
public class DotClear extends MIDlet implements CommandListener {
private Command exitCommand; // The exit command
private Display display; // The display for this MIDlet
// URL for PHP / NuSOAP
private String phpUrl = "https://www.geeek.org/ecrire/tools/wsblog/test.php";
public DotClear() {
display = Display.getDisplay(this);
exitCommand = new Command("Exit", Command.SCREEN, 2);
try {
// Create new Soap Client, specifiy the Service and method to call
SoapObject client = new SoapObject ( "urn:getLastNews", "getLastNews");
// Add the requied parameter,
// if you look at either the PHP or Java server side code
// one input parameter is required
client.addProperty("name","J2MEBuilder.com");
// Make the Method Call
HttpTransport ht = new HttpTransport(phpUrl,"getLastNews");
// Display the PHP NuSOAP result
System.out.println("RESULT: " + ht.call(client));
} catch (Exception ex) {
System.out.println(ex);
ex.printStackTrace();
}
}
public void startApp() {
TextBox t = new TextBox("WebService Client MIDlet",
"See Command Console for results",
256,
0);
t.addCommand(exitCommand);
t.setCommandListener(this);
display.setCurrent(t);
}
public void commandAction(Command c, Displayable s) {
if (c == exitCommand) {
destroyApp(false);
notifyDestroyed();
}
}
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
}
Pour que le client puisse être compilé il vous faut KSoap, le J2ME Toolkit, et pour vous faciliter le développement du client : Eclipse et son plugin pour J2ME.
Je n'ai pas encore fini mes tests, mais tout ceci devrait fonctionner rapidement. Et j'espère rapidement fournir un plugin et peut être un client J2ME si j'ai un peu de temps.
En attendant, il est possible d'utiliser ce plugin pour poster des billets depuis son mobile :)