2012-04-24 6 views
1

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

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

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 (или аналогичный), чтобы проверить, подключены ли вы к нему? – Jens

+0

Спасибо за ур. Ответ: Я использую проводную сеть, но soapui pro работает. Хорошо, как это сделать быстро. –

+0

в эмуляторе Android есть какие-то настройки, необходимые для этого? –

ответ

0

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

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

0

Вы можете установить лимит времени ожидания вручную с помощью ksoap2 library 2.5.2 with dependencies с помощью

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

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

Используйте 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.

Смежные вопросы