После долгих исследований я нашел ответ. Я работаю с веб-сервисом 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 году, и этот вид веб-сервисов выглядит немного старым.