richardli79

导航

J2ME下访问.net的webservice

如何通过j2me来实现访问webservice比较常用的方法使用ksoap或者是支持Jsr172的直接使用哪个ws包就行了。访问.net创建的webservice比较麻烦。如果是支持jsr172的设备可以使用wtk2.2直接生成桩,就是生个stub和几个访问类就可以实现对webservice的访问,但要注意返回类型,如果webservice的返回类型不是wtk能支持的话就会生成失败。
如果不支持jsr172的就比较麻烦,可以使用ksoap来做soap协议解析,完成对webservice访问。我试用了ksoap2不知道老是不成功,报错误是因为kxml中的xmlpull有问题。找不到哪个v11的类。感觉用ksoap2会是一个访问.net webservice的好选择,因为它内置了.net支持的选择,可以配置rpc与net选择。但是因为不成功,所以不能不转到ksoap来想办法。
使用它的例子程序作了一个helloworld程序,呵呵不成功,改造它的httptransport类,将发送和接收的soap包打印处出进行比较,发现是soap标签不一致,我用.net的webservice支持的soap标签是soapenc之类的,而使用ksoap打出来的包都是SOAP-ENC之类的。没办法手工改吧。修改org.ksoap.soap.java文件找到SOAP-ENC,SOAP-ENV之类的改成soapenc,soapenv之类。改完了运行,还是出错,察看输入soap包比对.net webservice要求的soap包发现包头少了不少东西。发现该问题是org.kxml.parser.AbstractXmlParser.java文件中public void startTag (PrefixMap prefixMap,String namespace, String name) 方法有问题,其中有个do,while循环存在问题
修改为
do {
  String p2 = current.getPrefix ();
  String ns = current.getNamespace ();
  if (!ns.equals (oldMap.getNamespace (p2))) {
      attribute (p2.equals ("") ? "xmlns" : ("xmlns:"+p2), ns);
        }
  current = current.getPrevious ();
     }
     while (current != null && current != oldMap);
原有方法没有将当前PrefixMap的后继PrefixMap中信息写入所以导致一个标签内的信息不全。修改后运行还是存在问题,根据返回soap包内容发现改造后的包头竟然有两项重复出现,经检查为soap.java内初始化PrefixMap数组时存在问题,原有方法定义一个basePrefixMap,而下面在个协议中使用该PrefixMap构造,所以导致V11与V12版本的soap包头重复出现soapenv与soapenc修改之
public static final PrefixMap [] prefixMap = {
 new PrefixMap (new PrefixMap
     (basePrefixMap, "xsd", XSD1999), "xsi", XSI1999),
 new PrefixMap (new PrefixMap (new PrefixMap (new PrefixMap
     (PrefixMap.DEFAULT, "xsd", XSD), "xsi", XSI), "soap", ENV), "soapenc", ENC),
 new PrefixMap (new PrefixMap (new PrefixMap (new PrefixMap
     (PrefixMap.DEFAULT, "xsd", XSD), "xsi", XSI), "soap", ENV2001), "soapenc", ENC2001)};
 这样就好了,哈哈。不过运行还是出错。是enc与env的协议不匹配,呵呵我用的V12也就是2001没想到竟然不对,改用V11后问题解决,不过不是可以运行,使这个问题不出了,出现另外问题,soap返回fault代码是soapAction不存在,比对后发现,比较变态的说,这个SoapAction必须和.net webservice给出的一样才行,而且有些是namespace+method有些不是。累,指定SoapAction为namespace+method,例如这个SoapAction就是"http://ww.tmp.com/method",而那个url就是http://yourserver/yourservice.asmx;这样终于可以访问了。
漏了一句,如果想要访问.net的webservice我用的[WebMethod,SoapRpcMethod]在每个需要访问的服务方法上面。如果不添那个SoapRpcMethod就不能用呀。
终于搞定。

posted on 2005-11-25 11:36  Richard  阅读(1250)  评论(1编辑  收藏  举报