Aplicativo Android consumindo um Webservice .net



Com o surgimento de plataformas mais robustas para dispositivos móveis cada vez mais potentes, aliado à criatividade dos desenvolvedores, bem como à exigência e a demanda do mercado por novidades, foi impulsionado o desenvolvimento de aplicações com recursos cada vez mais sofisticados.

Empresas como Apple e Google se empenham a cada release de seus Sistemas Operacionais para dispositivos móveis com o objetivo de acrescentar maior poder em sua plataforma de desenvolvimento. Esse processo de disputa de mercado permitiu grandes avanços do segmento.

Desses grandes avanços, um dos que sem dúvida chamam mais atenção é o poder da interoperabilidade graças aos padrões SOAP e WSDL, para descrever e criar a comunicação entre um Serviço Web (de qualquer plataforma) e um Cliente (Windows, Linux, dispositivos móveis).

No que se trata de plataforma Android muitas considerações são fundamentais. A mais importante delas, e que é sempre importante esclarecer, é que a linguagem utilizada para programação de aplicativos Android é Java, porém o ambiente é Android e não Java. Isso significa que muitas bibliotecas Java não estarão disponíveis em seus aplicativos por exatamente se tratarem de dispositivos com menor capacidade de memória e processamento.

Portanto, frameworks como XFire (http://xfire.codehaus.org/Overview) ,que funcionam como uma luva em aplicações Java para criar as classes de Cliente de acesso à WebServices, não funcionam em Android por exatamente usarem bibliotecas da JRE.

A solução para conexão HTTP SOAP com WebServices em ambiente Android chama-se KSoap (http://ksoap2.sourceforge.net/). Esse framework promove um encapsulamento de Envelopes SOAP para requisições à WebServices (WSDL).

Para testar essa funcionalidade, vamos a um exemplo simples. Primeiro cria-se um WebService, nesse caso em Asp.Net, chamado CalculadoraCientifica com um método fatorial. Esse método recebe um inteiro a calcular seu fatorial, que é o retorno inteiro do método.

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
' <System.Web.Script.Services.ScriptService()> _
<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<SoapDocumentService(RoutingStyle:=SoapServiceRoutingStyle.RequestElement)>
_
Public Class CalculadoraCientifica
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function fatorial(ByVal valor As Integer) As Integer
        If (valor = 1) Then
            Return 1
        Else
            Return (valor * CInt(fatorial(valor - 1)))
        End If
    End Function

 End Class

Já no lado da aplicação Android, copie a biblioteca KSOAP2 (http://ksoap2-android.googlecode.com/svn/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/2.6.5/ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar) no diretório \libs e adicione-a ao Build Path do seu projeto.

No arquivo AndroidManifest.xml do seu projeto Android, adicione a permissão de acesso a internet logo acima da definição <application>:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Agora é só executar a chamada SOAP:

        String URN = "http://temuri.org/"; // Namespace do WebService
        String address = "http://192.168.1.192/Calculadora/CalculadoraCientifica.asmx"; // URL do WebService
        String methodName = "fatorial";  // Nome do método
        String soapAction = "http://temuri.org/fatorial"; // Ação SOAP
      
        SoapObject request = new SoapObject(URN, methodName);

        SoapSerializationEnvelope envelope =
        new SoapSerializationEnvelope(SoapEnvelope.VER11); 

        request.addProperty("valor", numero);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);         

        HttpTransportSE ht = new HttpTransportSE(address);
        ht.debug = true;      

        try{
            ht.call(soapAction, envelope);
            String result = envelope.getResponse().toString();
            int fatorial = Integer.parseInt(result);
            return fatorial;
        }
        catch(org.xmlpull.v1.XmlPullParserException ex2){
            throw new Exception("Err::" + ex2.toString());
        } 

        catch(Exception ex){
            String msg = "Err2::"+ ex.toString() + '\n'  +
                                 ht.requestDump + '\n'  +
                                 ht.responseDump + '\n';
            throw new Exception(msg);
        } 

Abaixo, o código inteiro de uma Activity exemplo consumindo nosso WebService CalculadoraCientifica:

package br.com.testews;

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

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class TesteWSActivity extends Activity implements OnClickListener {

      // Objetos da tela
      private TextView lbl; // label
      private TextView txb; // textbox
      private TextView btn; // button

      /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
   
        LinearLayout painel = new LinearLayout(this);
        painel.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,                                                           LayoutParams.FILL_PARENT));
        painel.setOrientation(LinearLayout.VERTICAL);
    
        // Label
        lbl = new TextView(this);
        lbl.setText("Número");
        painel.addView(lbl);

        // TextBox
        txb = new EditText(this);
        painel.addView(txb);

        // Botao
        btn = new Button(this);
        btn.setText("Fatorial!");
        painel.addView(btn);
        btn.setOnClickListener(this);
      
        setContentView(painel);

    }

     // Evento a ser disparado quando clicar no botão para fatorar  
      @Override
      public void onClick(View v) {
            try {
                  int numero = Integer.parseInt(txb.getText().toString());
                  int fatorial = getFatorial(numero);
                  Toast.makeText(this, ""+numero+"! = "+fatorial, Toast.LENGTH_SHORT).show();
            }catch(Exception ex) {
                  Toast.makeText(this, ex.toString(), Toast.LENGTH_LONG).show();
            }
      }
   
        // método que vai acessar o WebService e retornar o valor fatorial
    public static int getFatorial(int numero) throws Exception {
        String URN = "http://temuri.org/"; // Namespace do WebService
        String address = "http://192.168.1.192/sgi/HelloWorld.asmx"; // URL do WebService
        String methodName = "fatorial";  // Nome do método
        String soapAction = "http://temuri.org/fatorial"; // Ação SOAP
      
        SoapObject request = new SoapObject(URN, methodName);
        
        SoapSerializationEnvelope envelope =
        new SoapSerializationEnvelope(SoapEnvelope.VER11);
        
        request.addProperty("valor", numero);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        
        HttpTransportSE ht = new HttpTransportSE(address);
        ht.debug = true;
      
        try{
            ht.call(soapAction, envelope);
            String result = envelope.getResponse().toString();
            int fatorial = Integer.parseInt(result);
            return fatorial;
        }
        catch(org.xmlpull.v1.XmlPullParserException ex2){
            throw new Exception("Err::" + ex2.toString());
        }
        catch(Exception ex){
            String msg = "Err2::"+ ex.toString() + '\n'  +
                                 ht.requestDump + '\n'  +
                                 ht.responseDump + '\n';
            throw new Exception(msg);
        }
    }
}

O que esse simples exemplo de uma Calculadora Científica nos demonstra é que a aplicação Android funciona somente com uma interface com o usuário, e a funcionalidade (no caso o método fatorial) é processada no WebService. Dessa forma, a calculadora utiliza o maior poder de processamento do WebService.


Autor: Pedro Paulo C S Pinheiro


Artigos Relacionados


Ja Ta Na Hora

15 De Outubro

A Destinação Da Sabedoria

Mulher Ii

Poesia

Minha InfÂncia

Solidão