Отправка сложных объектов, вложений с помощью ksoap2-Android

#serialization #android-ksoap2

#сериализация #android-ksoap2

Вопрос:

Я использую ksoap2-Android в проекте Android для загрузки файла. Это не работает.

Прежде всего, мой wsdl выглядит следующим образом:

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

И «tns: вложение» определяется следующим образом:

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

Я создаю SoapSerializationEnvelope и добавляю свойство с именем date и значением в качестве строкового представления текущей даты. Это работает успешно, даже если я не добавляю файл (обратите внимание на minOccurs="0" ). Однако, когда я пытаюсь добавить файл, происходит ужасный сбой:

Сначала я создаю представитель Attachment типа, создавая SoapObject который обладает свойствами file и filename типов byte[].class и String.class соответственно.

Затем я добавляю эти объекты в общий вектор (для представления кратности imgFile элемента) и прикрепляю вектор в качестве свойства к конверту. Это успешно создает сообщение SOAP, и ответ от сервера вызывает исключение (потому что это сообщение об ошибке, а не правильный ответ, потому что почему-то мой ввод не подходит …):

 WARN/System.err(438): SoapFault - faultcode: 'soapenv:Server' 
faultstring:'org.apache.axis2.databinding.ADBException: Unexpected subelement imgFile'
faultactor: 'null' detail: org.kxml2.kdom.Node@4676b8a0
  

Хорошо, так что я делаю не так? Есть ли способ просмотреть конверт SOAP запроса, который я отправляю?

Комментарии:

1. Кстати, я уверен, что мой веб-сервис работает нормально. Я создал клиенты для этого с помощью других инструментов: wsdl2objc для iPhone, wsdl2java для Java, отличной от Android.

Ответ №1:

Я могу увидеть конверт SOAP запроса, вызвав getRequest() в SoapSerializationEnvelope. Это позволило мне увидеть, что векторный объект фактически помещает каждую пару (файл, filename) в <item></item> тег, что нарушает формат. Теперь я вставляю несколько элементов последовательно, как того требует wsdl.