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