Cómo llamar a un servicio web local desde una aplicación móvil de Android
Desde los últimos días, he estado trabajando en un código de Android para llamar a un servicio web local. Estoy usando las librerías ksoap para Android para llamar a mi servicio web SOAP creado en .NET. Sin embargo, siento que hay algo mal en mi código, ya que la respuesta que recibo cuando llamo al servicio web de mi aplicación se produce un bloqueo de captura. He intentado depurar mi código de Android, pero todavía no soy capaz de resolver mi problema. Por favor, alguien puede decirme lo que está mal o cualquier otra forma más sencilla de hacer esto?
Aquí está mi código de Android que he implementado hasta ahora:
- OkHttp - Habilitar registros
- ¿Por qué estoy recibiendo HttpResponse diferente de un navegador en android?
- ASIHTTPRequest equivalente para Android o cualquier gestor / envoltorio de solicitud HTTP?
- Cómo pasar el valor al parámetro enum de la bandera en el servicio Soap (servicio ASMX) Desde la aplicación android
- Método correcto para llamar al servicio Web (API) de la clase Fragment
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+""; } } }
Mi código de servicio 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."; } } } }
Mi 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
- ¿Cómo pasar el parámetro a un webservice usando ksoap2?
- Buscar usuarios en el host de pestañas android
- Excepción; No se puede establecer la propiedad de la solicitud después de realizar la conexión; Se produce en Android Lollipop HTC M8
- Cómo validar el origen de una invocación de servicio web
- ¿Cual es mejor? Alto número de llamadas de servicio web (mensajes SOAP) o alta cantidad de datos en un único mensaje de jabón?
- Java.net.SocketException: recvfrom falló: ECONNRESET (Conexión restablecida por pares) Más de WIFI
- Conexión de dos teléfonos Android para transferir datos entre ellos a través de WIFI
- Publicar mi servicio Web RESTful en Internet
Trabajar con kSOAP2 puede ser un reto … yo sé. Pero es una buena biblioteca y he podido hacerlo funcionar. He escrito un poco sobre cómo trabajar con kSOAP2 en Android. Discuto el paso de parámetros simples y complejos, la recepción de matrices, y el trabajo con JDBC WebRowSet objetos sobre el cable.
http://roderickbarnes.com/blog/droid-chronicles-web-services-handling-complex-parameters
Hay otros artículos de blog sobre cómo trabajar con kSOAP2 en el sitio. Espero que esto ayude.
De alguna manera logré resolver mi problema y estoy respondiendo a esta pregunta para que pueda ser útil para las personas que ven este post en el futuro.
Así que aquí está el código modificado:
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(); } } } }
- Firma digital en android
- ¿Cómo identifica * qué * dispositivo bluetooth causa una emisión ACTION_ACL_CONNECTED?