2011-05-12 3 views
0

SBNInloggBegar 객체를 WCF 웹 서비스에 보내려고합니다. SBNInloggBegar에는 SBPBegarSBPInloggning의 개체가 포함되어 있으며 여러 문자열이 차례로 포함됩니다. SBPInloggning에는 SBPSubjekt이 포함되어 있으며 여러 문자열이 들어 있습니다. KvmSerializable 인터페이스를 사용하여 해당 클래스를 직렬화했습니다.Android Ksoap2 중첩 된 (하위) 유형의 네임 스페이스 설정

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

이 전송되는 것입니다 : : 정말 <request>에 대한 네임 스페이스를 설정하지 않으

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

나는 다음과 같다 기능을 가지고있다. 대신 <BegarData><InloggningsData><request>의 네임 스페이스를 설정해야합니다. 또한,이 같은 <BegarData><InloggningsData>에 대한 그것의 아이들을위한 공간과 같은 일을 설정하려면 :

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

이 작업을 수행 할 수있는 방법이 있습니까?

그런데 Google 코드 사이트에서 2.5.4 버전을 사용하고 있습니다.

+0

이것들을 사용해 보셨습니까? [link] (http://seesharpgears.blogspot.com/2010/10/ksoap-android-web-service-tutorial-with.html) – PedroAGSantos

+0

방금 ​​KvmSerializable을 메소드로 구현할 때 네임 스페이스 필드를 설정할 수 있다는 것을 알았습니다. . 그것은 내가 원하는 솔루션에 가깝지만 모든 유형이 자신의 네임 스페이스를 정의하게 만듭니다. 와 같은 태그에 네임 스페이스를 쓰고 싶지만 부모 태그에 네임 스페이스를 정의하고 싶습니다. – Shathur

+0

@subspider 나는 이미 그 링크를 시도해 봤지만 나에게 도움이되지 못했지만 어쨌든 고마워! – Shathur

답변

2

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

은 또한, 나는 trueimplicitTypes을 설정합니다.

+0

Magento WS에서 ksoap2를 사용합니다. 동일한 문제와 나는 implicitTypes = true를 추가하는 것으로 해결했다. – leegor

+0

매핑의 변경 내용은 무엇입니까? 내 암시 적 유형도 사실이지만 작동하지 않습니다. – Umair

관련 문제