可以在服务组件体系结构 (SCA) 应用程序中使用连线格式为 JSON-RPC 的 HTTP 绑定,以将服务公开给远程 Web 浏览器客户机。 JSON-RPC 是一种远程过程调用 (RPC) 协议,编码为JavaScript对象表示法 (JSON) 格式。
有关此任务
使用 HTTP 绑定来公开 SCA 服务,以供远程 Web 客户机使用。 本主题描述如何将 Java™ 实现公开为服务,以供浏览器客户端使用本机 Dojo 接口和 RPC 库使用。
要在 JavaScript 代码中使用本机 SCA 引用,请参阅有关将 JavaScript 中的窗口小部件实现与 HTTP 绑定配合使用的主题。
过程
- 在 SCA 组合定义中配置 Java 服务。
在组合定义中通过 HTTP 绑定来公开 Java 服务;例如:
<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>
本示例将 echo.Echo 接口中所定义的方法公开给 Web 浏览器客户机。 echo.EchoComponentImpl 类会实现 Echo 接口并为组件提供该实现。 在 "/EchoService" 相对统一资源标识 (URI) 上公开服务。
示例 HTTP 绑定 URI /EchoService 是相对 URI。 要运行产品集群中使用 HTTP 绑定的应用程序,请指定相对 URI。 如果绑定指定绝对 URI,那么您无法运行产品集群中的应用程序,例如 http://localhost:9080/newsService。
- 选择序列化引擎
wireFormat.jsonrpc 会告诉绑定使用缺省 IBM
JSON RPCAdapter 来序列化/取消序列化 JSON 数据。 (可选)您可以使用 Jackson 来执行序列化/取消序列化操作。 要使用 Jackson,请将 JVM 定制属性 com.ibm.ws.soa.sca.json.serializer.jackson 设置为 true。
Jackson 和 RCPAdapter 序列化器具有不同的性能特征,具体取决于 JSON 有效内容中的因子数。 请尝试这两者以确定哪一个最适合有效内容。
- 从 Web 浏览器访问服务。
例如,要访问 EchoService 服务,请在 HTML 文件或 JavaServer Pages (JSP) 文件中,使用 Dojo 工具箱应用程序编程接口来访问 /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>
传递到 dojo.rpc.JsonService 构造函数 "/EchoService?smd" 的 URI 包含查询字符串 "smd",此字符串位于组合的 <binding.http> 定义中所指定 URI 的末尾。 使用 Dojo 客户机时,需要位于此 URI 末尾的查询字符串 "smd"。
结果
本示例输出的 HTML 输出显示两个文本框和一个 "submit" 按钮。 当用户在第一个框中输入文本并单击 submit 按钮时,会执行以下步骤:
filladdr() 方法中的 JavaScript 代码会获取在第一个文本框中输入的值。
filladdr() 方法会实例化指向 URI "/EchoService?smd" 的 dojo.rpc.JsonService 对象。
- JavaScript 代码会对该 JsonService 对象运行
"echo(String)" 方法,促使将 JSON-RPC 请求发送到 "/EchoService?smd"。
- SCA 运行时通过运行
EchoComponentImpl.echo(String) 方法来处理 URI 请求。 会将结果作为 HTTP 响应返回到客户机。
- Web 客户机会使用从服务返回的值,运行指定的回调方法
"fillmsg(result)"。
fillmsg(result) 方法中的 JavaScript 代码会将第二个文本框更新成包含从服务调用返回的文本。
下一步做什么?
请考虑 JSON 转换的支持数据类型。 JSON-RPC 请求的参数会以 JSON 格式发送到服务器,且必须由 SCA 运行时进行变换,供在 Java 实现中使用。 对客户机的响应也是 JSON 格式,因此 SCA 运行时会将从 EchoComponentImpl.echo() 方法返回的值转换回 JSON。 例如,echo("Testing...") 可将以下数据提交到服务器:
{"params":["Testing..."],"method":"echo","id":1}
Java 方法 EchoComponentImpl.echo(String message) 是以字符串参数 "Testing..." 进行调用,且返回字符串对象 "echo: Testing..."。 返回到 Web 客户机的 JSON 响应可能如下所示:
{"id":1,"result":"echo: Testing..."}
表 1. JSON 转换支持的数据类型。 转换使 Web 客户机和 Java 实现可使用数据。
| 数据类型 |
| 基本类型 |
<==> |
JSON |
<==> |
基本类型 |
| 基本类型的数组 |
<==> |
JSON |
<==> |
基本类型的数组 |
| Java bean |
<==> |
JSON |
<==> |
Java bean |
| 列表 |
<==> |
JSON |
<==> |
列表 |
| 地图 |
<==> |
JSON |
<==> |
地图 |
| 设置 |
<==> |
JSON |
<==> |
设置 |