简体   繁体   English

Android SOAP wsdl

[英]Android SOAP wsdl

I'm trying to connect to a Webservice from SOAP. 我正在尝试从SOAP连接到Web服务。 I developed the SOAP Webservice in PHP and it's working fine (tried in Visual Studio). 我用PHP开发了SOAP Web服务,并且运行良好(在Visual Studio中尝试过)。

First of all, this is the error: 首先,这是错误:

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.<init>(HttpConnection.java:76)
09-27 06:28:07.724: E/AndroidRuntime(2057):     at libcore.net.http.HttpConnection.<init>(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

The full error you can view here: http://pastebin.com/cRQ66vrj 您可以在这里查看完整的错误: http : //pastebin.com/cRQ66vrj

And this is my code in Java: 这是我的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);

I've been following several tutorials, but none of them adapt to my needs. 我一直在关注几个教程,但是没有一个适合我的需求。 So I'm trying to create a method which does what I want. 因此,我正在尝试创建一种满足我需要的方法。 Also, I added to Manifest: 另外,我还添加了清单:

<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET"/>

What Am I doing wrong? 我究竟做错了什么? Also, if you could point me a direction so I could get item by item the values retrieved with the code above, I would thank you. 另外,如果您能为我指明方向,以便我可以逐项获取上面代码中检索到的值,我将非常感谢。 Something like: 就像是:

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

Thanks. 谢谢。

from your logs 从您的日志中

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

Be sure that your SOAP request runs in AsyncTask (or in Service). 确保您的SOAP请求在AsyncTask (或Service)中运行。

If you run it in main Thread (aka in Activity) it can lead to above mentioned error. 如果在主线程中运行它(也称为活动),则可能导致上述错误。

Information about AsyncTask you can found here 您可以在这里找到有关AsyncTask的信息

and here some example 这里有一些例子

First of all, the exception clearly tells what's wrong with your code 首先,异常清楚地告诉您代码有什么问题

Caused by: android.os.NetworkOnMainThreadException

You cannot perform long running network operations on the main thread. 您不能在主线程上执行长时间运行的网络操作。 Move at least the last method call to an asynchronous method, you can do it like this, 至少将最后一个方法调用移至异步方法,您可以这样操作,

ExecutorService mExec = Executors.newSingleThreadExecutor();

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

I had to add this line to make ksoap2 work with my web-services androidHttpTransport.setXmlVersionTag(K.STR_XML_VERSION); 我必须添加此行以使ksoap2可以与我的网络服务一起使用androidHttpTransport.setXmlVersionTag(K.STR_XML_VERSION);

I also set following SOAP envelope properties 我还设置了以下SOAP信封属性

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

Use AsyncTask to do network related operations... 使用AsyncTask进行与网络相关的操作...

Below is another solution: Just add below lines in your code. 下面是另一种解决方案:只需在代码中添加以下行即可。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM