kSoap访问.Net的WebService的基本方法及问题

来源:互联网 发布:头像源码图片怎么用 编辑:程序博客网 时间:2024/04/28 11:30

本文适用读者:了解基本J2ME概念,正从事于对.NET开发WebService调用的用户。如果有对Java 平台下开发WebService(例如使用AXIS)的问题,可以参阅经典的文章《kSOAP的运用——郑昀》(见Reference 3)。

 

 

SOAP协议版本

可以通过SoapSerializationEnvelope或者SoapEnvelope的构造函数来指明你要用SOAP的协议版本,可以是如下几种之一:

常量SoapEnvelope.VER10:对应于SOAP 1.0规范

常量SoapEnvelope.VER11:对应于SOAP 1.1规范

常量SoapEnvelope.VER12:对应于SOAP 1.2规范

 

SoapSerializationEnvelope

SoapSerializationEnvelopekSOAP2新增加的类,是对SoapEnvelope的扩展,对SOAP序列化(Serialization)格式规范提供了支持,能够对简单对象自动进行序列化(simple object serialization)。因为是对.NET WebService进行调用,需要对dotNet 属性设置为true

 

SoapObject

SoapObject可以让用户方便的对SOAP调用;他的构造方法有两个参数 NamespaceMethodName

特别注意Namespace默认在.NET中设为"http://tempuri.org/" ,应注意不要把最后的’/’丢掉,可能在kSOAP生成Request的时候会有错误!

 

HttpTransport

HttpTransport屏蔽了Internet访问/请求和获取服务器SOAP的细节。通过对requestDump的分析发现,如果Soap request中缺少了"<?xml version=/"1.0/" encoding=/"UTF-8/"?> 就会发生.NET WebService服务器端的解析失败!因而需要在HttpTransport对象中通过setXmlVersionTag方法将其加入。

 

线程

由于HttpTransport类实际上是调用了HttpConnection作网络连接,所以必须另起一个线程来专门做kSOAP工作,否则会堵塞操作。下述例程仅作说明,对线程的封装需要额外设计。

 

返回结果

       kSOAP2SoapSerializationEnvelope中通过getResult()方法获得返回Object的方法已经作废(deprecated),可以通过getResponse()来获得。

 

调试运行

       如果在WTK运行时发现NoClassDefFoundError Exception异常,则可以考虑是kSOAP2jar包未导入。正确的导入方法是将jar文件拷贝至WTK/lib文件夹下,如果是Eclipse环境下开发,还需在Project->Properties->java Build Path中导入jar文件,并在该窗口下Order and Export中将该jar文件也选中即可。

       如果有特别异常,可以通过HttpTransport中的requestDump()responseDump()方法将封装好多SOAP请求与收到的响应进行显示,对比后排除错误,这很必要!

 

 

 

    String Namespace = "http://tempuri.org/";String MethodName = "GetWorkerName";SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);    SoapObject request  = new SoapObject(Namespace, MethodName);    request.addProperty( "pipeNo", "RFID000045" );    envelope.bodyOut = request;    envelope.dotNet = true;    envelope.setOutputSoapObject(request);    HttpTransport ht = new HttpTransport("http://[Your IP/Namespace]/WebSiteTestService/Service.asmx");    ht.debug = true;    ht.setXmlVersionTag("<?xml version=/"1.0/" encoding=/"UTF-8/"?>");     ht.call("http://tempuri.org/GetWorkerName", envelope);     Object  result =  envelope.getResponse();

 

Reference

1. kSoap JavaDoc or API

http://ksoap2.sourceforge.net/doc/api/

2.kSoap下载

http://sourceforge.net/projects/ksoap2/

3. kSOAP的运用

http://blog.csdn.net/zhengyun_ustc/archive/2007/01/17/1485436.aspx

4. J2ME下访问.netWebService 

http://www.j2medev.com/blog/user2/80135/4802.html

 

原创粉丝点击