2010-09-02 4 views
0

Je suis confronté à un problème dans l'envoi d'un tableau d'objet complexe à partir d'un client J2ME utilisant KSOAP service web .net (services de savon).Envoyer un tableau d'objets complexes en utilisant ksoap2 au service Web .NET

mon fichier TestSoap.java a une méthode setArr() qui prend un tableau d'objet PropHeaderMapBin et l'envoie au service Web qui renvoie un entier (nombre d'objets PropHeaderMapBin)

TestSoap.java 

package org.tempuri; 

    import com.n9ciphers.test.Constants; 
    import java.util.Vector; 
    import org.ksoap2.SoapEnvelope; 
    import org.ksoap2.serialization.PropertyInfo; 
    import org.ksoap2.serialization.SoapObject; 
    import org.ksoap2.serialization.SoapSerializationEnvelope; 
    import org.ksoap2.transport.HttpTransport; 
    import org.tempuri.PropHeaderMapBin; 

    public final class TestSoap { 

     public int setArr(PropHeaderMapBin[] inArr) throws Exception { 

      SoapObject _client = new SoapObject("http://tempuri.org/", "SetArr"); 
      SoapObject[] _propHeaderMapBinSO = new SoapObject[inArr.length]; 

      PropHeaderMapBin[] prop = inArr; 
      //PropHeaderMapBin[] prop = new PropHeaderMapBin[inArr.length]; 
      Vector _propVector = new Vector(inArr.length); 
      if (inArr != null) { 

       //System.out.println("_len " + inArr.length); 

       for (int i = 0; i < inArr.length; i++) { 
        _propHeaderMapBinSO[i] = new SoapObject("http://tempuri.org/", "PropHeaderMapBin"); 
        _propHeaderMapBinSO[i].addProperty("PropertyName", prop[i].getPropertyName()); 
        _propHeaderMapBinSO[i].addProperty("value", prop[i].getValue()); 
        _propHeaderMapBinSO[i].addProperty("HeaderText", prop[i].getHeaderText()); 
        _propHeaderMapBinSO[i].addProperty("label", prop[i].getLabel()); 

        _propVector.addElement(_propHeaderMapBinSO[i]); 
       } 
      } 

      _client.addProperty(pi, _propVector); 

      SoapSerializationEnvelope _envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      _envelope.addMapping("http://www.tempuri.org/", "PropHeaderMapBin", new PropHeaderMapBin().getClass()); 
      //_envelope.addTemplate (_client); 
      _envelope.bodyOut = _client; 
      _envelope.dotNet = true; 

      HttpTransport _ht = new HttpTransport(Constants.endPoint + "Test.asmx"); 
      _ht.debug = true; 
      _ht.call("http://tempuri.org/SetArr", _envelope); 

      //System.out.println("response: " + result.toString()); 

      System.out.println("Request Dump:" + _ht.requestDump); 
      //Dialog.show("Request Dump", _ht.requestDump, Dialog.TYPE_INFO, null, "OK", null); 
      System.out.println("Response Dump:" + _ht.responseDump); 
      //Dialog.show("Response Dump", _ht.responseDump, Dialog.TYPE_INFO, null, "OK", null); 

      return Integer.parseInt(_envelope.getResponse().toString()); 
      //return 0; 
     } 
    } 

sortie de setArr () appel de méthode. le serveur ne reconnaît pas le type de données des objets tableau et il définit le arrayType à anyType [3] et renvoie un 0 au lieu de 3.

Request Dump: 
<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> 
     <SetArr xmlns="http://tempuri.org/" id="o0" c:root="1"> 
      <inArr i:type="c:Array" c:arrayType="d:anyType[3]"> 
       <item i:type="n0:PropHeaderMapBin" xmlns:n0="http://tempuri.org/"> 
        <PropertyName i:type="d:string">1</PropertyName> 
        <value i:type="d:string">1</value> 
        <HeaderText i:type="d:string">Pradhan</HeaderText> 
        <label i:type="d:string">Pradhan</label> 
       </item> 
       <item i:type="n1:PropHeaderMapBin" xmlns:n1="http://tempuri.org/"> 
        <PropertyName i:type="d:string">2</PropertyName> 
        <value i:type="d:string">2</value> 
        <HeaderText i:type="d:string">Kavya</HeaderText> 
        <label i:type="d:string">Kavya</label> 
       </item> 
       <item i:type="n2:PropHeaderMapBin" xmlns:n2="http://tempuri.org/"> 
        <PropertyName i:type="d:string">3</PropertyName> 
        <value i:type="d:string">3</value> 
        <HeaderText i:type="d:string">Puchi</HeaderText> 
        <label i:type="d:string">Puchi</label> 
       </item> 
      </inArr> 
     </SetArr> 
    </v:Body> 
</v:Envelope> 


Response Dump:<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <SetArrResponse xmlns="http://tempuri.org/"> 
      <SetArrResult>0</SetArrResult> 
     </SetArrResponse> 
    </soap:Body> 
</soap:Envelope> 
response = 0 

mon fichier wsdl pour référence

<wsdl:definitions targetNamespace="http://tempuri.org/"> 
    <wsdl:types> 
     <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/"> 
      <s:element name="GetArr"> 
       <s:complexType/> 
      </s:element> 
      <s:element name="GetArrResponse"> 
       <s:complexType> 
        <s:sequence> 
         <s:element minOccurs="0" maxOccurs="1" name="GetArrResult" type="tns:ArrayOfPropHeaderMapBin"/> 
        </s:sequence> 
       </s:complexType> 
      </s:element> 
      <s:complexType name="ArrayOfPropHeaderMapBin"> 
       <s:sequence> 
        <s:element minOccurs="0" maxOccurs="unbounded" name="PropHeaderMapBin" nillable="true" type="tns:PropHeaderMapBin"/> 
       </s:sequence> 
      </s:complexType> 
      <s:complexType name="PropHeaderMapBin"> 
       <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" name="PropertyName" type="s:string"/> 
        <s:element minOccurs="0" maxOccurs="1" name="value" type="s:string"/> 
        <s:element minOccurs="0" maxOccurs="1" name="HeaderText" type="s:string"/> 
        <s:element minOccurs="0" maxOccurs="1" name="label" type="s:string"/> 
       </s:sequence> 
      </s:complexType> 
      <s:element name="SetArr"> 
       <s:complexType> 
        <s:sequence> 
         <s:element minOccurs="0" maxOccurs="1" name="inArr" type="tns:ArrayOfPropHeaderMapBin"/> 
        </s:sequence> 
       </s:complexType> 
      </s:element> 
      <s:element name="SetArrResponse"> 
       <s:complexType> 
        <s:sequence> 
         <s:element minOccurs="1" maxOccurs="1" name="SetArrResult" type="s:int"/> 
        </s:sequence> 
       </s:complexType> 
      </s:element> 
     </s:schema> 
    </wsdl:types> 
    <wsdl:message name="GetArrSoapIn"> 
     <wsdl:part name="parameters" element="tns:GetArr"/> 
    </wsdl:message> 
    <wsdl:message name="GetArrSoapOut"> 
     <wsdl:part name="parameters" element="tns:GetArrResponse"/> 
    </wsdl:message> 
    <wsdl:message name="SetArrSoapIn"> 
     <wsdl:part name="parameters" element="tns:SetArr"/> 
    </wsdl:message> 
    <wsdl:message name="SetArrSoapOut"> 
     <wsdl:part name="parameters" element="tns:SetArrResponse"/> 
    </wsdl:message> 
    <wsdl:portType name="TestSoap"> 
     <wsdl:operation name="GetArr"> 
      <wsdl:input message="tns:GetArrSoapIn"/> 
      <wsdl:output message="tns:GetArrSoapOut"/> 
     </wsdl:operation> 
     <wsdl:operation name="SetArr"> 
      <wsdl:input message="tns:SetArrSoapIn"/> 
      <wsdl:output message="tns:SetArrSoapOut"/> 
     </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="TestSoap" type="tns:TestSoap"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="HelloWorld"> 
      <soap:operation soapAction="http://tempuri.org/HelloWorld" style="document"/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="GetArr"> 
      <soap:operation soapAction="http://tempuri.org/GetArr" style="document"/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="SetArr"> 
      <soap:operation soapAction="http://tempuri.org/SetArr" style="document"/> 
      <wsdl:input> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:binding name="TestSoap12" type="tns:TestSoap"> 
     <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="GetArr"> 
      <soap12:operation soapAction="http://tempuri.org/GetArr" style="document"/> 
      <wsdl:input> 
       <soap12:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap12:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
     <wsdl:operation name="SetArr"> 
      <soap12:operation soapAction="http://tempuri.org/SetArr" style="document"/> 
      <wsdl:input> 
       <soap12:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap12:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="Test"> 
     <wsdl:port name="TestSoap" binding="tns:TestSoap"> 
      <soap:address location="http://xxx.xxx.xxx.xxx/Services/Test.asmx"/> 
     </wsdl:port> 
     <wsdl:port name="TestSoap12" binding="tns:TestSoap12"> 
      <soap12:address location="http://xxx.xxx.xxx.xxx/Services/Test.asmx"/> 
     </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

I wud apprécier toute aide si quelqu'un a déjà fait face à ce genre de problème et résolu avec succès.

+0

user435696: Avez-vous trouvé une solution à ce problème? J'ai le même problème. Vos informations ci-dessus m'ont beaucoup aidé. –

+0

quelle était la solution à cela? J'ai essayé le soapUI mais ne peux pas sembler repérer n'importe quelle grande différence entre les demandes de soapUI de ksoap2 et de s – AhmedW

Répondre

1

Je peux vous donner indice pour résoudre un problème.

en utilisant l'outil soapUI Créer un projet de service Web avec la même WSDL (il est très facile et rapide).

Comparez votre décharge de demande avec le corps de savon produit par soapUI. Vous découvrirez la différence et

solution donc.

0

@Rajnikant l'avait sur place. Si vous avez des services Web wcf qui ne fonctionnent pas, utilisez SOAPui pour importer les points de terminaison wsdl. Cela créera un harnais de test pour les méthodes que vous pouvez ensuite utiliser pour appeler vos méthodes wcf et voir le vidage de la requête. Comparez cela avec le vidage de la demande du mobile (en utilisant androidHttpTransport.requestDump) ..... notez les paramètres étant passés et leurs espaces de noms .... c'est très important

Questions connexes