Vous pouvez utiliser une liaison HTTP avec un format WF de JSON-RPC dans une application SCA (Service Component Architecture) pour exposer des services aux clients de navigation Web distants. JSON-RPC est un protocole d'appel de procédure distante (RPC) codé dans le JavaScript Format de notation d'objet (JSON).
A propos de cette tâche
Utilisez la liaison HTTP pour exposer des services SCA afin qu'ils soient consommés par des clients Web
distants. Cette rubrique décrit comment exposer une implémentation Java™ en tant que service devant être consommé par un client de navigateur à l'aide des interfaces Dojo natives et des bibliothèques RPC.
Pour utiliser des références SCA natives en code JavaScript, consultez la rubrique sur l'utilisation de l'implémentation de widget en JavaScript avec les liaisons HTTP.
Procédure
- Configurez le service Java dans une définition de composite SCA.
Exposez un service Java sur une liaison HTTP dans la définition de
composite. Par exemple :
<composite>
<service name="EchoService" promote="EchoComponent">
<interface.java interface="echo.Echo"/>
<tuscany:binding.http uri="/EchoService"/>
<tuscany:wireFormat.jsonrpc/>
</tuscany:binding.http>
</service>
<component name="EchoComponent">
<implementation.java class="echo.EchoComponentImpl"/>
</component>
</composite>
Cet exemple expose les méthodes définies dans l'interface
echo.Echo aux clients de navigation Web. La classe echo.EchoComponentImpl
implémente l'interface Echo et fournit l'implémentation pour le composant. Le service est exposé avec l'URI (uniform resource identifier) relatif "/EchoService".
L'URI de liaison HTTP /EchoService est un
exemple d'URI relatif. Pour exécuter des applications qui utilisent une liaison HTTP
dans les clusters du produit, spécifiez un URI relatif. Vous ne pouvez pas exécuter des applications
dans les clusters du produit, si la liaison indique un URI absolu, tel que
http://localhost:9080/newsService.
- Choisissez le moteur de sérialisation
WireFormat.jsonrpc indique à la liaison d'utiliser IBM JSON RPCAdapter pour sérialiser/désérialiser les données json. Vous pouvez également utiliser Jackson pour effectuer ces opérations. Pour utiliser Jackson, définissez la propriété personnalisée jvmcom.ibm.ws.soa.sca.json.serializer.jackson àtrue .
Les caractéristiques de performance des sérialiseurs Jackson et RCPAdapter dépendent du nombre de facteurs de la charge json. Testez les deux afin de déterminer celui qui fonctionne le mieux pour la charge.
- Accédez au service à partir du navigateur Web.
Par exemple, pour accéder au service EchoService,
utilisez des interfaces de programme d'application du toolkit Dojo dans un fichier HTML ou
dans un fichier JSP (JavaServer Pages) pour accèder au service disponible sur/EchoService :
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Echo...</title>
<script type="text/javascript" src="./dojo/dojo.js"></script>
<script>
dojo.require("dojo.io.script")
dojo.require("dojo.rpc.RpcService")
dojo.require("dojo.rpc.JsonService")
dojo.require("dojo.rpc.JsonpService")
function filladdr(){
var nameElement=document.getElementById("name");
var name=nameElement.value;
var echo = new dojo.rpc.JsonService("/EchoService?smd");
echo.echo(name).addCallback(fillmsg);
}
function fillmsg(result){
var line=document.getElementById("line1");
line.value=result;
}
</script>
</head>
<body>
Enter a string: <input id="name" type="text">
<input type="submit" value="Echo String" onClick="filladdr()"><br>
<p>Echo </p><input id="line1" type="text" size="50"><br><br>
</body>
</html>
L'URI "/EchoService?smd" qui est transmis au constructeur dojo.rpc.JsonService,
contient la chaîne de requête
"smd" à la fin de l'URI spécifié dans la définition de composite <binding.http>. La chaîne de requête "smd" à la fin de l'URI, est obligatoire pour l'utilisation de clients Dojo.
Résultats
La sortie HTML de l'exemple de sortie affiche deux zones de texte et un"submit" bouton. Quand un utilisateur entre du texte dans la
première zone de texte et clique sur le bouton Envoi, la procédure suivante s'exécute :
- Le code JavaScript de la méthode
filladdr()
obtient la valeur qui a été saisie dans la première zone de texte.
- La méthode
filladdr() crée une instance dojo.rpc.JsonService
indiqué à l'URI "/EchoService?smd".
- Le code JavaScript exécute la méthode
"echo(String)"
sur l'objet JsonService, générant une demande JSON-RPC à envoyer à "/EchoService?smd".
- L'exécution SCA gère la demande de l'URI en exécutant la méthode
EchoComponentImpl.echo(String). Le résultat est renvoyé au client en tant que réponse HTTP.
- Le client Web exécute la méthode de rappel
"fillmsg(result)" désignée,
avec la valeur renvoyée par le service.
- Le code JavaScript de la méthode
fillmsg(result)
met à jour la seconde zone de texte qui contient le texte renvoyé par l'appel
du service.
Etape suivante
Notez bien les types de données pris en charge pour la conversion JSON. Des paramètres pour les demandes JSON-RPC sont envoyés au serveur dans un format JSON
et doivent être transformés par l'exécution SCA afin d'être utilisés dans l'implémentation Java. La réponse au client est également au format JSON. Donc, le composant SCA
reconvertit au format JSON la valeur renvoyée par la méthode EchoComponentImpl.echo(). Par exemple,echo("Testing...") pourrait soumettre les données suivantes au serveur :
{"params":["Testing..."],"method":"echo","id":1}
La méthode JavaEchoComponentImpl.echo(String message) est invoqué avec le paramètre String"Testing..." et renvoie l'objet String"echo: Testing..." . La réponse
JSON renvoyée au client Web peut ressembler à ce qui suit :
{"id":1,"result":"echo: Testing..."}
Tableau 1. Types de données pris en charge pour les conversions JSON . La conversion permet au client
Web et à l'implémentation Java d'utiliser les données.
| Type de données |
| Type primitif |
<==> |
JSON |
<==> |
Type primitif |
| Tableau de type primitif |
<==> |
JSON |
<==> |
Tableau de type primitif |
| bean Java |
<==> |
JSON |
<==> |
bean Java |
| List |
<==> |
JSON |
<==> |
List |
| Mappe |
<==> |
JSON |
<==> |
Mappe |
| Set |
<==> |
JSON |
<==> |
Set |