如何从Android移动应用程序调用本地Web服务
从过去的几天来,我一直在研究一个Android代码来调用本地的Web服务。 我正在使用Android的ksoap库来调用我在.NET中创build的SOAP Web服务。 但是,我觉得我的代码有问题,因为我从应用程序调用Web服务时遇到的响应会碰到catch块。 我试着debugging我的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+""; } } }
我的networking服务代码:
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: com.android.internal.view.IInputMethodClient$Stub$Proxy@44eda178
使用kSOAP2可以是具有挑战性的…我知道。 但它是一个很好的图书馆,我已经能够得到它的工作。 我已经写了一些与Android上的kSOAP2工作。 我将讨论传递简单和复杂的参数,接收数组以及通过线路处理JDBC WebRowSet对象。
http://roderickbarnes.com/blog/droid-chronicles-web-services-handling-complex-parameters
还有其他博客文章在网站上使用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(); } } } }