androidsoapasynchronousksoap

Reading a .NET Web Service response in Android


I have a problem when reading a response from .NET web service by an Android client. The response structure is (example):

<xml>
    <resaRef>400</resaRef>
    <firstname>Amine</name>
    <lastname>Touahria</lastname>
</xml>

Here is my code :

        import org.ksoap2.SoapEnvelope;
        import org.ksoap2.serialization.PropertyInfo;
        import org.ksoap2.serialization.SoapObject;
        import org.ksoap2.serialization.SoapPrimitive;
        import org.ksoap2.serialization.SoapSerializationEnvelope;
        import org.ksoap2.transport.HttpTransportSE;

        import android.app.Activity;
        import android.os.AsyncTask;
        import android.os.Bundle;
        import android.view.View;
        import android.view.View.OnClickListener;
        import android.widget.Button;
        import android.widget.EditText;

        public class MainActivity extends Activity {
            EditText ref;
            Button call;
            public final String NAMESPACE = "http://tempuri.org/";
            public final String URL = "http://192.168.0.100/hngwebsetup/HNGWeb.asmx";
            public final String SOAP_ACTION = "http://tempuri.org/GetResa";
            public final String METHOD_NAME = "GetResa";
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                ref=(EditText)findViewById(R.id.ref_res);


                call=(Button)findViewById(R.id.call_ws);
                call.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        AsyncCallWS task = new AsyncCallWS();
                        task.execute();

                    }
                });

            }
            public class AsyncCallWS extends AsyncTask<String, String,String>{

                protected String doInBackground(String... params) {

                     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
                     PropertyInfo pi =new PropertyInfo();
                     pi.setName("resaRef");
                     pi.setValue("400");
                     pi.setType(String.class);
                     request.addProperty(pi);

                     /*PropertyInfo pi =new PropertyInfo();
                     pi.setName("date");
                     pi.setValue("20130601");
                     pi.setType(String.class);
                     request.addProperty(pi);*/


                     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

                     envelope.dotNet = true;
                     envelope.setOutputSoapObject(request);
                     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                     try{
                         androidHttpTransport.call(SOAP_ACTION, envelope);
                         final SoapObject response = (SoapObject)envelope.getResponse();
                         runOnUiThread(new Runnable() {

                             @Override
                             public void run() {
                                 ref.setText(response.getProperty("nom").toString());


                             }
                         });


                    }

                    catch(Exception e){
                     e.printStackTrace();

                    }


                    return null;
                }



            }
        }

I have this Exception :

02-20 04:02:59.837: E/AndroidRuntime(1077): FATAL EXCEPTION: AsyncTask #1
02-20 04:02:59.837: E/AndroidRuntime(1077): Process: com.hotix.webser, PID: 1077
02-20 04:02:59.837: E/AndroidRuntime(1077): java.lang.RuntimeException: An error occured while executing doInBackground()
02-20 04:02:59.837: E/AndroidRuntime(1077):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.lang.Thread.run(Thread.java:841)
02-20 04:02:59.837: E/AndroidRuntime(1077): Caused by: java.lang.NoClassDefFoundError: org.ksoap2.serialization.SoapObject
02-20 04:02:59.837: E/AndroidRuntime(1077):     at com.hotix.webser.MainActivity$AsyncCallWS.doInBackground(MainActivity.java:48)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at com.hotix.webser.MainActivity$AsyncCallWS.doInBackground(MainActivity.java:1)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
02-20 04:02:59.837: E/AndroidRuntime(1077):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
02-20 04:02:59.837: E/AndroidRuntime(1077):     ... 3 more

What's the problem ?


Solution

  • Solved :
    I just created before showing the values of response in an EditText a SoapObject then

    SoapObject obj=new SoapObject();
    obj=(SoapObject) response.getProperty(0);
    
    ref.setText(obj.getPrimitiveProperty("Nom").toString()+obj.getPrimitiveProperty("DateDepart").toString());