Mostrando postagens com marcador Complex Data. Mostrar todas as postagens
Mostrando postagens com marcador Complex Data. Mostrar todas as postagens

sexta-feira, 25 de fevereiro de 2011

Web Services no Android

Olá povo,

No artigo anterior, apresentei como criar Web Services com o Apache Axis2 no Eclipse EE com o plugin WTP. Nesse post mostrarei como acessar esse WebService através de uma aplicação Android.

Um ótimo framework para acessar web services é o KSOAP. Ele é bem conhecido dos desenvolvedores Java ME, uma vez que era a maneira mais fácil de se acessar web services em celulares MIDP. Vamos utiliza-lo no Android através da sua versão para Java SE. Ela pode ser obtida aqui.
Crie um novo projeto Android (que nomearei de BlogWSClient) e adicione o JAR ao projeto. Isso deve ser feito criando uma pasta chamada lib na raiz do projeto e copiando o JAR para lá. Em seguida, adicione esse JAR ao classpath do seu projeto.
Uma vez que iremos acessar um serviço Web, precisamos da permissão android.permission.INTERNET. Sendo assim, o próximo passo será adiciona-la ao nosso aplicativo através da tag uses-permission que deve ser adicionada ao nosso AndroidManifest.xml conforme abaixo.


<uses-permission android:name="android.permission.INTERNET"/>


Agora vamos para o código da nossa Activity. Não vou me preocupar com a parte da interface gráfica, vou apenas mostrar a utilização dos objetos KSOAP.
Tenha sempre esse princípio básico em mente: TODA comunicação de rede deve ser feita com uma Thread separada da Thread principal da aplicação.
Sendo assim, faremos com que nossa classe implemente a interface java.lang.Runnable e no método onCreate, criamos e inicializamos uma nova thread passando a própria instância da Activity como parâmetro. Com isso, o método run chamará dois métodos que, por sua vez, farão a requisição aos nossos serviços.

package ngvl.android.blogws;

// omiti os imports... :)

public class PrincipalActivity
extends Activity
implements Runnable {

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

new Thread(this).start();
}

public void run() {
chamaHelloWS();
chamaPessoaWS();
}

// Adicione os próximos métodos aqui
}

Agora vamos ver a chamada ao serviço HelloWS. Iniciamos com a criação de um SoapObject que representa o namespace do serviço e o método que queremos chamar. Isso está definido no WSDL do nosso serviço, procure pelas propriedades xml:ns e wsdl:operation respectivamente. Em seguida, passamos o parâmetro que o serviço requer, que no exemplo é o nome da pessoa. As requisições SOAP são feitas através de envelopes. Esse objeto é criado e atrelado ao primeiro que criamos.
A variável url armazena o caminho do nosso serviço. Observe que estamos utilizando o IP 10.0.2.2 que permite com que o emulador acesse a máquina local. Se você usa localhost estará tentando acessar o próprio emulador. No aparelho, você deve colocar o endereço real do seu servidor.
Feita a requisição, é só pegar a resposta a partir do envelope.


private void chamaHelloWS() {
SoapObject soap = new SoapObject(
"http://blogws.jee.ngvl", "digaOla");

soap.addProperty("nome", "glauber");

SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.setOutputSoapObject(soap);

Log.i("NGVL", "Chamando HelloWS");

String url =
"http://10.0.2.2:8080/BlogWS/services/HelloWS";

HttpTransportSE httpTransport =
new HttpTransportSE(url);

try {
httpTransport.call("", envelope);

Object msg = envelope.getResponse();

Log.i("NGVL", "Mensagem: " + msg);

} catch (Exception e) {
e.printStackTrace();
}
}


O método que acessa PessoaWS é bem similar ao anterior, o que muda é apenas a resposta, uma vez que não mais temos um só retorno, e sim uma lista deles. essa lista é obtida através da propriedade bodyIn do envelope. Então é só percorrer a lista que é retornada.


private void chamaPessoaWS() {
SoapObject soap = new SoapObject(
"http://blogws.jee.ngvl", "obterPessoas");

SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.setOutputSoapObject(soap);

Log.i("NGVL", "Chamando PessoasWS");

String url =
"http://10.0.2.2:8080/BlogWS/services/PessoaWS";

HttpTransportSE httpTransport =
new HttpTransportSE(url);

try {
httpTransport.call("", envelope);

SoapObject results =
(SoapObject) envelope.bodyIn;

int count = results.getPropertyCount();

for (int i = 0; i < count; i++) {
SoapObject obj = (SoapObject)results.getProperty(i);

Log.i("NGVL",
"Nome: "+ obj.getProperty("nome"));

Log.i("NGVL",
"Idade: "+ obj.getProperty("idade"));
}
} catch (Exception e) {
e.printStackTrace();
}
}


Bem pessoal, espero que vocês tenham gostado. Esse foi um post relâmpago :) dois numa noite só.

4br4ç0s,
nglauber