Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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

like image 778
Parth Doshi Avatar asked Oct 22 '11 16:10

Parth Doshi


People also ask

How do I make a web service call?

To call a Web service programmaticallyUse the Web reference name (or server name) as the namespace, and the name of its . WSDL file (or the service name) as the proxy class. The following code example calls a Web service method to get a string value. Web service variable names and syntax are highlighted.

How do I call a webservice from another web service?

To call web service in between the processing policy you can use dp:url-open() extension function or you can use fetch action or result action. Once you got the response from the webservice you want to consolidate both the responses and want to sent back to client.

Can web application run on Android?

Indeed, web apps run on any modern device, so with it you potentially cover the biggest target audience possible. However, web apps have their own limitations: they can't support mobile-native features, they need the Internet at all times, and the more complicated they get, the slower they work in mobile browsers.


1 Answers

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();
        }         
      }

    } 

   } 
like image 83
Parth Doshi Avatar answered Sep 20 '22 13:09

Parth Doshi