Ksoap的使用详

上传人:xy****7 文档编号:45535216 上传时间:2018-06-17 格式:DOC 页数:16 大小:157.50KB
返回 下载 相关 举报
Ksoap的使用详_第1页
第1页 / 共16页
Ksoap的使用详_第2页
第2页 / 共16页
Ksoap的使用详_第3页
第3页 / 共16页
Ksoap的使用详_第4页
第4页 / 共16页
Ksoap的使用详_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Ksoap的使用详》由会员分享,可在线阅读,更多相关《Ksoap的使用详(16页珍藏版)》请在金锄头文库上搜索。

1、j2mekSOAP 的运用的运用1概述概述对于 J2ME 访问远端的 Web Service,除了官方标准 JSR 172,我们还有两种选择:kSOAPWingfootWingfoot 是由 Wingfoot Software()出品的一款 J2ME(CLDC/CDC) SOAP1.1 的轻量级实现方案。kSOAP 是 Enhydra.org 的一个开源作品,是 EnhydraME 项目的一部分。基于 Enhydra.org 出品的开源通用 XML 解析器 kXML,kSOAP 完成了 J2ME/MIDP 平台上的 SOAP 解析和调用工作。Stefan Haustein 领导的 kSOAP

2、开发小组于 2001 年 5 月 17 日推出了Alhpa 版本。之后又经过了一年的开发,2002 年 6 月 6 日推出的 kSOAP 1.2 支持了 SOAP1.2 规范。2003 年 8 月 25 日推出的 kSOAP2,对 SOAP 序列化规范支持得更好了。大多数人选择 kSOAP 的原因是,kSOAP 虽然在 2003 年 8 月之后就不再维护了,但它是 Open Source 的,很容易加入增强特性,比如说默认情况下 kSOAP2 仅仅支持 cmnet 接入点,可以修改 kSOAP2 的 HttpTransport.java 代码增加对 cmwap 接入点的支持。下载提示下载提示:

3、kSOAP 当前有两个版本:1.2 和 2.0。官方网站:http:/ksoap.objectweb.org/kSOAP2.0 还有一个优点是,改进了对 Microsoft dotNET 的兼容。以前有很多人抱怨 kSOAP 调用 dotNET 编写的 Web Service 时遇到了不少的困扰。本章节我们将使用 kSOAP 2.0 的例子来讲解。为了使用 kSOAP 2.0,必须还要下载工具包 kXML2。下载提示下载提示:kXML 当前有两个版本:1.21 和 2.0。官方网站:http:/kxml.objectweb.org/ kXML2 比 kXML 更小更快。2kSOAP2 接口接口

4、让我们先熟悉一下即将用到的 kSOAP2 的常用接口。接口接口org.ksoap2. SoapEnvelopeorg.ksoap2. SoapSerializationEnvelope:序列化org.ksoap2. SoapObject:SOAP 调用org.ksoap2.transport. HttpTransportSoapEnvelope 对应于 SOAP 规范中的 SOAP Envelope,封装了 head 和body 对象。SoapSerializationEnvelope 是 kSOAP2 新增加的类,是对 SoapEnvelope的扩展,对 SOAP 序列化(Serializa

5、tion)格式规范提供了支持,能够对简单对象自动进行序列化(simple object serialization)。而 kSOAP1.x 则是通过 org.ksoap.ClassMap 来做序列化的,不太好操作,也不利于扩展。SoapObject 让你自如地构造 SOAP 调用;HttpTransport 为你屏蔽了 Internet 访问/请求和获取服务器 SOAP 的细节。下面我们通过一个最简单的webservice调用,来看看 kSOAP 是如何做到 SOAP 解析的:21kSOAP 和和 Web Service 之间传递之间传递 Stringwebservice 传递 String

6、给 MIDP 是一件很简单的事情。首先在服务器端,不管你是用 Microsft ASP.NET 创建 webservice,还是由 Tomcat+AXIS1.2 支撑的 webservice,都可以这么编写主服务类:服务器端服务器端public class SimpleKSoapWS public SimpleKSoapWS () public String foo(String username, String password) return “fooResult”;kSOAP 是如何调用这个 webservice 的呢?首先要使用 SoapObject,这是一个高度抽象化的类,完成 SO

7、AP 调用。可以调用它的 addProperty()方法填写要调用的 webservice 方法的参数。如下面代码所示:SoapObject request = new SoapObject(serviceNamespace, methodName);SoapObject 构造函数的两个参数含义为:serviceNamespace 你的 webservice 的命名空间,既可以是http:/localhost:8088/flickrBuddy/services/Buddycast 这样的,也可以是urn:PI/DevCentral/SoapService 这样的;methodName 你要调用

