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.

11 Comments

  1. Marco Aurélio disse:

    Isso foi demais , funciona mesmo

    Vou implementar essa solução integrando Java com PHP

    Valeu
    Marco Aurélio

  2. Marco Aurélio disse:

    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 ?

  3. Luciano disse:

    Responder assim é muito vago, posso tentar ajudá-lo.
    Envie-me o war ou se preferir descreva como está configurado, supostamente deveria funcionar.

    []‘s

  4. Gil disse:

    O arquivo para download não está mais disponivel. Poderia disponibiliza-lo por favor.
    Obrigado

  5. Luciano disse:

    Gil, o link está reabilitado.

    Abraço, boa sorte!

  6. 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.

  7. Luciano disse:

    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?

  8. É 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

  9. Luciano disse:

    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.

  10. diego disse:

    amigo! para consumir o wsdl pelo php! eh preciso ter alguma coisa do axis no server?

  11. Luciano disse:

    Diego, não é necessário nada do Apache Axis no server php, apenas suporte ao SOAP.

Leave a Reply