我已经尝试过在网上阅读有关我的问题,但我找不到我需要的正确信息,所以我试着解释一下我的问题:
我正在使用kSoap2通过SOAP与Web服务“交谈”。 要生成我的SOAP请求,请使用以下代码:
// Generate SOAP request XML
SoapObject request = new SoapObject(PUB_NAMESPACE,
"testSoapInterface");
// Add request header
PropertyInfo requestHeader = new PropertyInfo();
requestHeader.setNamespace(PUB_NAMESPACE);
requestHeader.setName("requestheader");
// Generate username property
PropertyInfo usernameProp = new PropertyInfo();
usernameProp.setNamespace(BASE_NAMESPACE);
usernameProp.setName("username");
usernameProp.setValue(username);
// Generate applicationId property
PropertyInfo applicationIdProp = new PropertyInfo();
applicationIdProp.setNamespace(BASE_NAMESPACE);
applicationIdProp.setName("applicationId");
applicationIdProp.setValue("test");
// Add properties to requestHeader (nested)
requestHeader.setValue(new SoapObject(PUB_NAMESPACE, "requestheader")
.addProperty(usernameProp)
.addProperty(applicationIdProp));
request.addProperty(requestHeader);
现在,为了序列化这个,我使用以下内容:
// Serialize SOAP request to the non .NET based SOAP server
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet = false;
soapEnvelope.implicitTypes = true;
soapEnvelope.setAddAdornments(false);
soapEnvelope.setOutputSoapObject(request);
因为我使用嵌套的soap(requestheader包含applicationId和username),我可以想象这可能是原因。 我还必须为不同的行使用不同的命名空间,这也可能是一个原因。
任何人都可以帮我吗? 谢谢!
答案 0 :(得分:6)
您可以使用信封的implicitTypes属性:
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.implicitTypes = true;
这样生成的xml将不包含i:type。
答案 1 :(得分:1)
有同样的问题,似乎不可能使用PropertyInfo而不用它生成任何i:type。很好的解决方案是覆盖AddProperty(PropertyInfo pi),因此它适用于没有i:Type的任何情况。
提供三种解决方案:
如果你不需要命名空间,那么request.AddProperty(name,value)就可以了!
你可以让你的请求标题成为一个自己的SoapObject,它不会使用“i:type”。
SoapObject requestHeader = new SoapObject(NAMESPACE,"requestheader");
并在最后一行
request.AddSoapObject(requestHeader);
对我来说,它的工作原理是将SoapEnvelope的版本设置为“VER10”,因为这些类型会被忽略。他们仍然在你的请求中但被忽略了。
将SoapEnvelope.VER11
替换为:SoapEnvelope.VER10
答案 2 :(得分:0)
你在哪里创作
SoapSerializationEnvelope sEnvelop;
只需指定sEnvelop.implicitTypes = true;
它不会创建“i:type =”d:string“”或“i:type =”d:long“”内部数据类型标记和Web服务可以成功执行