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