No artigo anterior, mostrei
como criar um Webservice em Java EE5 usando EJB3 e rodando a aplicação
no JBoss AS 5.1, o Webservice foi consumido em uma aplicação C#. Tudo
isso foi possível porque as duas implementações(java e .net)
implementam WS-I Basic Profile.
Hoje veremos como
criar um Webservice em Aspx usando C# como linguagem de implementação e
vamos consumir este Webservice com uma aplicação Java usando o Jax-WS.
Antes de começar vamos às dependências para execução destas aplicações.
Dependências das Aplicações
- Java JDK 6_16
- Jax-WS 2.1.x
- eclipse 3.4.x
- Visual Studio 2008
- SoapUI
Aplicação .net
Agora
vamos criar a aplicação .net que disponibiliza um Webservice. Abra o
visual studio 2008 e crie uma aplicação do tipo ASP.NET Web Service. O
Visual Studio vai criar um código de exemplo com um olá, mundo – nós
vamos modificar este código.
Atenção: O Visual Studio se perde quando mudamos o namespace e o nome da classe do Webservice. Você precisa abrir o arquivo asmx e ajustar para o namespace e nome da classe corretamente, eu tive que faz isso via filesystem. 🙁
Agora, vamos criar uma interface que o Webservice irá implementar. Ela é semelhante à interface que criei na aplicação Java no outro artigo.
IDateService.cs
using System;<br /><br />namespace csharp.net.ws<br />{<br /> // Summary:<br /> // Contrato do Serviço de datas<br /> //<br /> // Returns:<br /> // Retorna uma String contendo a data atual<br /> //<br /> public interface IDateService<br /> {<br /> string getDate();<br /> }<br />}A
interface IDateService define o serviço de datas de forma igual à que
foi feita em Java. Agora vamos à implementação do Webservice.
DateServiceWS.asmx.cs
using System;<br />using System.Collections;<br />using System.ComponentModel;<br />using System.Data;<br />using System.Linq;<br />using System.Web;<br />using System.Web.Services;<br />using System.Web.Services.Protocols;<br />using System.Xml.Linq;<br /><br />namespace csharp.net.ws<br />{<br /> /// <summary><br /> /// Webservice feito em .net com C# que prove um serviço de datas.<br /> /// </summary><br /> [WebService(Namespace = "http://wsdotnet.csharp.diego.pacheco.blogspot.com/")]<br /> [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]<br /> [ToolboxItem(false)]<br /> public class DateServiceWS : System.Web.Services.WebService, csharp.net.ws.IDateService<br /> {<br /> [WebMethod]<br /> public string getDate()<br /> {<br /> DateTime dt = System.DateTime.UtcNow;<br /> return dt.ToString("dd/MM/yyyy HH:mm:ss");<br /> }<br /> }<br />}OK. Vou explicar os elementos importantes neste código C#.
- [WebService]: Indica que este é um Webservice e deve ser exposto com tal. Estou definindo o namespace(pacote para o pessoal do Java).
- [WebServiceBinding]: Indica através do ConformsTo que este Webservice implementa WS-I Basic Profile 1.1.
A
classe DateServiceWS estende a classe System.Web.Services.WebService do
framework para trabalhar com Webservices e ainda implementa a interface
que eu criei, chamada de csharp.net.ws.IDateService.
Nota:
Pessoal do java, em .net eu posso estender classes e implementar
interfaces com o mesmo operador “:”. Pessoal do .net, em java, para
implementar uma interface, eu preciso usar o operador “implements” e
para estender tenho que usar o operador “extends”.
Vamos ver o
método getDate() que retorna a data atual do servidor Aspx no qual ele
vai estar rodando, o mais importante aqui é o [WebMethod] que indica que este método é uma operação do Webservice.
Agora
basta rodar esta aplicação no Visual Studio apertando F5. Você pode
entrar neste endereço no seu browser para obter o WSDL:
http://localhost:61561/DateServiceWS.asmx?WSDL
Ok.
Vamos testar o Webservice feito em .net com a ferramenta de testes de
Webservices chamada SoapUI(Que é feita em Java 🙂 ). Basta criar um
projeto no SoapUI usando o WSDL que foi obtido na URL acima e executar
a operação getDate.

Teste do WS com o SoapUI 3
Aplicação Java
Agora
vamos à aplicação Java. Vou utilizar o Jax-WS 2.1.x e vamos gerar as
classes a partir do WSDL do Webservice .net. Para isso vou utilizar o
utilitário wsimport que está no diretório $JAX_WS_RI_HOME\bin\wsgen.bat
ou .sh se você usa linux. Copie o wsdl(DateServiceWS.asmx.xml) para a
pasta bin do seu jaxws e execute o seguinte comando:
$ wsimport.bat -keep DateServiceWS.asmx.xml Ele vai gerar as classes no diretório bin do jaxws. Agora basta criar
um projeto no eclipse e colocar os fontes gerados em um source folder.
Você irá precisar das dependências do Jax-WS no seu projeto. Para isso
copie a pasta lib toda do seu jax-ws para o classpath do seu projeto do
eclipse.
Agora vamos à classe Java que chama o Webservice feito em .net, confira o código abaixo:
package com.blogspot.diegopacheco.plainjava.wsclient;<br /><br />import com.blogspot.pacheco.diego.csharp.wsdotnet.DateServiceWS;<br />import com.blogspot.pacheco.diego.csharp.wsdotnet.DateServiceWSSoap;<br /><br />/**<br /> * Classe wsclient que consome o WS feito em .net<br /> *<br /> * @author Diego Pacheco<br /> * @version 1.0<br /> * @since 31/08/2009<br /> *<br /> */<br />public class WsClient {<br /><br /> public String getDate() {<br /> DateServiceWS dsService = new DateServiceWS();<br /> DateServiceWSSoap ds = dsService.getDateServiceWSSoap();<br /> return ds.getDate();<br /> }<br /><br /> public static void main(String[] args) {<br /> WsClient wsc = new WsClient();<br /> String dts = wsc.getDate();<br /> System.out.println(dts);<br /> }<br /><br />}Você pode perceber que criei o objeto
DateServiceWS, depois obtive uma instância do objeto DateServiceWSSoap
que é o objeto que representa o WS(proxy). Agora basta chamar o método
getDate() que é feito na seqüência.
Ao executar este código, você deve ver a data atual no seu console, semelhante à imagem abaixo:

Aplicação Java WSClient que consome o WS .net com Jax-WS
Em um outro artigo, mostrarei uma aplicação Java EE5 rodando no JBoss AS 5.x
que consome este mesmo WS e também como consumir este WS usando SOAP
puro em Java. Se o leitor quiser, pode pegar os fontes destas aplicações
no meu repositório do Subversion:
Abraços e até a próxima.







