post icon

Cómo invocar a un Web Service desde Android

Véamos algo un poco más avanzado en cuanto a programación para Android se refiere, consumiremos un Web Service. Lo más llamativo para mí es que Google no le ha dado soporte nativo a ésta tecnología, siendo que es estándar y abierta, sin decir que es de uso popular. Aunque ésta falta de soporte no hace que sea imposible consumir un WS desde nuestra app, de hecho existe más de una manera de hacerlo y la más difundida ya es la librería KSOAP2, así que trabajaremos con ella.

Ya doy por hecho que saben crear un servicio web del lado servidor (si no es así pueden buscar cómo hacerlo en varios lenguajes en éste mismo blog) por ello nos saltaremos el código servidor. Lo pueden escribir en el lenguaje que deseen, PHP, Java, .Net, etc. Lo primero que necesitan hacer es descargarse la librería ksoap2, y luego la agregan a su proyecto como referencia.

 

Con esto hecho ya podremos hacer las importaciones necesarias en cada clase que querramos usarla.

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

En el manifiesto también tenemos que incluir los permisos de conexión a Internet

El ejemplo de código que expongo más abajo, está enfocado para consumir WS construidos con .Net pero si se fijan es fácilmente adaptable a otro lenguaje, simplemente colocan en false la opción dotNet y cambian como deben la  URL, NAMESPACE y SOAP_ACTION

/* El ejemplo con el dominio tempuri es para .Net
 * esto varia segun con que lenguaje lo construyen
 * solo deben revisar como configuraron su servidor
 * y lo cambian por el valor correspondiente
*/
private static final String SOAP_ACTION = "http://tempuri.org/MiMetodoDePrueba";
private static final String METHOD_NAME = "MiMetodoDePrueba";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://midominiooip/devtroce_ws.asmx";

private void InvocarWs(){
	try {
		EditText txtParametro1 = (EditText) findViewById(R.id.txtParametro1);
		EditText txtParametro2 = (EditText) findViewById(R.id.txtParametro2);
		EditText txtParametro3 = (EditText) findViewById(R.id.txtParametro3);

		SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

		request.addProperty("param1", txtParametro1.getText().toString());
		request.addProperty("param2", txtParametro2.getText().toString().trim());
		request.addProperty("param3", txtParametro3.getText().toString());

		final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER12); // utilizar la version que corresponda:11 o 12
		envelope.dotNet = true; // para WS ASMX, sólo si fue construido con .Net
		envelope.setOutputSoapObject(request);

		final HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

		androidHttpTransport.call(SOAP_ACTION, envelope);

		// Esta sección está destina si el Métdo del WS retorna valores
		/*
		 * Object result = (Object)envelope.getResponse();
		 *
		 * String[] results = (String[]) result; tv.setText( ""+results[0]);
		 * MensajeBox(results[0].toString());
		 */
	} catch (Exception e) {
		MensajeBox(e.getMessage());
	}
}

void MensajeBox(String mensaje) {
	AlertDialog.Builder builder = new AlertDialog.Builder(this);
	builder.setMessage(mensaje)
			.setCancelable(false)
			.setNeutralButton("Aceptar",
					new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int id) {
							dialog.cancel();
						}
					});
	AlertDialog alert = builder.create();
	alert.show();
}

Comentarios desde Facebook:

  1. avatar
    Mijael Mozilla Firefox Windows
    16 agosto 2013 at 23:38 #

    En el emulador funciona dde maravilla pero al instalarlo en un dispositivo me da error “null http://192.168……/service.asmx”
    alguien sabe porque ? porfavor necesito su ayudaa

  2. avatar
    Carlos COLOMBIA Google Chrome Windows
    9 julio 2013 at 23:37 #

    Buenas noches

    Sería que tiene un ejemplo de cómo consumir un web service construido en lenguaje java, he probado de todo pero no me funciona.

    Muchas Gracias

    Carlos E. Castro

  3. avatar
    Shinigami MEXICO Internet Explorer Windows
    6 junio 2013 at 18:12 #

    Todo mundo coloca ejemplos chafas de esto… mira amigo Jose Antonio.. el secreto está en el JSON… y en el concepto de WS… el soap a fin de cuentas es un XML envuelto (envelope) el cual viaja en el protocolo, hay una aplicacion llamada SOAP UI con la cual testeas WSDL de ws en funcionamiento y esa cosa solamente envia y recibe XML, lo que debes hacer es que tu salida en JSON sea como tu objeto con los datos de tu objeto por ejemplo [id:’012′,nombre:’Antonio’], esto con el request.addProperty se va formando… primero comprende como funcionan los WS y tu mismo encontrarás como hacerlo. Yo incluso en mis Request envio listas con beans complejos… es muy simple solo que todos los que postean ponene estos ejemplos chaquetas por que la verdad no saben lo que hacen 🙂

    • avatar
      jeobel NICARAGUA Google Chrome Windows
      27 noviembre 2013 at 19:49 #

      bune punto shinigami, tenes mucha razon, muy elocuente tu punto de vista

  4. avatar
    Jose Antonio MEXICO Mozilla Firefox Windows
    2 mayo 2013 at 09:43 #

    Bueno pero si necesito devolver y enviar un tipo de dato como un vo , ejemplo

    public class produtoVO {
    private String id;
    private String nombre;
    }

Responder