How to call a local web service from an Android mobile application

Parth Doshi picture Parth Doshi · Oct 22, 2011 · Viewed 17.1k times · Source

From the past few days, I have been working on an Android code to call a local web service. I am using ksoap libraries for Android to call my SOAP web service created in .NET. However, I feel there is something wrong in my code as the response I get when I call the web service from my app hits a catch block . I tried debugging my Android code but I am still not able to solve my problem. Please can someone tell me what's wrong or any other simpler way to do this ?

Here is my Android code I have implemented till now :

      package com.demo;
      import java.net.SocketException;
      import org.ksoap2.SoapEnvelope;
      import org.ksoap2.serialization.SoapObject;
      import org.ksoap2.serialization.SoapPrimitive;
      import org.ksoap2.serialization.SoapSerializationEnvelope;
      import org.ksoap2.transport.AndroidHttpTransport;
      import android.app.Activity;
      import android.app.ProgressDialog;
      import android.os.AsyncTask;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.View;
      import android.view.View.OnClickListener;
      import android.widget.Button;
      import android.widget.EditText;

    public class Login extends Activity {
private static final String SOAP_ACTION = "http://tempuri.org/GetLoginDetails";
    private static final String METHOD_NAME = "GetLoginDetails";
    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://10.0.2.2/testlogin/Service1.asmx";

@Override
public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button signin = (Button) findViewById(R.id.regsubmitbtn);

        signin.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {


                        EditText etxt_user = (EditText) findViewById(R.id.usereditlog);
                        user_id = etxt_user.getText().toString();
                        EditText etxt_password = (EditText) findViewById(R.id.pwdeditlog);
                        password = etxt_password.getText().toString();

                        new LoginTask().execute();
                }
        });
}

 String user_id;
String password;
String auth=null;
private class LoginTask extends AsyncTask<Void, Void, Void> {

    private final ProgressDialog dialog = new ProgressDialog(
                    Login.this);

    protected void onPreExecute() {
            this.dialog.setMessage("Logging in...");
            this.dialog.show();
    }

    protected Void doInBackground(final Void... unused) {

             auth = doLogin("lalit", "lalit");
            return null; // don't interact with the ui!
    }

    protected void onPostExecute(Void result) {
        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }

         }


       private String doLogin(String user_id, String password) {

    SoapPrimitive resultstring = null;
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("user", user_id);
    request.addProperty("password", password);
    SoapSerializationEnvelope soapenvelope = new SoapSerializationEnvelope(
                    SoapEnvelope.VER11);
    soapenvelope.dotNet = true;                                                      
    soapenvelope.setOutputSoapObject(request);

    AndroidHttpTransport httptransport = new AndroidHttpTransport(URL);
    httptransport.debug = true;

    try {
            httptransport.call(SOAP_ACTION, soapenvelope);
            resultstring = (SoapPrimitive) soapenvelope.getResponse();
            //Log.d("Authenticaion", resultstring+"");
            System.out.println(resultstring);


    }
    catch (SocketException ex) {
        Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
        ex.printStackTrace();
    } catch (Exception e) {
        Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage());
       e.printStackTrace();
    }
    return resultstring+"";

    }
     }
    }

my web service code :

        using System;
        using System.Collections;
        using System.ComponentModel;
        using System.Data;
        using System.Linq;
        using System.Web;
        using System.Web.Services;
        using System.Web.Services.Protocols;
        using System.Xml.Linq;
        using System.Data.SqlClient;

     namespace LoginDetails
     {
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
// [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
   {


    [WebMethod]
  public String GetLoginDetails(string UserName, string Password)
    {

   try
      { 
     using (SqlConnection myConnection = new SqlConnection(@"Data Source= .\SQLEXPRESS;Initial Catalog=student;User ID=sa;Password=demo"))
    {
        myConnection.Open();

        using (SqlCommand myCommand = new SqlCommand())
        {
            myCommand.Connection = myConnection;
            myCommand.CommandText = "SELECT COUNT(*) FROM Login WHERE UserName = @UserName AND Password = @Password";
            myCommand.Parameters.Add("@UserName", SqlDbType.VarChar).Value = UserName;
            myCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = Password;
            return (int)myCommand.ExecuteScalar() == 1 ? "success" : "bad username or password";
        }
    }
}
catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    return "an error occurred.";
     } 

  }

     }


  }

