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

1

Я хочу получить ответ от веб-службы 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, и он работает нормально. В моем logcat я получил следующее исключение:

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.

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

  • 1
    Кажется, java.net.SocketTimeoutException означает, что вы пытаетесь установить связь с сервисом, который не открыт. Предполагая, что ваш URL адрес указывает на службу SAP, доступную только во внутренней сети - как вы к ней подключаетесь, только WiFi? Можете ли вы использовать Wireshark (или аналогичный), чтобы проверить, подключаетесь ли вы к нему?
  • 0
    Спасибо за ваш ответ. Я пользуюсь проводной сетью, но soapui pro работает. Отлично, как сделать это быстро
Показать ещё 4 комментария
Теги:
soap
web-services
android-ksoap2

3 ответа

1

Избегайте использования SOAP в android.. потому что это не рекомендуется.

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

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

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

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

0

Вы можете установить лимит времени ожидания вручную, используя библиотеку ksoap2 2.5.2 с зависимостями, используя

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL,Time_Out);
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню