Я разрабатываю приложение для Android, которому необходимо подключиться к веб-службе .NET SOAP и сгенерировать / заполнить несколько объектов из ответа. Я совершенно новичок в веб-сервисах и SOAP и относительно новичок в Android. Веб-сервис уже построен (не мной).
Я пытался найти информацию о подключении к веб-службам SOAP в Android. Два основных предложения выглядят так:
- Не используйте SOAP,
- Если вы используете SOAP, используйте KSOAP2.
Я просмотрел различные учебные пособия по KSOAP2, но все они, похоже, имеют дело только с самыми основными, примитивными типами, такими как отправка 2-х int для возврата 1 int или отправка и получение строк; однако мне нужно отправлять пользовательские объекты туда и обратно.
Можно ли отправлять и получать пользовательские объекты с помощью KSOAP2? Если да, то насколько это легко / сложно? Нужно ли анализировать XML для создания / заполнения объектов «вручную»?
EDIT / UPDATE:
Пытаясь какое-то время подключиться к существующему веб-сервису (принимает строку и возвращает сложный объект) и получая ошибку, я решил попробовать более простой подход. Я подключился к более простому веб-сервису, который не принимает никаких параметров и возвращает int. Этот более простой веб-сервис размещен в том же месте, что и исходный, и теперь этот простой мне подходит.
ДОПОЛНИТЕЛЬНОЕ ОБНОВЛЕНИЕ:
Теперь все работает нормально! Оказывается, у меня только что произошла ошибка с заглавными буквами, которая отбрасывала мой параметр.
Последняя проблема была "национальная" против "национальной". Вот код, сгенерированный soapUI:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:GetClientByNationalID>
<!--Optional:-->
<tem:nationalID>XXXXXXX</tem:nationalID>
</tem:GetClientByNationalID>
</soapenv:Body>
</soapenv:Envelope>
И код запроса, который генерировался моей Java:
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<GetClientByNationalID xmlns="http://tempuri.org/" id="o0" c:root="1">
<NationalID i:type="d:string">
XXXXXXXX
</NationalID>
</GetClientByNationalID>
</v:Body>
</v:Envelope>
Мой окончательный код Java:
public void webServiceCall() {
String NAMESPACE = "http://tempuri.org/";
String METHOD_NAME = "GetClientByNationalID";
String SOAP_ACTION = "http://tempuri.org/IClientService/GetClientByNationalID";
// unsecure service
String URL = "http://XXXXXXXXXXXXXXXXXXXX.net/FPUnSecureService/ClientService.svc";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
String clientID = "XXXXXXX";
PropertyInfo pi = new PropertyInfo();
pi.setName("nationalID");
pi.setValue(clientID);
pi.setType(clientID.getClass());
request.addProperty(pi);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
envelope.addMapping(NAMESPACE, "GetClientByNationalID", new ClientID().getClass());
Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(envelope);
HttpTransportSE t = new HttpTransportSE(URL);
ClientID client = new ClientID();
t.debug = true;
try {
Log.i("webServiceCall", "Trying call to web service");
t.call(SOAP_ACTION, envelope);
SoapObject response = (SoapObject) envelope.getResponse();
Log.i("success", response.getPropertyAsString(0));
Log.i("success", response.getPropertyAsString(1));
Log.i("success", response.getPropertyAsString(2));
Log.i("success", response.getPropertyAsString(3));
Log.i("success", response.getPropertyAsString(4));
} catch (Exception e) {
Log.e("webServiceCall", "Error calling webservice.");
e.printStackTrace();
System.out.println("Request: " + t.requestDump);
System.out.println("Response: " + t.responseDump);
}
}
Я все еще не понимаю эти строки:
envelope.addMapping(NAMESPACE, "GetClientByNationalID", new ClientID().
Marshal floatMarshal = new MarshalFloat();
floatMarshal.register(envelope);
Я думаю, что добавил части маршала, когда передавал объект в качестве параметра, я не уверен, что они мне все еще нужны. Я также не уверен ни в вызове addMapping, ни в том, что у меня там должно быть. Благодарю.