Web Services com Apache Axis e Tipos Complexos – Part III
Criar WebServices já foi um trabalho árduo, mas há alguns anos isto deixou de ser um problema com a ajuda das IDEs. Então vou mostrar como utilizar os recursos do Eclipse que facilitam o desenvolvimento de serviços.
Você já sabe o que é um WebServices e também como é simples publicá-lo utilizando Axis, mas nem todos seus serviços irão trabalhar apenas com tipos de dados primitivos, provavelmente será necessário retornar uma lista de Pessoas, Enderecos, ou qualquer outro tipo de dado complexo.
Nosso cenário é um projeto cujo o objetivo é fornecer consultas de Países e seus respectivos Estados, acessados através de serviços, a definição de Beans, DAOs e qualquer outras classes serão ocultadas, porém, no final deste post você poderá baixar a versão completa do projeto.

Bem como já foi demonstrado aqui precisamos de uma classe para que seja a base do serviço, neste caso será a harpia.region.services.Region, veja:
package harpia.region.services;
/* imports ocultados */
public class Region {
private RegionDAO rdao = new RegionDAO();
/**
*
* @param Nome do Pais
* @return Todos os países encontrados
*/
public Pais[] find(String nmPais){
ArrayList<pais> list = rdao.getAllPais( nmPais );
Pais[] paises = new Pais[list.size()];
list.toArray(paises);
return paises;
}
}
Criando o WSDL
Crie um novo objeto chamado Web Service (File > New > Others > Web Service). Após selecionar Web Service clique em Next.
Clique em Browse e selecione a classe responsável por implementar o serviço, ou seja, harpia.region.services.Region. Veja que o tipo deve ser Bottom up Java Web Service.
Na sequência serão exibidos os métodos disponibilizados pelo serviço, caso você não queira publicar basta desmarcar.

E por fim a caixa de dialogo informa que o servidor Apache está down é que será necessário fazer o startup para concluir a criação e publicação do WSDL, utilize esta mesma tela para iniciar o servidor e concluir o passo-a-passo.
Veja que um novo arquivo foi criado em projeto, agora existe o wsdl/Region.wsdl.
O WSDL (Web Service Description Language) nada mais é do que um Schema XML cujo está descrito o serviço de internet. Você poderá acessar este serviço em http://localhost/Harpia/wsdl/Region.wsdl ou também http://localhost/Harpia/services/Region?wsdl.
Criando o Client
Nosso serviço foi criado em Java 1.5, porem, neste momento poderiamos fazer uma solicitação a partir de qualquer linguagem que saiba interpretar o WSDL. Vamos continuar no Java por enquanto e fazer a chamada do nosso Web Service.
Já que a intensão é mostrar como a IDE facilita a criação de Web Services, aqui vai mais um wizard de como fazer o Web Service Client no eclipse.
Hey Client! Chamaí o serviço pow!
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import harpia.region.bean.Pais;
import harpia.region.services.RegionServiceLocator;
public class HarpiaClient {
public static void main(String[] args) throws RemoteException, ServiceException {
// obter o nome do pais para pesquisa
String nome = JOptionPane.showInputDialog(null, "Qual é o pais?", "Unido");
RegionServiceLocator locator = new RegionServiceLocator(); // localizando ...
Pais[] paises = locator.getRegion().find(nome); // procurando ...
for (int i = 0; i < paises.length; i++) { // exibindo
Pais pais = paises[i];
System.out.println("["+i+"] " + pais.getNome() + " | ID: " + pais.getId_pais());
}
// Simples assim
}
}
E para aqueles que ainda dizem por aí que tudo isso aqui é conversa fiada, se é que existe algum maluco pra dizer isto, tomaí! PHP consumindo o Web Service feito em Java.
<?
$client = new SoapClient(null, array('location' => 'http://localhost/Harpia/services/Region?wsdl',
'uri' => 'http://localhost/Harpia/services/Region?wsdl',
'trace' => '1'));
$result = $client->find('ale');
if( is_soap_fault($result) ){
echo "Ocorreu algum erro.<br/>";
}else{
print_r($result);
}
unset($client);
?>
Faça download dos fontes aqui.
That’s all.







Isso foi demais , funciona mesmo
Vou implementar essa solução integrando Java com PHP
Valeu
Marco Aurélio
Marco Aurélio
29 out 08 at 15:56
Este exemplo está funcionando no eclipse ,porém quando exporto o projeto e rodo sem o eclipse, não consigo enxergar o xsdl
vc sabe porque isso acontece ?
Marco Aurélio
21 nov 08 at 14:03
Responder assim é muito vago, posso tentar ajudá-lo.
Envie-me o war ou se preferir descreva como está configurado, supostamente deveria funcionar.
[]‘s
Luciano
22 nov 08 at 19:53
O arquivo para download não está mais disponivel. Poderia disponibiliza-lo por favor.
Obrigado
Gil
25 fev 09 at 20:20
Gil, o link está reabilitado.
Abraço, boa sorte!
Luciano
25 fev 09 at 21:43
Bom tarde Luciano,
Quando vc diz que “…a definição de Beans, DAOs e qualquer outras classes serão ocultadas…”, o que vc quiz dizer com isso?
Atenciosamente,
Fernando.
Fernando Salgado
3 abr 09 at 16:21
Olá Fernando, eu apenas quiz dizer de que não irei demonstrar todos códigos de todas classes para q não fique imenso o texto, já que o projeto-fonte está disponÃvel para download no fim do post. Okay?
Luciano
6 abr 09 at 10:42
É que estou tendo um problema com meu projeto de webService. Como o webservice trata-se de um projeto de apenas um arquivo, teoricamente nao deve ter imports, certo? Como faço para que ele consiga ter acesso aos objetos que utilizo no webService, por exemplo, alguma objeto de conexão ao banco, ou mesmo um objeto que seja retornado de uma consulta ao banco de dados? Quando executo o webservice do meu eclipse, tudo funciona muito bem, mas q a quando tento executar a partir de uma chamada do browser, ocorre um erro de classNotFound.
Como poderia solucionar este erro? Existe algum lugar que disponibilize minhas classe para que o webservice reconheça?
Atenciosamente,
Fernando
Fernando Salgado
6 abr 09 at 14:00
Fernando, você criou um Web Services ou está tentando consumir um?
O processo inverso para obter estas classes (Tipos Complexos) é conhecido como “Proxy”. Posso tentar ajudá-lo, envie me um e-mail com sua dúvida mais detalhada luciano@lucianosilva.com.
Luciano
10 abr 09 at 22:15