目前项目要用到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的含义。
分享到:
相关推荐
ksoap2-android-assembly-3.6.2-jar-with-dependencies
ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 要是需要最新的,下载地址: http://code.google.com/p/ksoap2-android/
安卓调用webservice示例,包括ksoap2-android-3.6.4jar包
ksoap2-android调用WebService 在Android中应用中的jar
ksoap2-android-assembly-2.4-jar-with-dependencies
ksoap2-android-assembly-2.5.4-jar-with-dependencies - withTimeOut.jar 自己下载的2.5.4版本有webservice的timeout设置,可是没有效果, 经反编译发现只是设置了timeout的空方法。 故根据网上的方法将方法完善。 ...
如果你只是用来连接webservice的话就直接用可以了,代码混淆里也不需要多余的操作。 如果你用到了XmlPullParserFactory这样的。那加入下边的 -dontwarn org.kxml2.** -keep class org.kxml2.** { *;} -dontwarn org....
ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar
最新ksoap2-android 3.6.2 jar库,最新ksoap2-android 3.6.2 jar库,最新ksoap2-android 3.6.2 jar库
ksoap2-android-assembly-2.6.0-jar-with-dependencies.rar ,android用于调用webservice接口必须的包,很适用
在Android平台调用Web Service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包。此jar包用于android和webservice进行通信,目前版本3.6.2
commons-httpclient包和ksoap2-android-assembly包是android调用webservices需要加载的包。朋友们可以下载。
ksoap2 android 3.6.0 轻量级 用于 android 调用webservice的第三方jar 2015-10-15 最新版本
ksoap2-android-assembly-2.4-jar-with-dependencies.jar
最新版本的ksoap2 ksoap2-android-assembly-3.4.0-jar-with-dependencies
ksoap2-android-assembly-3.2.0-jar-with-dependencies wcf所用包
ksoap2-android-assembly-2.6.2-jar-with-dependencies.jar android中调用webservice所需要的jar包
android移动开发连接webservice的必要开发包
最新的 ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies