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