详解J2ME的Web服务API
你对J2ME的Web服务API是否了解,这里和大家分享一下,Java2平台袖珍版(J2ME)平台中的Web服务是由Java规范请求172(JSR172)定义的,它与标准Web服务遵循同样的规范、结构以及调用模型。
J2ME的Web服务API讲解
用于Java2平台袖珍版(Java2Platform,MicroEdition,J2ME)的Web服务API(WSA)是由JavaCommunityProcess为Java规范请求172(JSR172)而定义的,这些API是两个相互独立的可选包,用于远程服务调用和XML解析。他们是针对基于连接设备配置(ConnectedDeviceConfiguration,CDC)和有限连接设备配置(ConnectedLimitedDeviceConfiguration,CLDC1.0和CLDC1.1)的框架的。为什么用户应该关注这些呢?因为JSR172在设备层为远程服务调用和XML解析提供了支持,也就意味着开发人员不用将这项功能嵌入到每一个应用程序中。本文介绍了远程服务调用可选包API。
J2ME中的Web服务
Java2平台袖珍版(J2ME)平台中的Web服务是由Java规范请求172(JSR172)定义的,它与标准Web服务遵循同样的规范、结构以及调用模型。我们来回顾一下清单。
与标准Web服务的比较
JSR172Web服务API(WSA)遵循下面这些核心Web服务规范:
简单对象访问协议(SOAP)1.1,定义传输和数据编码。
Web服务定义语言(WSDL)1.1,定义如何描述远程服务。
XML1.0,定义XML标记语言。
XMLSchema,毫无疑问,定义XML模式。
注意JSR172不支持统一描述、发现和集成(UDDI)2.0规范,该规范定义了如何发现远程服务。
由于有相当多的与Web服务相关并且涵盖了不同技术的规范出台,而且越来越多,Web服务互操作组织(WS-I)定义了WS-I基本概要1.0(WS-IBasicProfile,Version1.0)来定义Web服务规范的最小集,和一致性规则一样,所有的基础Web服务提供者和消费者都必须遵守该概要。JSR172规范也遵守WS-I基本概要。
与标准Web服务具有相同的体系结构:
JSR172WSA从客户端访问Web服务,从服务-消费者的角度来看,WSA提供远程服务调用API(JAX-RPC)以及运行时环境,从而允许J2ME应用程序在Web上消费服务,而不是作为服务生产者(端点)来运行。除了这一点差别之外,JSR172WSA体系结构的其它部分与Web服务的标准体系结构/组织一致,如下图所示:
该高级体系结构组织如下:
客户端,Web服务消费者:它是J2ME应用程序,例如MIDP或个人版基于框架的应用程序,JSR172存根和支持类,以及JSR172运行时。
网络:指的是无线和有线网络以及通信协议,无线和有线网络是Internet的一部分。注意JSR172本身没有规定在设备上使用XML编码方法,而允许执行程序(只要它们对消费者和生产者是透明的)使用更有效的编码方法,例如在设备和无线网关之间使用二进制协议。
服务器,Web服务生产者:它是一个Web服务器,通常位于防火墙和/或代理网关的后面。该服务器可以访问后台资源。
调用模型和数据流与标准Web服务相同:
J2ME应用程序通过JSR172存根和运行时调用远程服务,通常要通过HTTP和SOAP来进行传输。存根和运行时将与远程服务调用相关的复杂部分都隐藏起来了,包括输入值和返回值如何编码并解码,以及与服务器进行网络通信的管理。方法调用遵循同步请求-应答模型,如下图所示:
图2-JSR172调用模型
*由于调用是按模块进行的,所以您应该把这些调用分派到不同的执行线程中。
消费Web服务
要消费Web服务,您必须首先创建服务调用存根。让这些存根来执行任务,例如对输入值和返回值进行编码和解码、与JSR172运行时交互来调用远程服务端点。存根通过运行时的服务提供者接口(SPI)与运行时进行交互,这样通过概述运行时执行的详细情况,使存根在不同厂商之间的执行更便捷。
存根通常是用工具生成的,该工具读取一个WSDLXML文档,文档描述了将要使用到的Web服务。同样的,WSDL文档通常也是通过工具生成的,该工具读取接口定义,例如Java接口产生了WSDL文档。
从我们移动开发的角度来看,需要消费的WSDL文档通常已经存在,您需要做的仅仅是生成JSR172WSA存根。要生成这些存根,您应该使用例如J2MEWirelessToolkit2.1存根生成器这样的工具,如下图所示:
图3-生成JSR172WSA存根
该生成器生成存根Java文件,以及相关的支持类。如下一部分所描述的,它还考虑到了WSDL到Java的数据类型映射。
一旦生成了JSR172JAX-RPC存根和支持文件,您的应用程序就已经被编译并部署到启用了JSR172的设备上了,消费Web服务是很简单的而且几乎是透明的。您很快就会看到,调用远程方法几乎和调用本地方法一样简单。
JSR172JAX-RPC子集API
JSR172远程方法调用API是以基于XML的RPC的J2SEJavaAPI(JAX-RPC1.1)的子集为基础的。它同样遵守WS-I基本概要。下面来详细研究一下JSR172JAX-RPC子集API:
它支持:
SOAP1.1。
任何可以传送SOAP消息的传输,例如HTTP1.1,都有一个定义好的用于SOAP1.1的协议绑定。
SOAP消息的文字表示代表一个RPC调用或应答。
下面(是)数据类型和相应的Java映射:
xsd:boolean到boolean或Boolean。
xsd:byte到byte或Byte。
xsd:short到short或Short。
xsd:int到int或Integer。
xsd:long到long或Long。
xsd:float到float,或Float。对基于CLDC1.0的平台,该数据类型映射到String。
xsd:double到double,或Double。对基于CLDC1.0的平台,该数据类型映射到String。
xsd:string到String。
xsd:base64Binary到byte[]。
xsd:hexBinary到byte[]。
xsd:complexType到基本类型和类类型序列。
xsd:QName到javax.xml.namespace.QName。
以XML数组模式为基础的基本类型和复杂类型(结构中包含基本类型或复杂类型)数组。
它不支持:
带附件的SOAP消息。
SOAP消息处理器。
SOAP消息的编码表示。
服务端点(不是Web服务生产者)。
服务发现支持(UDDI)。
设备端没有规定XML编码方法。这样做是通过允许执行程序使用更有效的数据编码方法来帮助减少网络传输,例如在设备和无线网关间使用二进制协议(只要这样编码对消费者和生产者是透明的)。
JSR172远程调用API包括下面这些包:
javax.microedition.xml.rpc
javax.xml.namespace
javax.xml.rpc
java.rmi(包括确保JAX-RPC相关型)
注意这些API(有一些异常API,例如RemoteException)不是直接由应用程序调用,相反,应用程序调用生成的存根。上面的API主要是供存根使用的。有关详细信息请参阅JSR172规范和/或Java文档。
使用JSR172JAX-RPC调用远程服务