Tag: ‘webservices’
Annotations e XFire um jeito simples de criar Web Services
Eu já falei um pouco de Web Services por aqui, mas ainda tem muita coisa a ser discutida e experimentada sobre este assunto.
Existem diversas formas de distribuir serviços na internet e a o número de ferramentas para tornar isto cada vez mais fácil aumentam constantemente. Pesquisando sobre conceitos e maneiras práticas para desenvolvimento encontrei no Blog dos Desenvolvedores da Caelum um jeito simples para criação de Web Services utilizando a especificação JSR-181 e JSR-224, achei interessantíssimo e não perdi tempo em fazer os testes.
A especificação permite que você crie serviços utilizando apenas Annotations.
import javax.jws.WebMethod;
import javax.jws.WebService;
import tucano.bean.Pessoa;
@WebService
public class PessoaWS {
private Pessoa[] list = new Pessoa[5];
public PessoaWS() {
list[0] = new Pessoa("M", "Luciano", "Silva");
list[1] = new Pessoa("F", "Priscila", "Carmo");
list[2] = new Pessoa("F", "Maria", "Conceição");
list[3] = new Pessoa("F", "Lucia", "Felix");
list[4] = new Pessoa("M", "Cristino", "José");
}
@WebMethod
public Pessoa[] listAll(){
return list;
}
}
Perceba que este Web Service foi criado de maneira extremamente simples apenas para demonstração, porém, o método retorna um tipo de dado complexo, isto para sair da monotonia.
Ainda o que os caras da Caelum, vamos fazer a publicação/ativação do serviço utilizando o XFire projeto relacionado ao Apache CXF
<!-- // X-Fire //---> <servlet> <servlet-name>XFireServlet</servlet-name> <display-name>XFire Servlet</display-name> <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>services.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <!-- // //--->
Se você for seguir o site do projeto X-Fire, irá perceber que é sugerido a criação do arquivo no caminho META-INF/xfire/services.xml, isto não deu muito certo comigo, tentei diversas configurações e até percebi que é um bug em aberto para o projeto.
Para resolver o problema opite por colocar o arquivo de configuração services.xml na raíz do source [src/services.xml].
<beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>PessoaService</name> <namespace>http://xfire.codehaus.org/PessoaService</namespace> <serviceClass>tucano.ws.PessoaWS</serviceClass> </service> </beans>
Básicamente a configuração se resume em um nome para o Serviço e a Classe que implementa-o. Após fazer deploy do projeto no seu container JEE você poderá acessar o serviço da seguinte maneira http://localhost/<CONTEXTO>/services/<SERVICE_NAME>?wsdl, então, http://localhost/Tucano/services/PessoaService?wsdl.
Você pode fazer o download dos fontes aqui.
É prático, fácil e rápido, vale ser estudado e em alguns casos sugerido como solução, mesmo assim eu estou cansado de ver configurações em arquivo XMLs fora do contexto, não sou muito adepto a esta solução, de qualquer maneira tá dado o recado. =)
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.
Web Services com Apache Axis – Part II
Dando sequência a WebServices agora vou demonstrar um exemplo prático de como criar um serviço utilizando os recursos do framework Apache Axis.
A instalação do Axis funciona como qualquer outra API na plataforma JEE, portanto não será detalhado este procedimento.
A criação de webservices com Apache Axis é muito simples, veja a classe abaixo:
public class Calculo {
/**
*
* @param n1
* @param n2
* @return Resultado da Soma
*/
public double soma(double n1, double n2){
return (n1 + n2);
}
}
Após criar essa simples classe composta pelo método soma, cujo retorna um tipo primitivo, para que esta classe seja publicada como um serviço basta copiá-la para a aplicação do Axis ($TOMCAT_HOME\webapps\axis) em seguida renomeá-la para Calculo.jws. Acesse o serviço como http://localhost:8080/axis/Calculo.jws?wsdl, isto é tudo.
Simples assim, criar o Client que irá utilizar o serviço é tão simples quanto.
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class CalculoClient {
/**
* @param args
*/
public static void main(String[] args) throws Exception{
String url = "<a href="http://localhost/axis/Calculo.jws?wsdl">http://localhost/axis/Calculo.jws?wsdl</a>";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( url );
call.setOperationName("soma"); // método do webservices
Double[] param = {15.0, 15.0}; // parâmetros
Double result = (Double) call.invoke( param ); // chamada
System.out.println("Resultado : " + result );
}
}
Exemplos iguais a este devem existir centenas de milhares na internet, simples utilizando tipos primitivos, básico mesmo. Mas cansado de saber disto vou demonstrar um exemplo mais completo utilizando tipo de dados complexos!
Veja mais esses artigos excelentes:
http://www.javafree.org/content/view.jf?idContent=4
http://www.guj.com.br/java.tutorial.artigo.180.1.guj
http://www.guj.com.br/java.tutorial.artigo.132.1.guj
Web Services – Part I
Provavelmente você já ouviu falar sobre serviços na web, mas cê sabe mesmo o que é isto?
Web Services nada mais é do que um serviço remoto descrito utilizando a WSDL – Web Service Description Language – e acessado utilizando um protocolo (SOAP) totalmente abstrato.
As grandes do mercado Microsoft, Oracle, IBM, Sun, HP entre outos, estão a frente do WS-I, orgão responsável por manter e garantir o funcionamento dos webservices em qualquer plataforma.
Simples assim…
O popular SOAP nada mais é do que um schema descrito em XML, definindo o serviço e sua localização, para que o cliente faça a conexão.








