如何从Android移动应用程序调用本地web服务

如何从Android移动应用程序调用本地web服务,android,.net,web-services,localhost,ksoap,Android,.net,Web Services,Localhost,Ksoap,从过去几天开始,我一直在编写一个Android代码来调用本地web服务。我正在使用Android的ksoap库调用在.NET中创建的SOAP web服务。然而,当我从我的应用程序调用web服务时得到的响应碰到了一个问题块,我觉得我的代码有问题。我试着调试我的Android代码,但仍然无法解决我的问题。 请有人告诉我怎么了,或者其他更简单的方法 以下是我迄今为止已经实现的Android代码: package com.demo; import java.net.SocketE

从过去几天开始,我一直在编写一个Android代码来调用本地web服务。我正在使用Android的ksoap库调用在.NET中创建的SOAP web服务。然而,当我从我的应用程序调用web服务时得到的响应碰到了一个问题块,我觉得我的代码有问题。我试着调试我的Android代码,但仍然无法解决我的问题。 请有人告诉我怎么了,或者其他更简单的方法

以下是我迄今为止已经实现的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+"";

    }
     }
    }
我的日志:

       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

使用kSOAP2可能会很有挑战性。。。我知道。但这是一个很好的图书馆,我已经能够让它工作了。我写了一些关于在Android上使用kSOAP2的文章。我将讨论通过网络传递简单和复杂参数、接收数组以及处理JDBCWebRowset对象


网站上还有其他关于如何使用kSOAP2的博客文章。我希望这能有所帮助。

不知何故,我设法解决了我的问题,我回答了这个问题,以便对将来看到这篇文章的人有用

下面是修改后的代码:

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

    } 

   } 
package.com.demo;
导入java.net.SocketException;
导入org.ksoap2.SoapEnvelope;
导入org.ksoap2.serialization.SoapObject;
导入org.ksoap2.serialization.SoapPrimitive;
导入org.ksoap2.serialization.SoapSerializationEnvelope;
导入org.ksoap2.transport.HttpTransportSE;
导入android.app.Activity;
导入android.app.ProgressDialog;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.view.view.OnClickListener;
导入android.widget.Button;
导入android.widget.EditText;
公共类登录扩展活动{
私有最终字符串命名空间=”http://tempuri.org/";
私有最终字符串URL=”http://10.0.2.2/testlogin/Service1.asmx";
字符串用户标识;
字符串密码;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮符号=(按钮)findViewById(R.id.regsubmitbtn);
signin.setOnClickListener(新的OnClickListener(){
公共void onClick(视图v){
EditText etxt_user=(EditText)findviewbyd(R.id.usereditlog);
user_id=etxt_user.getText().toString();
EditText etxt_password=(EditText)findViewById(R.id.pwdeditlog);
password=etxt_password.getText().toString();
新登录任务().execute();
}
});   
}
私有布尔多洛金(字符串用户id,字符串密码){
布尔结果=假;
最后一个字符串SOAP_ACTION=”http://tempuri.org/GetLogin";
最终字符串方法\u NAME=“GetLogin”;
SoapObject请求=新的SoapObject(名称空间、方法名称);
request.addProperty(“userid”,user\u id);
request.addProperty(“密码”,password);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;//将此变量设置为true,以便
//与似乎是
//.Net服务的默认编码。
envelope.setOutputSoapObject(请求);
系统输出打印项次(请求);
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
试一试{
调用(SOAP_操作,信封);
SoapPrimitive响应=(SoapPrimitive)信封.getResponse();
Log.i(“myApp”,response.toString());
System.out.println(“响应”+响应);
if(response.toString().equalsIgnoreCase(“成功”))
{
结果=真;
}
}捕获(SocketException例外)
{
Log.e(“错误:”,“soapPrimitiveData()上的错误”+ex.getMessage());
例如printStackTrace();
}
捕获(例外e){
Log.e(“错误:”,“soapPrimitiveData()上的错误”+e.getMessage());
e、 printStackTrace();
}
返回结果;
}
私有类LoginTask扩展异步任务{
private final ProgressDialog dialog=新建ProgressDialog(
登录。这个);
受保护的void onPreExecute(){
this.dialog.setMessage(“登录…”);
this.dialog.show();
}
受保护的空位背景(最终空位…未使用){
布尔auth=doLogin(用户id、密码);
System.out.println(auth);
return null;//不与ui交互!
}
受保护的void onPostExecute(void结果){
if(this.dialog.isShowing()){
this.dialog.disclose();
}         
}
} 
} 

非常感谢您的回复!!是的,我会尝试你的链接,如果对我有用的话,让你知道!:-)链接已过期!上面的代码在这个.dialog.show()中出错;和新的登录任务().execute();这两条线。。。我怎样才能解决这个问题
             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();
        }         
      }

    } 

   }