【问题标题】:Removing i:type field in SOAP request generated by kSoap2 on Android删除 Android 上 kSoap2 生成的 SOAP 请求中的 i:type 字段
【发布时间】:2012-04-24 21:20:58
【问题描述】:

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

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

有人可以帮我吗? 谢谢!

【问题讨论】:

  • 附加信息:我使用的是 kSoap 2.6.3,我想去掉为“requestheader”生成的开始标记中的 i:type 字段。
  • @Niels_D..你解决问题了吗..如果你发布一个解决方案会很棒..

标签: android soap ksoap2 android-ksoap2 ksoap


【解决方案1】:

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

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

这样生成的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"); 
    

    在最后一行

    request.AddSoapObject(requestHeader);
    

    3

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

    【讨论】:

      【解决方案3】:

      你在哪里创作

       SoapSerializationEnvelope sEnvelop;
      

      只需分配sEnvelop.implicitTypes = true;

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多