本文适用读者:了解基本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
SoapSerializationEnvelope是kSOAP2新增加的类,是对SoapEnvelope的扩展,对SOAP序列化(Serialization)格式规范提供了支持,能够对简单对象自动进行序列化(simple object serialization)。因为是对.NET WebService进行调用,需要对dotNet 属性设置为true。
SoapObject
SoapObject可以让用户方便的对SOAP调用;他的构造方法有两个参数 :Namespace与MethodName。
特别注意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工作,否则会堵塞操作。下述例程仅作说明,对线程的封装需要额外设计。
返回结果
在kSOAP2中SoapSerializationEnvelope中通过getResult()方法获得返回Object的方法已经作废(deprecated),可以通过getResponse()来获得。
调试运行
如果在WTK运行时发现NoClassDefFoundError Exception异常,则可以考虑是kSOAP2的jar包未导入。正确的导入方法是将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下访问.net的WebService
http://www.j2medev.com/blog/user2/80135/4802.html