Cómo consumir un servicio Web en Android


En esta entrada crearé un demo para demostrarte la forma de consumir servicios web en Android.

¿Qué es un servicio web?

Es una tecnología que posibilita el intercambio de datos entre aplicaciones, que pueden estar en lenguajes o plataformas diferentes. Por ejemplo, los bancos tienen un conjunto de servicios web para mostrar información de sus cuentas y desde cualquier software que se cree que posibilite consumir estos servicios se podrá acceder a dicha información, sin importar el lenguaje en que esté escrito o la plataforma en la que se ejecute.

¿Qué es SOAP?

Es uno de los protocolos más utilizados en la actualidad, este establece la forma (formato XML) en que se realiza el intercambio de información entre los programas que utilicen los servicios web.

Todos los servicios web vienen acompañados de una descripción donde se plasman las operaciones que realizan los mismos, es decir: cómo se deben hacer las peticiones y como obtener las respuestas.

Como no es objetivo crear un el servicio web en esta entrada, se utilizará uno existente, publicado en Internet. Este servicio es muy sencillo y cuenta con dos operaciones: conversión de grados Celsius a Fahrenheit y viceversa, solo interesa para el ejemplo, la primera operación.

La App que se creará es bien sencilla, solo tendrá un EditText para que el usuario escriba la temperatura en grado Celsius y el servicio web se encargará de convertirla a Fahrenheit, para después ser mostrada en un TextView.

Lo primero que debes hacer, es familiarizarte con el servicio web. Para esto, puedes visitar la URL y ver la descripción del mismo, y extraer ciertos datos que van a hacer falta más adelante. Estos son los datos que se extraen de la descripción:

  • NAMESPACE = “http://www.w3schools.com/webservices/”;
  • URL = ” http://www.w3schools.com/webservices/tempconvert.asmx?WSDL”;
  • METHOD = “CelsiusToFahrenheit”;
  • SOAPACTION = “http://www.w3schools.com/webservices/CelsiusToFahrenheit
  • Propiedad = Celsius

Nota: El SOAPACTION siempre se construye con el NAMESPACE + METHOD.

Descripción del Servicio Web (Solo del primer método):

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CelsiusToFahrenheit xmlns="http://www.w3schools.com/webservices/">
      <Celsius>string</Celsius>
    </CelsiusToFahrenheit>
  </soap:Body>
</soap:Envelope>

Ahora desde el ADT se creará el visual. Podría quedarte parecido a este:

Visual de la app servicios web

Fig1 Visual de la app

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    android:orientation="horizontal"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/editText1"
            android:digits="0123456789"
            android:layout_width="fill_parent"
            android:layout_height="65dp"
            android:layout_weight="1"
            android:ems="10"
            android:hint="Grados C" >

            <requestFocus />
        </EditText>

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:onClick="onclickInsertar"
            android:text="Convertir C -> F" />

        <TextView
            android:id="@+id/mostrar"
            android:layout_width="fill_parent"
            android:layout_height="100dp"
            android:text="Grados Fahrenheit: "
            android:textColor="@android:color/white" />

    </LinearLayout>

</LinearLayout> 

Ahora solo resta el trabajo desde java:

Para poder trabajar con SOAP desde Android, hay que importar una librería llamada ksoap2, para hacer esto solo debes copiar la misma dentro de la carpeta libs del proyecto y presionar F5 para refrescar el mismo, cierras el ADT y lo vuelves a abrir. La librería está incluida en el demo que te dejo al final.

Para comprobar que no existe ningún error, ve a la opción Project en la barra de menú, después a Properties y pulsa en la pestaña Java Build Path. Dentro de esta opción ve a la pestaña Libraries y podrás ver que dentro de las Android Private Libraries está la librearía que se importó anteriormente, aquí te dejo una imagen de cómo debería quedar:

Importar la librería ksoap2

Fig2 Importar la librería ksoap2

Finalmente solo queda escribir el código en la clase principal

 MainActivity.java:

public class MainActivity extends Activity {
	
  EditText gradosC;
  TextView gradosF;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
		
    gradosC=(EditText) findViewById(R.id.editText1);
    gradosF=(TextView) findViewById(R.id.mostrar);
		
  }
	
  public void onclickInsertar(View v) {
	
    String NAMESPACE = "http://www.w3schools.com/webservices/";
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
    String METHOD_NAME = "CelsiusToFahrenheit";
		
    /* Definir los parámetros del servicio web, que son los datos 
       que se extrajo de la descripción del servicio.
    */
    String SOAP_ACTION = "http://www.w3schools.com/webservices/CelsiusToFahrenheit";

    /* Se crea el paquete SOAP a enviar con la petición al servicio web, 
       en este caso es el valor que se quiere convertir a grados Fahrenheit en este 
       ejemplo, de esto se encarga el método addProperty("<Propiedad>",<Valor>).
       NOTA: A la propiedad envelope.dotNet se le da un valor de true debido a que 
       el servicio Web al cual nos queremos conectar esta codificado en .NET, 
       no siempre es así, esta información debería estar en el sitio oficial 
       que atiende este servicio web.
    */	
		
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("Celsius",gradosC.getText().toString());
    SoapSerializationEnvelope envelope = 
      new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet=true;
    envelope.setOutputSoapObject(request);
		

    /* Se captura la respuesta y se muestra en el TextView */	
    String respuesta;
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    try {
      androidHttpTransport.call(SOAP_ACTION, envelope);
      SoapObject result=(SoapObject) envelope.getResponse();
      respuesta = result.getPropertyAsString(0);
      gradosF.setText("Grados Fahrenheit: "+respuesta);
    }
    catch(Exception e){
      e.printStackTrace();
    }
  }
}

Si recuerdas el artículo anterior, al trabajar con la red hay que agregar en el fichero AndroidManifest.xml el permiso de Internet, quedaría algo como esto:

…
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="18" />
   <uses-permission android:name="android.permission.INTERNET"/>

<application
…

Conclusiones

Como puedes ver el trabajo con servicios web es muy útil, a tal grado que es uno de los mecanismos más utilizados en el mundo. Todas las App que tienen que ver con tarjetas de créditos, finanzas, clima, y muchos otros campos, consumen servicios web que brindan otras entidades para capturar esos datos. Espero que hayas aprendido algo nuevo hoy sobre Android. Si quieres profundizar sobre el protocolo SOAP te aconsejo visites estos recursos:

Descargar Demo
  • Jacqueline Reyes

    la descrpción del servicio WEB ¿dónde se hace?