sexta-feira, 25 de fevereiro de 2011

Web Service com Apache Axis2

Olá povo,

Todo mundo já sabe da atual importância dos Web Services no mundo da TI. Eles promovem a integração entre sistemas inclusive que podem inclusive utilizar tecnologias heterogêneas. Mas como criar esse tipo de software? Bem, como diria a velha propaganda, "existem mil maneiras de se fazer Neston". Traduzindo pra o nosso contexto, existem mil maneiras de se fazer web services. Podemos utilizar os protocolos JSON ou SOAP (pelo menos que eu conheço), e com esses dois podemos desenvolver em várias tecnologias (.net, Java, PHP, ...) , e por fim, para essas tecnologias podemos utilizar alguns frameworks disponíveis no mercado.

Nesse post, que é baseado nesse tutorial de Lars Vogel, apresentarei um exemplo da disponibilização de um Web Service utilizando o padrão SOAP, criado com a linguagem Java e usando o framework Apache Axis2. Vamos utilizar o Eclipse EE com WTP (Web Tools Platform) e as ferramentas Tomcat 6.0 e obviamente do Axis 2. Baixe essas ferramentas e mãos a obra!

Devemos incialmente configurar o Eclipse indicando onde decompactamos o Axis2. Para isso, vá até o menu Window > Preferences. No lado esquerdo, selecione Web Services > Axis 2 Preferences, e na aba Axis 2 Runtime indique o diretório do Axis 2. Ainda na opção Web Services, selecione a subopção Server and Runtime. Então, selecione Tomcat v6.0 Server e Apache Axis 2 nos campos Server e Web service runtime respectivamente.

Crie um novo Dynamic Web Project, vou dar o nome de BlogWS. Uma vez com o projeto criado, adicione um novo pacote, nomearei como ngvl.jee.blogws. Inciaremos criando um serviço bem simples que simplesmente dirá um olá com a hora do servidor. Crie uma classe chamada HelloWS conforme abaixo:

package ngvl.jee.blogws;

import java.text.SimpleDateFormat;
import java.util.Date;

public class HelloWS {
public String digaOla(String nome){
String result;
SimpleDateFormat df =
new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

Date date = new Date(System.currentTimeMillis());
result = df.format(date);

return "Olá "+ nome +" a hora atual é "+ result;
}
}

Criada a classe, clique com o botão direito sobre a classe e selecione a opção Web Services > Create Web service. A tela abaixo será exibida:


Selecione Web service runtime: Apache Axis2 e clique em Next. Na tela que abrirá em seguida, selecione Generate default services.xml file e clique em Finish.

Feito isso seu WebService está pronto! Mas já? :) Pois é. O Axis2 é bem simples. E com uma ajudinha do WTP fica mais fácil ainda. Pra ver seu serviço rodando, basta clicar com o botão direito sobre o projeto e escolher a opção Run as > Run on server. O browser deve exibir esse endereço (se não exibir digite-o): http://localhost:8080/BlogWS/axis2-web/. Será exibida uma tela de boas vindas do Axis2. Clique no link Services e será exibido os serviços disponíveis. Entre eles está o nosso magistoso HelloWS :) com a operação digaOla. Se você clicar sobre o nome do serviço verá o WSDL (Web Service Descriptor Language) que é o XML que define nosso WS. Nele temos detalhes sobre o serviço, como as operações que estamos disponibilizando, tipos de parâmetros de entrada (response) e de retorno (response).
Mostraremos no próximo post como acessar esse serviço através de uma aplicação Android. Mas antes vamos fugir a regra. Milhões de tutoriais na internet mostram como fazer um serviço simples, que não envolve tipos complexos. Vamos mostrar como criar um serviço que retorna uma lista de objetos do tipo Pessoa.
Primeiro crie uma interface que vai representar seu objeto complexo.


package ngvl.jee.blogws;

public interface Pessoa {
void setNome(String nome);
String getNome();
void setIdade(int idade);
int getIdade();
}

Depois crie a classe que implementa essa interface:

package ngvl.jee.blogws;

public class PessoaImpl implements Pessoa {
private int idade;
private String nome;

public PessoaImpl(String nome, int idade) {
setIdade(idade);
setNome(nome);
}

public int getIdade() {
return idade;
}

public String getNome() {
return nome;
}

public void setIdade(int idade) {
this.idade = idade;
}

public void setNome(String nome) {
this.nome = nome;
}
}


Feito isso, criaremos agora o serviço que retornará uma lista fake de objetos do tipo Pessoa. No mundo real, esse serviço faria uma busca no banco de dados. Mas não vamos colocar isso aqui :)

public class PessoaWS {

public Pessoa[] obterPessoas(){
Pessoa[] pessoas = new Pessoa[]{
new PessoaImpl("Nelson", 27),
new PessoaImpl("Glauber", 18),
new PessoaImpl("Leal", 65)
};
return pessoas;
}
}

Agora gere o WebService a partir dessa última classe, e em seguida execute-a conforme fizemos no exemplo anterior. O resultado ficará como na imagem abaixo:


Pronto! Temos dois serviços HelloWS e PessoaWS publicados. No próximo artigo mostrarei como acessá-los com uma aplicação Android.

4br4ç0s,
nglauber

5 comentários:

Marcelo Souza disse...

Parabéns.

Uma dúvida, quando tento rodar o exemplo no netbeans, recebo a mensagem:

"... aplication has stopped unexpecdely";

A falha sempre ocorre no "SoapObject soap = new SoapObject"

Você sabe o que pode ser?

Muito obrigado.

Marcelo.

Roger disse...

Glauberman,

Tou tendo um erro na hora de criar o webservice.

Quando eu clico em next na tela do web service ele exibe a mensagem: "IWAB0014E Unexpected exception occurred."

Abração!

Roger disse...

Opa! consegui criar! deixa pra lá! valeu!

Nelson Glauber disse...

Oi Rogerio,

Achei uma possível solução aqui:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=127468

Aparentemente você tem que configurar um server antes. Adiciona um no Eclipse através do menu File > New > Other. Depois seleciona Server. Daí é só seguir o assitente. Vê se funciona.

cris disse...

Olá,

no meu está acontecendo a seguinte exception:

org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: null
[ERROR] The PessoasWS service, which is not valid, caused The following error occurred during schema generation: null
org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: null

vc sabe o poderia ser?