8、方法的名字。然后,按照 webservice 方法参数的顺序,依次调用request.addProperty( “username“, “user“ );request.addProperty( “password“, “pass“ );来填充 webservice 参数。注意注意:建议 webservice 的方法传递的参数尽量用 string 类型。即使是 int 类型,kSOAP2 与 Java 编写的 webservice 也有可能交互发生异常。对于 webservice 方法返回 String 类型的情况,还用不着开发者做序列化(Serialization)定制工作。要点要点:kSO

9、AP 1.X/2.0 可以自动把四种 SOAP 类型映射为 Java 类型SOAP typeJava typexsd:int java.lang.Integerxsd:long java.lang.Longxsd:string java.lang.String xsd:booleanjava.lang.Boolean除此之外,都需要开发者自己做类型映射。然后要告诉 SoapSerializationEnvelope 把构造好的 SoapObject 封装进去:SoapSerializationEnvelope envelope =new SoapSerializationEnvelope(So

10、apEnvelope.VER11);envelope.bodyOut = request;要点要点:你可以通过 SoapSerializationEnvelope 或者 SoapEnvelope 的构造函数来指明你要用 SOAP 的哪一个规范,可以是以下几种之一:常量 SoapEnvelope.VER10:对应于 SOAP 1.0 规范常量 SoapEnvelope.VER11:对应于 SOAP 1.1 规范常量 SoapEnvelope.VER12:对应于 SOAP 1.2 规范这样,无论要调用的 webservice 采用了哪一个 SOAP 规范,你都可以轻松应对。接下来就要声明HttpT

11、ransport tx = new HttpTransport(serviceURL);ht.debug = true;HttpTransport 构造函数的参数含义为:serviceURL 要投递 SOAP 数据的目标地址,譬如说http:/ 。HttpTransport 是一个强大的辅助类,来完成 Http-call transport process,它封装了网络请求的一切,你完全不用考虑序列化消息。我们通过设置它的 debug 属性为 true 来打开调试信息。方法 HttpTransport.call()自己就能够发送请求给服务器、接收服务器响应并序列化 SOAP 消息,如下所示:h

12、t.call(null, envelope);HttpTransport 的 call 方法的两个参数含义为:soapAction SOAP 规范定义了一个名为 SOAPAction 的新 HTTP 标头,所有 SOAP HTTP 请求(即使是空的)都必须包含该标头。 SOAPAction 标头旨在表明该消息的意图。通常可以置此参数为 null,这样 HttpTransport 就会设置 HTTP 标头 SOAPAction 为空字符串。Envelope 就是前面我们构造好的 SoapSerializationEnvelope 或 SoapEnvelope 对象。注意注意:对于 HttpTra

13、nsport 的处理上,kSOAP2 和 kSOAP1.2 的写法不一样。对于 kSOAP 1.2,HttpTransport 的构造函数是 HttpTransport (String url, String soapAction),第二个参数 soapAction 可以是要调用的 webservice 方法名。而 kSOAP 2,构造函数是 HttpTransport(String url)。kSOAP2 相当于把webservice 方法名分离出去,完全交给 SoapObject 去封装,而 HttpTransport 仅仅负责把 SoapEnvelope 发送出去并接收响应,这样更合理一

14、些。调用 call 方法是一个同步过程,需要等待它返回。返回之后,就可以调用 SoapSerializationEnvelope 的 getResult 方法来获取结果了:Object Response = envelope.getResult();如果 HttpTransport 的 debug 属性为 true,那么此时就可以通过System.out.println(“Response dump“+ tx.responseDump);打印出 HttpTransport 的调试信息。尤其当前面 call 方法和 getResult 方法发生异常时,这个调试信息是非常有用的。前面我们的 web

15、service 方法由于是返回 string,所以得到这个 string 值就非常简单了:String sResponse = Response.ToString();注意注意:由于 HttpTransport 类实际上是调用了 HttpConnection 作网络连接,所以必须另起一个线程来专门做 kSOAP 工作,否则会堵塞操作。综上所述,J2ME 客户端的 MIDlet 按键事件函数这么写即可:MIDlet codesimport org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.k

16、soap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransport;public void commandAction(Command c, Displayable s) if (c = exitCommand) destroyApp(false); notifyDestroyed(); if (c = connectCommand) / 匿名内部 Thread,调用 kSOAP2 访问远程服务。 Thread webserviceThread = new Thread() public void run() try String serviceNamespace = “http:/localhost:8080/SimpleWS/s

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号