如何使用android-ksoap2构建正确的WebService XML请求?
解决ksoap2生成SOAP请求格式不匹配的问题
我来帮你搞定这个SOAP请求格式的问题!你的核心需求是让ksoap2生成带ns1前缀的方法和参数,并且使用SOAP-ENV作为Envelope的前缀,而不是默认的v。咱们一步步调整代码:
问题分析
你当前的代码生成的请求把命名空间作为方法的默认xmlns属性,而目标格式要求方法和参数都显式带上ns1前缀;同时Envelope的前缀也需要从v改成SOAP-ENV。
修改后的代码
// 先确认你的常量定义正确 private static final String NAMESPACE = "www.mywebservice.com"; private static final String METHOD_NAME = "MyMethodName"; // SOAP_ACTION需要和WebService定义一致,通常是NAMESPACE + "/" + METHOD_NAME,自行验证 private static final String SOAP_ACTION = NAMESPACE + "/" + METHOD_NAME; private static final String URL = "你的WebService实际地址"; // 构建请求 SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); // 注意:这里用SoapPrimitive指定参数的命名空间,确保生成带ns1前缀的元素 SoapPrimitive appUserParam = new SoapPrimitive(NAMESPACE, "appUser", "0"); request.addSoapObject(appUserParam); // 创建Envelope并调整配置 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); // 移除dotNet=true,这是针对.NET服务的特殊配置,会生成多余的命名空间 // envelope.dotNet = true; // 将Envelope的前缀改为SOAP-ENV,匹配目标格式 envelope.env = "SOAP-ENV"; // 添加命名空间映射:把ns1前缀关联到你的业务命名空间 envelope.addMapping(NAMESPACE, "ns1", String.class); envelope.implicitTypes = true; envelope.setOutputSoapObject(request); HttpTransportSE httpTransport = new HttpTransportSE(URL); httpTransport.debug = true; try { httpTransport.call(SOAP_ACTION, envelope); // 打印生成的请求,验证格式是否正确 Log.d("SOAP_REQUEST", httpTransport.requestDump); } catch (Exception e) { e.printStackTrace(); }
关键修改点说明
- 移除
envelope.dotNet = true:这个配置是专门适配.NET WebService的,会生成带i、d等额外命名空间的Envelope,和你的目标格式不符。 - 设置Envelope前缀为
SOAP-ENV:通过envelope.env = "SOAP-ENV"替换默认的v前缀,匹配目标XML的Envelope命名空间格式。 - 用
SoapPrimitive指定参数命名空间:直接使用addProperty会把参数放在默认命名空间里,而SoapPrimitive可以显式绑定参数到指定命名空间,让生成的XML带上ns1前缀。 - 添加命名空间映射:
envelope.addMapping建立ns1前缀和业务命名空间的关联,确保ksoap2生成XML时使用这个前缀。
验证
运行代码后,查看httpTransport.requestDump的输出,应该就能得到你需要的XML格式了。如果还有小细节不符,可以调整SOAP_ACTION或者检查命名空间的拼写是否完全一致。
内容的提问来源于stack exchange,提问作者Edgaras
相关产品推荐
相关产品推荐

