Android调用SOAP WebService无输出问题求助
解决Android SOAP WebService调用无输出的问题
我帮你排查了代码里的几个关键问题,这些应该就是导致调用没生效的核心原因:
1. 错误的WebService请求URL
你当前把URL设置成了带?WSDL的文档地址,但实际SOAP请求应该发送到asmx的基础服务地址,WSDL只是用来描述服务的文档,不是请求地址。修改如下:
String URL = "http://202.54.216.49/logs/test.asmx";
2. 参数添加方式错误
你现在用soapObject.addProperty("a",propertyInfo1)的写法,会把PropertyInfo对象本身当作参数值传递,而不是正确配置参数的元信息。应该直接传入PropertyInfo对象:
soapObject.addProperty(propertyInfo1); soapObject.addProperty(propertyInfo2);
3. 参数类型不匹配
如果你的calculation服务方法是接收数字类型(比如整数),但你把参数类型设置成String.class,会导致服务端无法正确解析参数。建议修改参数类型为Integer.class,同时在传递前把输入的字符串转成整数:
@Override protected String doInBackground(String... params) { String result = ""; try { // 先把输入的字符串转成整数 int param1 = Integer.parseInt(params[0]); int param2 = Integer.parseInt(params[1]); SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME); PropertyInfo propertyInfo1 = new PropertyInfo(); propertyInfo1.setName(PARAMETER_NAME1); propertyInfo1.setValue(param1); propertyInfo1.setType(Integer.class); PropertyInfo propertyInfo2 = new PropertyInfo(); propertyInfo2.setName(PARAMETER_NAME2); propertyInfo2.setValue(param2); propertyInfo2.setType(Integer.class); soapObject.addProperty(propertyInfo1); soapObject.addProperty(propertyInfo2); // 后续的envelope和请求代码不变 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(soapObject); HttpTransportSE httpTransportSE = new HttpTransportSE(URL); httpTransportSE.call(SOAP_ACTION, envelope); SoapPrimitive soapPrimitive = (SoapPrimitive)envelope.getResponse(); result = soapPrimitive.toString(); } catch (Exception e) { e.printStackTrace(); } return result; }
4. Android 9+明文HTTP访问限制
从Android 9(API 28)开始,系统默认禁止明文HTTP请求,你需要在AndroidManifest.xml的<application>标签里添加配置,允许明文访问:
<application ... android:usesCleartextTraffic="true"> ... </application>
5. 异常处理优化(方便调试)
当前的异常处理只是打印日志,你可以优化一下,在界面上显示错误信息,方便排查问题:
class CallWebService extends AsyncTask<String, Void, String> { private Exception requestException; @Override protected void onPostExecute(String s) { if (requestException != null) { ans.setText("调用失败:" + requestException.getMessage()); } else { ans.setText(s); } } @Override protected String doInBackground(String... params) { String result = ""; requestException = null; try { // 原有的请求代码 } catch (Exception e) { requestException = e; e.printStackTrace(); } return result; } }
把这些修改完成后,再测试一下,应该就能正常获取WebService的返回结果了。
内容的提问来源于stack exchange,提问作者Abhimanyu
相关产品推荐
相关产品推荐

