【问题标题】:Android Ksoap2 Setting the namespace for nested (children) typesAndroid Ksoap2 为嵌套(子)类型设置命名空间
【发布时间】:2011-05-12 15:05:25
【问题描述】:

我想将对象SBNInloggBegar 发送到 WCF Web 服务。 SBNInloggBegar 包含对象SBPBegarSBPInloggning,它们又包含许多字符串。 SBPInloggning 还包含SBPSubjekt,包含多个字符串。 我已经使用KvmSerializable 接口对这些类进行了序列化。

我有一个看起来像这样的函数:

private String soap() {
    String returnString = "";

    String NAMESPACE = "Sambruk";
    String METHOD_NAME = "SBAInloggning";
    String SOAP_ACTION = "Sambruk/AuthenticationService/SBAInloggning";
    String URL = "http://exshaerpm.argentum.local/EliasTest/AuthenticationService/AuthenticationService.svc";

    SoapObject soapRequest = new SoapObject(NAMESPACE, METHOD_NAME);

    SBPBegar begar = new SBPBegar();
    begar.setKommun("Skellefteå kommun");

    SBPInloggning inloggning = new SBPInloggning();
    inloggning.setAnvandarnamn("hej");
    inloggning.setLosenord("hopp");

    SBNInloggBegar inloggbegar = new SBNInloggBegar();
    inloggbegar.setBegarData(begar);
    inloggbegar.setInloggningsData(inloggning);

    PropertyInfo prop = new PropertyInfo();
    prop.setName("request");
    prop.setNamespace("http://www.statskontoret.se/sambruk/nyttomeddelanden");
    prop.setType(inloggbegar.getClass());
    prop.setValue(inloggbegar);
    soapRequest.addProperty(prop);

    //soapRequest.addProperty("request", inloggbegar);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //****
    envelope.dotNet = true;
    envelope.implicitTypes = true;
    envelope.setAddAdornments(false);

    envelope.setOutputSoapObject(soapRequest);

    envelope.addMapping("http://www.statskontoret.se/sambruk/nyttomeddelanden", "", SBPBegar.class);
    envelope.addMapping("http://www.statskontoret.se/sambruk/nyttomeddelanden", "", SBPInloggning.class);
    envelope.addMapping("http://www.statskontoret.se/sambruk/sbpinloggning", "", SBPSubjekt.class);

    HttpTransportSE aht = new HttpTransportSE(URL);
    aht.debug = true;

    try
    {
        aht.call(SOAP_ACTION, envelope);
        //SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
        Object o = envelope.getResponse();
        SBNInloggSvar inloggSvar = new SBNInloggSvar((SoapObject) o);
        returnString = inloggSvar.toString();
    }
    catch(Exception e)
    {
        e.printStackTrace();
        returnString = e.toString();
    }
    return returnString;
}

这是发送的内容:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:d="http://www.w3.org/2001/XMLSchema" 
    xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
    <v:Header />
    <v:Body>
        <SBAInloggning xmlns="Sambruk">
            <n0:request                 
                xmlns:n0="http://www.statskontoret.se/sambruk/nyttomeddelanden">
                <BegarData>
                    <Kommun>Skellefte&#229; kommun</Kommun>
                    <AppNamn i:null="true" />
                    <AppVersion i:null="true" />
                    <MaxAntalSvar i:null="true" />
                    <AnropsId i:null="true" />
                    <LastDataVersion i:null="true" />
                </BegarData>
                <Inloggningsdata>
                    <anvandarID i:null="true" />                                
                    <anvandarnamn>hej</anvandarnamn>
                    <organisationsAnvID i:null="true" />
                    <losenord>hopp</losenord>
                    <aktor i:null="true" />
                    <subjekt i:null="true" />
                </Inloggningsdata>
            </n0:request>
        </SBAInloggning>
    </v:Body>
</v:Envelope>

我真的不想为&lt;request&gt; 设置命名空间。相反,我希望为&lt;BegarData&gt;&lt;InloggningsData&gt; 设置&lt;request&gt; 中的命名空间。另外,我希望&lt;BegarData&gt; 为其子级设置命名空间,&lt;InloggningsData&gt; 也是如此,如下所示:

...
<request xmlns:a="http://www.statskontoret.se/sambruk/nyttomeddelanden"     
    xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:BegarData xmlns:b="http://www.statskontoret.se/sambruk/sbpbegar">
        <b:Kommun>test</b:Kommun>
    ...
    </a:BegarData>
    <a:InloggningsData xmlns:b="http://www.statskontoret.se/sambruk/sbpinloggning">
        <b:AnvandarID></b:AnvandarID>
    ...
    </a:InloggningsData>
</request>
...

有什么办法吗?

顺便说一句,我使用的是 2.5.4 版(来自 Google 代码网站)。

【问题讨论】:

  • 你试过这些吗? link
  • 我刚刚发现用方法实现KvmSerializable时,可以设置命名空间字段。它接近我想要的解决方案,但它使每种类型都定义了自己的命名空间。我希望将命名空间写入 之类的标记中,但我希望在其父标记中定义子项的命名空间。
  • @subspider 我已经尝试过该链接,但它对我没有帮助,但还是谢谢!

标签: android wcf soap ksoap2 android-ksoap2


【解决方案1】:

我没有为request 声明任何命名空间,但我添加了到特定类型的映射,如下所示:

envelope.addMapping("http://www.statskontoret.se/sambruk/nyttomeddelanden", "SBNInloggBegar", SBNInloggBegar.class);
envelope.addMapping("http://www.statskontoret.se/sambruk/sbpbegar", "SBPBegar", SBPBegar.class);
envelope.addMapping("http://www.statskontoret.se/sambruk/sbpinloggning", "SBPInloggning", SBPInloggning.class);
envelope.addMapping("http://www.statskontoret.se/sambruk/sbpsubjekt", "SBPSubjekt", SBPSubjekt.class);

另外,我将implicitTypes 设置为true

【讨论】:

  • 对我来说,我使用 ksoap2 与 Magento WS 一起工作。同样的问题,我通过添加implicitTypes=true 来解决它。
  • 映射有什么变化?我的隐式类型也是正确的,但它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2019-02-19
  • 2015-03-09
  • 2011-01-06
  • 1970-01-01
相关资源
最近更新 更多