Получение пользовательских объектов из веб-службы .NET на базе SOAP в Android - PullRequest
3 голосов
/ 03 февраля 2012

Я разрабатываю приложение для Android, которому необходимо подключиться к веб-службе .NET SOAP и сгенерировать / заполнить несколько объектов из ответа. Я совершенно новичок в веб-сервисах и SOAP и относительно новичок в Android. Веб-сервис уже построен (не мной).

Я пытался найти информацию о подключении к веб-службам SOAP в Android. Два основных предложения выглядят так:

  1. Не используйте SOAP,
  2. Если вы используете 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, ни в том, что у меня там должно быть. Благодарю.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

Используйте ksoap2 и проверьте мои ответы с примерами кода по следующим ссылкам: Ссылка1 , ссылка2 , ссылка3 .Я написал некоторые детали, которые помогут вам понять, как начать кодирование.
дайте мне знать, если вам нужна помощь.

ОБНОВЛЕНИЕ (отвечая на ваш вопрос о картографировании и маршалинге)
вы используете addMapping, когда вы отправляете aсложный тип (то есть объект) через мыльную оболочку.Как веб-сервис распознает сложный тип?вам нужно создать локально класс, который реализует kvmserializable (как упомянуто в моих ссылках), который будет иметь тот же параметр, что и объект на сервере, а затем вам нужно добавить отображение между ним и классом, который сопоставляется сэто на сервере, так что конверт при разборе на сервере знает, что этот комплексный тип X сопоставляется с классом X на сервере.Поэтому, если вы не отправляете сложный тип, вам не нужно добавлять сопоставление. ( PS: я вижу, что вы не отправляете сложный тип, так как nationalID имеет тип string. IF позволяет сказать, что nationalID был сложным типом типа Z вы бы сделали: addMapping (NAMESPACE, Z.class.getSimpleName (), Z.class) )

Что касается маршаллинга, он использует сериализацию Java для преобразования объектов в потокданных, которые будут распакованы на веб-сервисе.Поэтому, когда вы отправляете сложный тип, исходя из моего опыта, хорошей практикой является добавление сортировки для преобразования сложного типа в потоки данных путем его сериализации.Если вы обнаружите, что он вам не нужен, просто не добавляйте его, но всегда полезно понять, какие есть варианты.

0 голосов
/ 04 февраля 2012

Посмотрите на это http://seesharpgears.blogspot.com/2010/10/ksoap-android-web-service-tutorial-with.html, есть примеры того, как передавать сложные объекты.

...