Android SOAP wsdl

我正在尝试从SOAP连接到Web服务。 我用PHP开发了SOAP Web服务,它工作正常(在Visual Studio中尝试过)。

首先,这是错误:

09-27 06:28:07.724: E/AndroidRuntime(2057): Caused by: android.os.NetworkOnMainThreadException 09-27 06:28:07.724: E/AndroidRuntime(2057): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.io.IoBridge.connectErrno(IoBridge.java:144) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.io.IoBridge.connect(IoBridge.java:112) 09-27 06:28:07.724: E/AndroidRuntime(2057): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 09-27 06:28:07.724: E/AndroidRuntime(2057): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 09-27 06:28:07.724: E/AndroidRuntime(2057): at java.net.Socket.connect(Socket.java:842) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpConnection.(HttpConnection.java:76) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpConnection.(HttpConnection.java:50) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpEngine.connect(HttpEngine.java:311) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81) 09-27 06:28:07.724: E/AndroidRuntime(2057): at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:197) 09-27 06:28:07.724: E/AndroidRuntime(2057): at org.ksoap2.transport.ServiceConnectionSE.openOutputStream(ServiceConnectionSE.java:126) 09-27 06:28:07.724: E/AndroidRuntime(2057): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:179) 09-27 06:28:07.724: E/AndroidRuntime(2057): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:116) 09-27 06:28:07.724: E/AndroidRuntime(2057): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:111) 09-27 06:28:07.724: E/AndroidRuntime(2057): at com.example.FirstExample.CategoriesActivity.onCreate(CategoriesActivity.java:49) 09-27 06:28:07.724: E/AndroidRuntime(2057): at android.app.Activity.performCreate(Activity.java:5133) 09-27 06:28:07.724: E/AndroidRuntime(2057): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 09-27 06:28:07.724: E/AndroidRuntime(2057): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 09-27 06:28:07.724: E/AndroidRuntime(2057): ... 11 more 

您可以在此处查看完整错误: http : //pastebin.com/cRQ66vrj

这是我在Java中的代码:

 private final String NAMESPACE = "http://10.0.0.20/soap/test_wsdl"; private final String URL = "http://10.0.0.20/info_send/encode.php?wsdl"; private final String SOAP_ACTION = "http://10.0.0.20/info_send/encode.php/select_data"; private final String METHOD_NAME = "select_data"; private String Webresponse = ""; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); try { androidHttpTransport.call(SOAP_ACTION, envelope); SoapPrimitive response; response = (SoapPrimitive)envelope.getResponse(); Webresponse = response.toString(); } catch (SoapFault e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } Log.e("VALUE: ", Webresponse); 

我一直在关注几个教程,但没有一个能够适应我的需求。 所以我正在尝试创建一个满足我想要的方法。 另外,我添加到Manifest:

   

我究竟做错了什么? 此外,如果您可以指出我的方向,那么我可以逐项获取上面代码检索到的值,我会感谢你。 就像是:

 for(int i = 0; i <= variable.size; i++){ Log.e("Value: ", variable[i].ToString()) } 

谢谢。

从你的日志

 at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 

确保您的SOAP请求在AsyncTask (或Service)中运行。

如果你在主线程(也就是活动)中运行它可能会导致上述错误。

有关AsyncTask的信息,请点击此处

这里有一些例子

首先,该例外清楚地说明了您的代码有什么问题

 Caused by: android.os.NetworkOnMainThreadException 

您无法在主线程上执行长时间运行的网络操作。 至少将最后一次方法调用移到异步方法,你可以这样做,

 ExecutorService mExec = Executors.newSingleThreadExecutor(); mExec.execute(new Runnable() { @Override public void run() { try{ androidHttpTransport.call(SOAP_ACTION, envelope); }catch(Exception exc){ exc.printStackTrace(); } } }); 

我必须添加此行以使ksoap2与我的web服务androidHttpTransport.setXmlVersionTag(K.STR_XML_VERSION)一起工作;

我还设置了以下SOAP信封属性

  envelope.encodingStyle = SoapEnvelope.ENV; envelope.setAddAdornments(false); envelope.implicitTypes = false; 

使用AsyncTask进行网络相关操作……

下面是另一种解决方案:只需在代码中添加以下行。

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);