my logcat :

       10-22 21:49:17.635: DEBUG/dalvikvm(117): GC_EXTERNAL_ALLOC freed 901 objects /         

       10-22 21:49:18.015: WARN/KeyCharacterMap(117): No keyboard for id 0
       10-22 21:49:18.015: WARN/KeyCharacterMap(117): Using default keymap:  /system/usr/keychars/qwerty.kcm.bin
       10-22 21:49:22.275: INFO/ARMAssembler(58): generated s   scanline__00000077:03515104_00000000_00000000 [ 33 ipp] (47 ins) at [0x23df98:0x23e054] in 675711 ns
       10-22 21:49:42.025: INFO/System.out(274): an error occurred.
       10-22 21:49:42.045: WARN/InputManagerService(58): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44eda178

my output during web service call

Answer

Parth Doshi picture Parth Doshi · Oct 27, 2011

Somehow I managed to solve my problem and I am answering this question so that it be can be useful to people who see this post in the future.

So here is the modified code:

             package com.demo;
             import java.net.SocketException;
             import org.ksoap2.SoapEnvelope;
             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.app.ProgressDialog;
             import android.os.AsyncTask;
             import android.os.Bundle;
             import android.util.Log;
             import android.view.View;
             import android.view.View.OnClickListener;
             import android.widget.Button;
             import android.widget.EditText;

     public class Login extends Activity {

  private final String NAMESPACE = "http://tempuri.org/";
  private final String URL = "http://10.0.2.2/testlogin/Service1.asmx";

    String user_id;
    String password;

  @Override
   public void onCreate(Bundle savedInstanceState)
      {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button signin = (Button) findViewById(R.id.regsubmitbtn);
        signin.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {


                        EditText etxt_user = (EditText) findViewById(R.id.usereditlog);
                        user_id = etxt_user.getText().toString();
                        EditText etxt_password = (EditText)  findViewById(R.id.pwdeditlog);
                        password = etxt_password.getText().toString();

                        new LoginTask().execute();

                }
           });   
     }

    private boolean doLogin(String user_id, String password) {   

   boolean result=false;
   final String SOAP_ACTION = "http://tempuri.org/GetLogin";
   final String METHOD_NAME = "GetLogin";     
   SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

   request.addProperty("userid", user_id);
   request.addProperty("password",password);
   SoapSerializationEnvelope envelope = new   SoapSerializationEnvelope(SoapEnvelope.VER11);
   envelope.dotNet = true; // Set this variable to true for
                                                           // compatibility with what seems to be the
                                                           // default encoding for .Net-Services.
   envelope.setOutputSoapObject(request);

   System.out.println(request);

   HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);


   try {
           androidHttpTransport.call(SOAP_ACTION, envelope);
           SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
           Log.i("myApp", response.toString());
           System.out.println("response" +response);

                   if(response.toString().equalsIgnoreCase("success"))
       {
                   result = true;

       }

   }catch(SocketException ex)
   {
       Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage());
       ex.printStackTrace();
   }
   catch (Exception e) {
       Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage());
           e.printStackTrace();
   }
   return result;

   }


private class LoginTask extends AsyncTask<Void, Void, Void> {

    private final ProgressDialog dialog = new ProgressDialog(
                    Login.this);

    protected void onPreExecute() {

            this.dialog.setMessage("Logging in...");
            this.dialog.show();

    }


    protected Void doInBackground(final Void... unused) {

        boolean auth=doLogin(user_id,password);
        System.out.println(auth);

        return null;// don't interact with the ui!
    }


    protected void onPostExecute(Void result) {


            if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }         
      }

    } 

   }