目前项目要用到webservice来和后端交互,后端使用的cxf编写,用的jaxb做序列化。当中遇到了ksoap2-android发出的报文不能被正确解析的问题,遂在这里发文以共享。
当中一共遇到了3个问题:
(1)命名空间前缀的问题
(2)复杂对象的命名问题
最后一个问题容易解决,在此逐一说明:
(1)命名空间前缀的问题:
在webservice中,一个请求报文能够被正确解析,报文的格式是首先的。在其官网提供的资料中,一般很少提及服务端是什么类型,网上有见到用axis做服务端的。不过,由于cxf本身的一些较好特性,我们的项目中使用了cxf。ksoap2-android提供了一个开关项Dotnet来控制一个元素是否添加名字空间前缀,来解决兼容性问题。但是, 在调试过程中发现,在请求包的body元素的第一层元素,就是调用方法元素上,如果不携带命名空间,对端无法正确解析,这是因为cxf在发布WSDL时,其中的元素都带有命名空间,而此时使用的Dotnet开关是true,也许是设计者习惯于这种方式吧,其实按照字面理解,此时应当是:true表明要兼容DOTNET,所以会加上命名空间前缀,而false表明不需要兼容,则不加前缀。不过这个问题无伤大雅。
改变开关后,所有元素都加上了前缀,但是参数部分又无法解析,根据错误信息判断是参数部分不能使用加前缀方式来标明命名空间,而应使用属性方式。
此问题的解决是下载了其源码包,并从原来的SoapSerializationEnvelope和SoapObject分别派生新的子类。
SoapSerializationEnvelope的序列化时,读取带序列化对象的Dotnet参数来确定是否使用前缀方式的命名空间。SoapObject的派生对象则相应的添加Dotnet属性供序列化方法读取。这样的话,就是分开处理的策略,从而解决了这个问题。
(2)复杂对象的命名问题
调用参数的添加官方文档给了示例,但是不够明确详尽,在这里补充之:请求包的参数元素的名字应当和其在WSDL中的方法描述中的名字一致。对此,在构建请求的对象时,将SoapObject以相应名称的Property添加即可。对于复杂类型对象,在构建对应的SoapObject时,其第二个参数要使用短类名类进行。有的文档中在给出实例时,称第二个参数为methodname,是不对的,其应当是elementName的含义。
分享到:
相关推荐
首先,我们需要理解SOAP,它是一种轻量级的消息协议,用于在应用程序之间传递结构化和类型化的信息。SOAP消息通常使用HTTP或HTTPS作为传输协议,这使得它非常适合移动设备如Android手机。 ksoap2-android是一个轻量...
总的来说,ksoap2-android-assembly-2.4-jar和ksoap2-android-assembly-2.5.2-jar是Android开发者连接SOAP Web服务的重要工具。通过理解这两个版本的区别,开发者可以根据项目需求选择合适的版本,并利用它们提供的...
3. **数据序列化和反序列化**:ksoap2能够将Java对象转换为SOAP消息中的XML数据,反之亦然,实现了数据的自动序列化和反序列化。 4. **错误处理**:ksoap2提供了对Web服务调用中可能出现的错误进行捕获和处理的能力...
ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 要是需要最新的,下载地址: http://code.google.com/p/ksoap2-android/
3. **数据类型支持**:kSOAP2能够序列化和反序列化多种数据类型,包括基本类型(如int、String)、自定义对象和数组。这得益于其强大的` PropertyInfo`类,可以定义参数类型、名称和方向。 4. **错误处理**:在调用...
在Android领域,ksoap2-android是ksoap2的一个分支,专门针对Android环境进行了优化,使得开发者可以方便地在Android应用中集成SOAP服务调用功能。 二、ksoap2-android-assembly-2.5.4版本详解 这个版本的ksoap2-...
ksoap2-android调用WebService 在Android中应用中的jar
《ksoap2-android-2.5.4.jar.zip:Android Web服务开发的得力助手》 在移动应用开发中,Android平台与Web服务的交互是一个常见的需求,这通常涉及到数据的远程获取、更新或者同步。ksoap2-android库是解决这一问题...
ksoap2-android-assembly-2.5.4-jar-with-dependencies - withTimeOut.jar 自己下载的2.5.4版本有webservice的timeout设置,可是没有效果, 经反编译发现只是设置了timeout的空方法。 故根据网上的方法将方法完善。 ...
在Android平台调用Web Service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包。此jar包用于android和webservice进行通信,目前版本3.6.2
《ksoap2-android-assembly-2.6.0-jar-with-dependencies:Android调用Web服务接口的关键库》 在Android应用开发中,有时我们需要与远程服务器进行数据交互,这时Web服务接口就起到了桥梁的作用。ksoap2-android-...
如果你只是用来连接webservice的话就直接用可以了,代码混淆里也不需要多余的操作。 如果你用到了XmlPullParserFactory这样的。那加入下边的 -dontwarn org.kxml2.** -keep class org.kxml2.** { *;} -dontwarn org....
5. **Marshalling and Unmarshalling**: 这是kSOAP2处理的对象序列化和反序列化过程。Marshalling是将Java对象转换为SOAP格式,Unmarshalling则是将接收到的SOAP消息解析回Java对象。 6. **Transport**: kSOAP2使用...
ksoap2 3.6 android webservice
2. **kSOAP2架构**: kSOAP2包括几个主要组件:`SoapSerializationEnvelope`用于序列化和反序列化对象到SOAP消息;`SoapObject`作为SOAP消息的基本构建块;`SoapAction`定义请求的特定操作;`HttpTransportSE`处理...
KSOAP2不仅支持基本类型的数据交换,还支持自定义对象和数组的序列化和反序列化,大大增强了其灵活性。此外,它还支持多种SOAP版本和编码方式,适用于不同的Web服务环境。 总的来说,KSOAP2-android-assembly-2.5.2...
目前最新ksoap2 3.6.1版,New transport and connection classes using OKHttp.项目地址:http://simpligility.github.io/ksoap2-android/index.html
在您提供的信息中,"commons-httpclient包"和"ksoap2-android-assembly包"正是两个关键的组件,它们分别处理HTTP通信和SOAP协议的解析。 **Apache Commons HttpClient** Apache Commons HttpClient是一个成熟的...
《ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar在Android图片压缩中的应用》 在移动开发领域,尤其是Android平台,图片处理是不可或缺的一部分。尤其是在网络传输和存储时,如何有效地压缩图片以减少...