本人近段时间在开发APP客户端,服务端已写好不用我去做,我只需用WebService调用接口取数据即可。
用的开发工具是eclipse 64位安卓版,API 19(android 4.4)开发
其中遇到一个问题,APP在安卓4.4以下可以登录服务器(登录界面,帐号密码输入访问服务器验证),但是在安卓5.0以上会提示连接服务器失败,HttpTransport call报错。报错打印如下:
-------------------代码分割线-------------------------------
11-16 16:04:16.627 W/System.err(28371): java.io.IOException: HTTP request failed, HTTP status: 500
11-16 16:04:16.627 W/System.err(28371): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:195)
11-16 16:04:16.627 W/System.err(28371): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:116)
11-16 16:04:16.627 W/System.err(28371): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:111)
11-16 16:04:16.627 W/System.err(28371): at com.nti.mlmep.util.WebServiceUtils.visit(WebServiceUtils.java:102)
11-16 16:04:16.627 W/System.err(28371): at com.nti.mlmep.activity.LoginActivity$2.run(LoginActivity.java:151)
11-16 16:04:16.628 W/System.err(28371): at java.lang.Thread.run(Thread.java:818)
11-16 16:04:16.628 D/MSimSignalClusterView( 2922): updateCdma mMobileCdmaVisible[0]=false
11-16 16:04:16.628 D/MSimSignalClusterView( 2922): updateCdma mMobileCdma1xOnlyVisible[0]=false
11-16 16:04:16.631 D/MSimSignalClusterView( 2922): updateCdma mMobileCdmaVisible[1]=false
11-16 16:04:16.631 D/MSimSignalClusterView( 2922): updateCdma mMobileCdma1xOnlyVisible[1]=false
11-16 16:04:16.633 D/MSimSignalClusterView( 2922): updateCdma mMobileCdmaVisible[0]=false
11-16 16:04:16.634 D/MSimSignalClusterView( 2922): updateCdma mMobileCdma1xOnlyVisible[0]=false
11-16 16:04:16.636 D/MSimSignalClusterView( 2922): updateCdma mMobileCdmaVisible[1]=false
11-16 16:04:16.636 D/MSimSignalClusterView( 2922): updateCdma mMobileCdma1xOnlyVisible[1]=false
11-16 16:04:16.638 I/MSimSignalClusterView( 2922): setMobileDataIndicators visible=true strengthIcon=com.android.systemui:drawable/stat_sys_signal_5_fully activityIcon=(null) typeIcon=com.android.systemui:drawable/stat_sys_data_fully_connected_g contentDescription=string/accessibility_phone_signal_full_great typeContentDescription=string/accessibility_data_connection_gprs phoneId=0 noSimIcon=(null) mStyle=0 isRoam=false dataConnected=false volteRegisted=false
11-16 16:04:16.639 I/MSimSignalClusterView( 2922): convertMobileStrengthIconHmct type=com.android.systemui:drawable/stat_sys_data_fully_connected_g icon=com.android.systemui:drawable/stat_sys_signal_5_fully
11-16 16:04:16.639 I/TelephonyIcons( 2922): sxm getStrengthIconWithTypeHmct type=1 level=5
11-16 16:04:16.642 I/ViewRootImpl(28371): CPU Rendering VSync enable = true
-------------------代码分割线-------------------------------
服务器连接失败,HTTP 500错误,开始认为是服务端的问题,但考虑到安卓4.4以下都没有问题,那有可能还是客户端这边的问题(不确定)。开始排查原因,后来看到Android 6.0后对权限管理加强了,也有可能是这方面原因,然后怀疑是Ksoap2 jar包有问题,导致安卓5.0以上系统不兼容,于是网上查找了大量资料,有试过换jar包版本,改jar包名,添加权限管理等等方法,但都无法解决问题。
解决办法
最后在一个博客中找到了启发,虽然问题点不一样(非socket),但是却是一个很好的思路。最后通过系统排查,发现客户端与服务端登录模块所传字段顺序不一样。
WSDL上服务端是这样的:
而我的安卓客户端是这样的:
于是问题就来了。后来将顺序换了之后,问题居然解决了。
后来仔细思考,认为应该是安卓5.0以上对Webservice管控更加严格了,参数需要有序。
最后附上参考博文
参考地址:http://blog.csdn.net/qq_32452623/article/details/51545970
十分感谢博主分享经验