Это потому, что у вас сложный тип (т.е. объекты), и вы просто добавляете свойство "Простой тип".
проверьте мой ответ здесь , я подробно объяснил, что нужно сделать.
Вам также нужно будет создать локальные классы, которые соответствуют сложному типу, эти локальные классы должны реализовать kvmserializable, например:
<s:element name="GetBoundData">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
</s:sequence>
</s:complexType>
значит, в веб-сервисе существует класс с именем «GetBoundData». Так как, используя ksoap2, вы создаете мыльный конверт вручную, вам придется создать такой класс в вашем приложении, реализуя kvmserializable (который является интерфейсом сериализации ksoap2):
public class GetBoundData implements KvmSerializable {
String Bound;
String Zoom;
@Override
public Object getProperty(int arg0) {
switch (arg0){
case 0:
return Bound;
case 1:
return Zoom;
default:
return null;
}
}
@Override
public int getPropertyCount() {
return 2;//because you have 2 parameters
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
switch(arg0)
{
case 0:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Bound";
break;
case 1:
arg2.type = PropertyInfo.STRING_CLASS;
arg2.name = "Zoom";
break;
default:break;
}
}
@Override
public void setProperty(int arg0, Object arg1) {
switch(arg0)
{
case 0:
Bound = (String)arg1;
break;
case 1:
Zoom = (String)arg1;
break;
default:
break;
}
}
Это то, как вы строите локально соответствие для Классов (объект, то есть сложный тип) на сервере).
Затем вам нужно добавить необходимые свойства, построить конверт, добавить Mapping и Marshalling и отправить запрос. Эти шаги объяснены в ссылке, которую я упомянул выше.
UPDATE
Я объясню вам, что это такое:
<wsdl:message name="GetBoundDataSoapIn">
<wsdl:part name="parameters" element="tns:GetBoundData"/>
</wsdl:message>
Когда это wsdl: сообщение , это означает, что эта функция требуется для веб-службы.
он имеет , что означает, что для него требуется параметр типа GetBoundData, который не является примитивным типом, фактически это сложный тип (объект).
Итак, вот шаги:
1 - вам нужно написать локальное представление, то есть класс, сложного типа GetBoundData (я уже писал выше)
2- В вашем приложении вы должны создать (до вас где) функцию, которая будет вызывать функцию, связанную с «GetBoundDataSoapIn» в веб-сервисе. Поэтому хорошей идеей является создание функции, имя которой имеет значение, например что-то вроде:
public GetBoundData getBoundData()
{
try
{
SoapObject sobj = new SoapObject(YOUR_NAMESPACE,THE_METHOD_NAME);
//------------------------------------------------------------------------------
// GetBoundData :adding property
// <wsdl:message name="GetBoundDataSoapIn">
// <wsdl:part name="parameters" element="tns:GetBoundData"/>
// </wsdl:message>
// GetBoundData has two params:
// <s:element minOccurs="0" maxOccurs="1" name="Bound" type="s:string"/>
// <s:element minOccurs="0" maxOccurs="1" name="Zoom" type="s:string"/>
//
//--------------------------------------------------------------------------
//--------------
// GetBoundData
//--------------
PropertyInfo pi = new PropertyInfo();
pi.setName("GetBoundData");
pi.setValue(Whatever_value_your_supposed_to_put);// these values are "Bound" And "Zoom" , they're supposed to be gotten in your app somewhere
pi.setType(GetBoundData.class);
sobj.addProperty(pi);
//------------------------------
// START BUILDING SOAP ENVELOPE
//------------------------------
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.setOutputSoapObject(sobj);
//---------------------------------------------------------------------------------------
// MAPPINGS:
//---------------------------------------------------------------------------------------
soapEnvelope.addMapping(YOUR_NAMESPACE, GetBoundData.class.getSimpleName(), GetBoundData.class);
//---------------------------------------------------------------------------------------
// MARSHALLING:
//---------------------------------------------------------------------------------------
Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(soapEnvelope);
AndroidHttpTransport aht = new AndroidHttpTransport(YOUR_URL);
aht.debug = true;
try
{
aht.call(YOUR_ACTION, soapEnvelope);
//Importat Outputs to check how the request/Response looks like.. Check Logcat to find these outputs
System.out.println("aht requestDump is :"+aht.requestDump);
System.out.println("aht responseDump is :"+aht.responseDump);
return soapEnvelope.getResponse();
}
catch (Exception e)
{
e.printStackTrace();
return "Exception: " + e.getMessage()+" message IS :" +e.getMessage()+" localizedmessage is :"+e.getLocalizedMessage();
}
}
catch(Exception ex)
{
ex.printStackTrace();
return "Exception: " + ex.getMessage();
}
}
}
Так что проверьте logCat, чтобы увидеть форму запроса и ответа, и вы увидите, если вам нужно получить ответ и проанализировать его, чтобы использовать его, я не уверен, каким будет ваш ответ, но в моем случае это был многомерный массив, поэтому мне пришлось проанализировать его с помощью Java-функций.
как для:
<wsdl:message name="GetBoundDataSoapOut">
<wsdl:part name="parameters" element="tns:GetBoundDataResponse"/>
</wsdl:message>
это просто говорит вам, что веб-сервис отправляет ответ.