2011-10-22 73 views
8

從過去幾天來,我一直致力於調用本地Web服務的Android代碼。我使用Android的ksoap庫來調用我在.NET中創建的SOAP Web服務。但是,我感覺我的代碼中存在一些問題,因爲我從應用程序調用Web服務時遇到的響應會碰到catch塊。我試着調試我的Android代碼,但我仍然無法解決我的問題。 請有人能告訴我什麼是錯誤的或任何其他更簡單的方法來做到這一點?如何從Android移動應用程序調用本地Web服務

這裏是我的Android代碼,我已經實現了至今:

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

    } 
    } 
    } 

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

    } 

    } 


    } 

我的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

回答

6

工作風趣h kSOAP2可能具有挑戰性......我知道。但它是一個很好的圖書館,我已經能夠實現它的工作。我已經寫了一些與Android上的kSOAP2一起工作。我討論了傳遞簡單和複雜的參數,接收數組以及通過線路處理JDBC WebRowSet對象。

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

有與kSOAP2在網站上工作的其他博客文章。我希望這有幫助。

+0

感謝ü非常烏拉圭回合的反應!是的,我會嘗試你的鏈接,讓我知道如果它適合我​​! :-) –

9

不知何故,我設法解決了我的問題,我回答了這個問題,以便將來可以看到這篇文章的人有用。

因此,這裏是修改後的代碼:

   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

嘿frnd你上面的代碼在this.dialog.show();和新的LoginTask()。execute();這兩條線......我該如何解決 –

+0

非常感謝! =) –

相關問題