在Android上的kSoap2生成的SOAP请求中删除i:type字段

Nie*_*s_D 4 android soap ksoap ksoap2 android-ksoap2

我已经尝试过阅读互联网关于我的问题,但我找不到我需要的正确信息,所以我试着解释我的问题:

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

现在,为了序列化这个,我使用以下内容:

// 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);
Run Code Online (Sandbox Code Playgroud)

因为我使用嵌套的soap(requestheader包含applicationId和username),我可以想象这可能是原因.我还必须为不同的行使用不同的命名空间,这也可能是一个原因.

任何人都可以帮我吗?谢谢!

小智 6

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

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.implicitTypes = true;
Run Code Online (Sandbox Code Playgroud)

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


小智 2

有同样的问题,似乎不可能在不生成任何 i:type 的情况下使用 PropertyInfo。不错的解决方案是重写 AddProperty(PropertyInfo pi) ,这样它就可以在没有 i:Type 的任何情况下工作。

提供三种解决方案:

1

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

2

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

SoapObject requestHeader = new SoapObject(NAMESPACE,"requestheader"); 
Run Code Online (Sandbox Code Playgroud)

在最后一行

request.AddSoapObject(requestHeader);
Run Code Online (Sandbox Code Playgroud)

3

对我来说,将 SoapEnvelope 的版本设置为“VER10”很有效,因为类型会被忽略。它们仍在您的请求中,但已被忽略。SoapEnvelope.VER11用。。。来代替:SoapEnvelope.VER10