2011-06-09 3 views
0

J'utilise ksoap2-Android sur un projet Android pour télécharger un fichier. Ça ne fonctionne pas.Envoyer des objets complexes, des pièces jointes avec ksoap2-Android

D'abord, mon wsdl ressemble à ceci:

<xsd:element name="Op1RequestType"> 
    <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element name="date" type="xsd:dateTime"/> 
      <xsd:element maxOccurs="unbounded" minOccurs="0" name="imgFile" 
       type="tns:Attachment"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

Et "tns: pièce jointe" est définie comme suit:

<xsd:complexType name="Attachment"> 
    <xsd:sequence> 
     <xsd:element name="file" type="xsd:base64Binary"/> 
     <xsd:element name="filename" type="xsd:string"/> 
    </xsd:sequence> 
</xsd:complexType> 

Je crée un SoapSerializationEnvelope et en ajoutant dans la propriété avec le nom date et la valeur en tant que représentation sous forme de chaîne de la date actuelle. Cela fonctionne correctement, même si je n'ajoute pas de fichier (notez le minOccurs="0"). Cependant, lorsque je tente d'ajouter un fichier, il échoue horriblement:

Tout d'abord, je fais un représentant du type Attachment en créant un SoapObject qui a les propriétés file et filename, des types byte[].class et String.class respectivement.

Ensuite, j'ajoute ces objets à un vecteur générique (pour représenter la multiplicité de l'élément imgFile) et j'attache le vecteur en tant que propriété à l'enveloppe. Cela crée un message SOAP avec succès, et la réponse du serveur soulève une exception (car il est un message d'erreur, au lieu d'une réponse appropriée, car en quelque sorte mon entrée est pas bon ...):

WARN/System.err(438): SoapFault - faultcode: 'soapenv:Server' 
faultstring:'org.apache.axis2.databinding.ADBException: Unexpected subelement imgFile' 
faultactor: 'null' detail: [email protected] 

Ok , alors qu'est-ce que je fais mal? Est-il possible de voir l'enveloppe SOAP de la demande que j'envoie?

+0

Je suis sûr que mon service Web fonctionne bien, d'ailleurs. J'ai fait des clients pour cela avec d'autres outils: wsdl2objc pour iPhone, wsdl2java pour Java non-Android. – bdares

Répondre

0

Je peux voir l'enveloppe SOAP de demande en appelant getRequest() sur SoapSerializationEnvelope. Cela m'a permis de voir que l'objet vectoriel place chaque paire (fichier, nom de fichier) dans une balise <item></item>, ce qui a brisé le format. J'insère maintenant plusieurs éléments successivement comme le demande wsdl.

Questions connexes