GetResponse от веб-сервисов SOAP в Android

Я хочу получить ответ от веб-службы SAP SOAP, но получаю исключение.

Я использую следующий код:

package com.veee.pack;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import java.io.IOException;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.ksoap2.transport.HttpTransportBasicAuth;
import org.ksoap2.transport.HttpTransportSE;
import org.w3c.dom.Element;
import org.xmlpull.v1.XmlPullParserException;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WeservicesExampleActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //getting these values from wsdl file
       //username and password appended as URL Parameters
         final String NAMESPACE = "urn:sap-com:document:sap:soap:functions:mc-style";
         final String URL = "http://*********:8000/sap/bc/srt/wsdl/srvc_14DAE9C8D79F1EE196F1FC6C6518A345/wsdl11/allinone/ws_policy/document?sap-client=800&sap-user******&sap-password=************";
         final String METHOD_NAME = "Z_GET_CUST_GEN";
         final String SOAP_ACTION = "urn:sap-com:document:sap:soap:functions:mc-style/Z_GET_CUST_GEN";

        SoapObject request =new SoapObject(NAMESPACE, METHOD_NAME);

        request.addProperty("Input", "1460");
        request.addProperty("Langu", "d");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);

        envelope.setOutputSoapObject(request);

        HttpTransportSE httptransport=new HttpTransportSE(URL);
        httptransport.debug = true;
        try {

          //calling the services
         httptransport.call(SOAP_ACTION, envelope);

         Object result = (Object) envelope.getResponse();

        //getting the Response Here.

         System.out.println("Result" + result.toString());

        }
        catch (IOException e) 
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XmlPullParserException e) {
        // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Когда я отлаживаю приложение, оно завершается на

httptransport.call(SOAP_ACTION, envelope); 

Я запустил несколько примеров, используя ksoap2 в Android, он работает нормально. Я получил следующее исключение в своем логарифме:

04-24 12:19:17.935: WARN/System.err(1569): java.net.SocketTimeoutException
04-24 12:19:17.935: WARN/System.err(1569):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:130)

Пожалуйста, дайте любое предложение по преодолению этой проблемы или отправьте, как я могу сделать запрос и получить ответ через XML в Android.

Заранее спасибо.....


person Venkatasubbaiah Atluru    schedule 24.04.2012    source источник
comment
java.net.SocketTimeoutException, по-видимому, подразумевает, что вы пытаетесь связаться с сервисом, который не открыт. Предполагая, что ваш адрес URL указывает на службу SAP, доступную только в вашей внутренней сети, как вы подключаетесь к ней, только через WiFi? Можете ли вы использовать Wireshark (или аналогичный), чтобы проверить, подключаетесь ли вы к нему?   -  person Jens    schedule 24.04.2012
comment
Спасибо за ваш ответ. Я использую Wired net, но soapui pro работает нормально, как сделать это быстро   -  person Venkatasubbaiah Atluru    schedule 24.04.2012
comment
в эмуляторе Android нужны ли для этого какие-либо настройки?   -  person Venkatasubbaiah Atluru    schedule 24.04.2012
comment
Проводная сеть? Никогда не слышал об этом сетевом анализаторе. В любом случае, поскольку вы, очевидно, работаете на эмуляторе, что вы видите в журналах подключений в сетевом анализаторе? Используете ли вы прокси в своей сети? Можете ли вы, используя веб-браузер по умолчанию в эмуляторе, перейти на какой-нибудь случайный веб-сайт, такой как www.google.com?   -  person Jens    schedule 24.04.2012
comment
Да, я использую проводную сеть на своем компьютере. Это будет сеть на основе маршрутизатора. Я просматриваю некоторые сайты в браузере эмулятора Android, и он отлично работает для меня.   -  person Venkatasubbaiah Atluru    schedule 24.04.2012
comment
всякий раз, когда я устанавливаю интернет-разрешение для приложения, оно показывает, что иначе оно не может открыться?   -  person Venkatasubbaiah Atluru    schedule 24.04.2012


Ответы (3)


ИЗБЕГАЙТЕ использования SOAP в Android, потому что это не рекомендуется.

Используйте веб-сервисы Restful, официально поддерживаемые Android. Если ваш провайдер веб-сервиса не может предоставить услугу Restful,... столкнитесь с некоторыми проблемами, например, приложение не будет работать несколько раз и может не работать на некоторых устройствах Android.

Чтобы избавиться от проблем с реализацией ksoap2, играйте с несколькими драйверами ksoap2, вынесите логику сетевых вызовов в отдельный поток.

Вызов httptransport.call(SOAP_ACTION, конверт); потребляет огромную память, больше времени и, следовательно, избегает использования этого вызова в основном потоке. Попробуйте в новом создать эмулятор и одно из устройств. KSOAP2 работает от 20 до 50% устройств Android. Иногда он может не работать на устройстве того же производителя, например, он может работать в HTC Sense 2.3.4 и не работать в версии 2.3.5 HTC Sense.

Рекомендуется использовать Restful Webservices.

person Sree Rama    schedule 12.07.2012

Исключение socketTimeoutException возникает, когда сокет не может прочитать или принять в течение определенного интервала времени. Вы всегда должны быть готовы к чему-то подобному и использовать try/catch в своем коде для обработки таких ситуаций.

Для доступа к веб-сервисам в целом; убедитесь, что ваше приложение имеет android.permission.INTERNET в своем манифесте, и убедитесь, что веб-служба доступна из эмулятора. Вы можете использовать код из этого сообщения, чтобы проверить, доступен ли ваш сервис.

person THelper    schedule 26.04.2012