Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
520 views
in Technique[技术] by (71.8m points)

wcf - Android Ksoap2 Setting the namespace for nested (children) types

I want to send an object, SBNInloggBegar, to a WCF web service. SBNInloggBegar contains the objects SBPBegar and SBPInloggning, which in turn contain a number of strings. SBPInloggning also contain SBPSubjekt, containing a number of strings. I have serialized those classes using the KvmSerializable interface.

I have a function that looks like this:

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;
}

This is what is sent:

<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>

I don't really want to set a namespace for <request>. Instead I want the namespace in <request> to be set for <BegarData> and <InloggningsData>. Also, I want <BegarData> to set a namespace for it's children, and the same thing for <InloggningsData>, like this:

...
<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>
...

Is there any way to do this?

By the way, I'm using version 2.5.4 (from the Google Code site).

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I didn't declare any namespace for request, but I added a mapping to the specific type, like this:

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);

Also, I set implicitTypes to true.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...