2011-10-22 13 views
8

Negli ultimi giorni, ho lavorato su un codice Android per chiamare un servizio Web locale. Sto usando librerie ksoap per Android per chiamare il mio servizio web SOAP creato in .NET. Tuttavia, ritengo che ci sia qualcosa di sbagliato nel mio codice in quanto la risposta che ottengo quando chiamo il servizio web dalla mia app colpisce un blocco catch. Ho provato a eseguire il debug del mio codice Android, ma non riesco ancora a risolvere il mio problema. Per favore qualcuno può dirmi cosa c'è che non va o in qualche altro modo più semplice per farlo?Come chiamare un servizio Web locale da un'applicazione mobile Android

Ecco il mio codice di Android ho implementato fino ad ora:

 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+""; 

    } 
    } 
    } 

mio codice servizio web:

 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."; 
    } 

    } 

    } 


    } 

mia 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: [email protected] 

my output during web service call

risposta

6

di lavoro spirito h kSOAP2 può essere una sfida ... lo so. Ma è una buona biblioteca e sono stato in grado di farlo funzionare. Ho scritto un po 'su come lavorare con kSOAP2 su Android. Discuto passare parametri semplici e complessi, ricevere array e lavorare con oggetti WebRowSet di JDBC sul filo.

http://roderickbarnes.com/blog/droid-chronicles-web-services-handling-complex-parameters

Non ci sono altri articoli di blog su come lavorare con kSOAP2 sul sito. Spero che aiuti.

+0

thank u molto per ur risposta !! Sì, proverò il tuo link e farò knw se funziona per me! :-) –

9

In qualche modo sono riuscito a risolvere il mio problema e sto rispondendo a questa domanda in modo che possa essere utile alle persone che vedono questo post in futuro.

ecco il codice modificato:

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

    } 

    } 
+0

hey frnd ur sopra codice ottenendo errore in this.dialog.show(); e nuovo LoginTask(). execute(); questa sia la linea ... come posso risolvere –

+0

Grazie mille! =) –

Problemi correlati