5

我已经尝试在互联网上阅读有关我的问题的信息,但找不到所需的正确信息,因此我尝试解释我的问题:

我正在使用 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 组成)我可以想象这可能是原因。我还必须为不同的行使用不同的命名空间,这也可能是一个原因。

有人可以帮我吗?谢谢!

4

3 回答 3

6

您可以使用信封的implicitTypes 属性:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.implicitTypes = true;

这样生成的 xml 将不包含 i:type。

于 2014-06-06T12:27:35.830 回答
2

有同样的问题,似乎不可能使用 PropertyInfo 而不生成任何 i:type 。不错的解决方案是覆盖 AddProperty(PropertyInfo pi),因此它适用于任何没有 i:Type 的情况。

提供三种解决方案:

1

如果你不需要命名空间,那么 request.AddProperty(name,value) 就可以了!

2

你可以让你的请求头成为一个自己的 SoapObject,它不会使用“i:type”。

SoapObject requestHeader = new SoapObject(NAMESPACE,"requestheader"); 

在最后一行

request.AddSoapObject(requestHeader);

3

对我来说,将 SoapEnvelope 的版本设置为“VER10”是可行的,因为那时这些类型被忽略了。它们仍在您的请求中,但被忽略了。将:替换SoapEnvelope.VER11为:SoapEnvelope.VER10

于 2012-10-11T09:36:12.510 回答
0

你在哪里创作

 SoapSerializationEnvelope sEnvelop;

只需分配sEnvelop.implicitTypes = true;

它不会创建 "i:type="d:string"" 或 "i:type="d:long"" 内部数据类型标签,并且 Web 服务可以成功执行

于 2017-01-12T13:41:54.493 回答