Dev (Back & Front)ARTIGO

Interoperabilidade na prática – Parte 02

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.

é Técnico em Processamento de Dados e graduando em Ciências da Computação(7º sem.) na Ulbra. Já trabalhou com desenvolvimento de software em VB, ASP, .NET e PHP. Atualmente é Arquiteto de Software criando soluções corporativas em Java. Certificado pela SUN com SCJP 5 e SCWD 5. Mantém o blog (diego-pacheco.blogspot.com).

Ver perfil