Как разобрать сложный объект с помощью ksoap2? - PullRequest
0 голосов
/ 02 ноября 2018

Я использую Android Studio и ksoap2 (версия 3.6.2) для подключения к мыльному веб-сервису и получаю взамен SoapObject, но не , как ожидалось. У меня проблемы с созданием кода для вложенных свойств в запросе xml. Веб-служба всегда отправляет один и тот же ответ, даже добавляя свойства к запросу (.xml-запрос отлично работает на SoapUI, и веб-служба отправляет правильный ответ).

Вот XML-файл, который мне нужно отправить с Android:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org    /soap/envelope/" xmlns:glob="http://abc.def">
   <soapenv:Header/>
   <soapenv:Body>
      <glob:MaterialByElements>
        <MaterialSelectionByElements>
          <SelectionByID>
            <Code>I</Code>
            <TypeCode>1</TypeCode>
            <ID>IM-640</ID>
          </SelectionByID>
        </MaterialSelectionByElements>         
      </glob:MaterialByElements>
   </soapenv:Body>
</soapenv:Envelope> 

А вот код в Android:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

SoapObject SelectionByID = new SoapObject(NAMESPACE, "SelectionByID");
SelectionByID .addProperty("Code", "I");
SelectionByID .addProperty("TypeCode", "1");
SelectionByID .addProperty("ID", "IM-640-1045");

SoapObject MaterialSelectionByElements = new SoapObject(NAMESPACE,"MaterialSelectionByElements");

MaterialSelectionByElements.addSoapObject(SelectionByID);
request.addSoapObject(MaterialSelectionByElements);

Но веб-сервис всегда отправляет ответ, как будто я должен отправить это по запросу:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org    /soap/envelope/" xmlns:glob="http://abc.def">
   <soapenv:Header/>
   <soapenv:Body>
      <glob:MaterialByElements>        
       <MaterialSelectionByElements>

       </MaterialSelectionByElements>         
      </glob:MaterialByElements>
   </soapenv:Body>
</soapenv:Envelope> 

Пожалуйста, любая помощь будет принята с благодарностью. Заранее спасибо!

Примечание. Я уже проверил пространство имен, MethodName и URL в запросе.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 10 ноября 2018

После долгих исследований я нашел ответ. Я работаю с веб-сервисом SAP и карманными устройствами Android. Чтобы выполнить запрос xml с помощью ksoap2, мне пришлось использовать это для создания объекта SoapObject:

        SoapObject request = null;
        SoapObject SelectionByID = new SoapObject(null, "SelectionByID");
        SelectionByID.addProperty("Code", "I");
        SelectionByID.addProperty("TypeCode", "1");
        SelectionByID.addProperty("ID", "IM-640");
        SoapObject MaterialSelectionByElements = new SoapObject("", "MaterialSelectionByElements");
        MaterialSelectionByElements.addSoapObject(SelectionByID);
        request=MaterialSelectionByElements;

Но похоже, что в сериализации ksoap2 используется http://www.w3.org/2001/XMLSchema-instance эщема по умолчанию. Так что мне пришлось сериализовать на пути SAP, используя этот класс:

public static class SAPSerializationEnvelope extends SoapSerializationEnvelope {

    public String namespace;
    public SAPSerializationEnvelope(int version, String namespace) {
        super(version);
        this.namespace= namespace;
    }

    @Override
    public void write(XmlSerializer writer) throws IOException {

        writer.setPrefix("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
        writer.setPrefix("glob", namespace);
        writer.setPrefix("soapenv", env);
        writer.startTag(env, "Envelope");
        writer.startTag(env, "Header");
        writeHeader(writer);
        writer.endTag(env, "Header");
        writer.startTag(env, "Body");
        writer.setPrefix("glob", namespace);
        writer.startTag(namespace, "MaterialByElementsQuery_sync");
        writeBody(writer);
        writer.endTag(namespace, "MaterialByElementsQuery_sync");
        writer.endTag(env, "Body");
        writer.endTag(env, "Envelope");

    }

    @Override
    public Object getResponse() throws SoapFault {
        return super.getResponse();
    }

}

И это все. XML является ожидаемым веб-сервисом. Я до сих пор не знаю, почему веб-сервисы SAP все еще используют SOAP вместо сервисов Restful. Мы находимся в 2018 году, и этот вид веб-сервисов выглядит немного старым.

...