Neste artigo veremos

Teoria sobre Web Services; O que são Web Services; SOAP, WSDL e demais tecnologias.

Qual a finalidade?

Entendimento e utilização de Web Services com Windows Mobile.

Quais situações utilizam esses recursos?

Qualquer tipo de sistema pode utilizar-se de serviços para manipular e integrar soluções.

Resumo do DevMan

Já não é de hoje que ouço falar em Web Services. Realmente eles se popularizaram e com certeza serão sempre uma boa alternativa para integração de dados. Seu uso é simples e seguro.

Nesse artigo veremos o que são e como funcionam os WS. E através de um exemplo acessaremos um WS via aplicação Mobile.

Tenho ouvido falar bastante no consumo de serviços Web dos mais variados tipos. São os famosos Web Services. Esses serviços disponibilizados on-line tornam a vida do desenvolvedor um paraíso quando pensamos em integração. Até bem poucos anos o que mais se ouvia falar era em troca de arquivos no formato texto para integração entre sistemas. Desenvolvi muito CNAB, arquivo de remessa e retorno de bancos e EDI’s.

O fato é que os tempos mudaram e agora podemos ter maior flexibilidade consumindo ou desenvolvendo nossos próprios serviços Web. A questão torna-se ainda mais atraente quando mencionamos que podemos acessar Web Services de aplicações Mobile. Isso mesmo!

Nesse artigo veremos como fazer o desenvolvimento de uma aplicação simples em C# com Visual Studio 2005 e fazer com que ela se conecte a um ou mais serviços on-line.

Entendendo os Web Services

Antes de desenvolvermos uma aplicação capaz de consumir um Web Service, precisamos entender como eles funcionam e o que são exatamente. Vamos ao que interessa.

Quando a internet surgiu, tudo que tínhamos de tecnologia na época nos permitia conectar-se a um site e baixar seu conteúdo para leitura. Era comum o HTML da página permitir a exibição de informações na rede para todos que quisessem acessar. Com o tempo, novas tecnologias e frameworks foram sendo desenvolvidos e disponibilizados para que pudesse servir de ferramenta de desenvolvimento. Tudo isso com o intuito de integrar soluções.

Atualmente o crescimento de sistemas vem alavancando a tecnologia e forçando a criação e realização de tarefas cada vez mais complicadas, complexas. Isso é ótimo, pois nos estimula cada vez mais a identificar problemas e criar soluções para eles. A maior necessidade hoje em dia é fazer a integração de sistemas em diferentes linguagens e plataformas, por isso surgiram os Web Services.

Um amigo me disse uma vez uma frase: qualquer empresa hoje em dia precisa prover serviços. E é verdade. Prover cada vez mais tipos de serviços aos nossos clientes faz com que agreguemos mais valor as nossas empresas e nos coloquem em sintonia direta com a tecnologia. Disponibilizar tais serviços através da internet nos poupa tempo e dinheiro, com certeza. Além é claro de evitar erros humanos e automatizar tarefas, como a geração de boletos on-line por exemplo. Um exemplo que sempre vejo na internet e eventos que participo é o fato de termos vendedores espalhados pelo país inteiro, ou ainda pelo mundo inteiro. Por que isso, se podemos disponibilizar preços, cadastros, vendas e uma série de outros serviços on-line para nossos clientes?

O que estou querendo dizer é que já provemos uma espécie de serviço quando disponibilizamos nosso Web Site a pessoas que desejam comprar nele, pessoas físicas. Isso já é mais do que comum nos dias hoje. Agora, quando pensamos em transações entre empresas o cenário muda. Manter um funcionário somente com o objetivo de entrar em um site, selecionar produtos e fechar pedidos, é loucura e a estrutura acaba sendo muito cara. O melhor que temos a fazer é criar mecanismos para que nosso sistema se integre ao de nossos fornecedores e possam gerar de forma transparente consultas, envio e recebimento de transações, confirmações, pedidos de compras, etc.

É nesse ponto que entram os Web Services. Eles têm o objetivo de prover serviços a quem desejam consumi-los a qualquer tempo. São basicamente aplicações on-line a espera de requisições. A única coisa que não faz sentido nos Web Services é a criação de interfaces para interagir com o usuário, por isso não há essa parte em WS. Isso fica por conta das empresas que desejam acessar tais serviços.

A comunicação entre dois ou mais sistemas é que faz com que os Web Services sejam úteis. O principal uso desse tipo de tecnologia se dá em aplicações B2B (Business to Business). Como mencionei anteriormente uma grande vantagem em se trabalhar com o WS é que são desenvolvidos de forma padronizada e podem ser utilizados por qualquer linguagem ou plataforma, o que torna ainda mais tentador o seu uso. Eu posso, por exemplo, consumir um WS que está alocado em uma plataforma .net com servidor Windows, mesmo que meu sistema seja desenvolvido em PHP, Java, Delphi, ou qualquer outra linguagem que dê suporte a WS.

Nota do DevMan

Business to Business - B2B é o nome dado ao comércio eletrônico associado a operações de compra e venda, de informações, de produtos e de serviços através da Internet ou através da utilização de redes privadas compartilhadas entre parceiros de negócios, substituindo assim os processos físicos que envolvem as transações comerciais. O B2B pode também ser definido como troca de mensagens estruturadas com outros parceiros comerciais a partir de redes privadas ou da Internet, para criar e transformar assim as suas relações de negócios.

Quando desenvolvemos um WS, estamos disponibilizando nossos serviços na Web. Esse serviço pode ser de qualquer natureza, desde uma simples consulta até a inserção de milhares de dados em um SGBD. Internet Explorer, Firefox, Opera e outros já fazem isso por si só, mas não funcionam como provedores de serviços pois necessitam da intervenção humana, o acesso ao serviço.

Peço carona na idéia de um amigo que diz que a grande sacada dos Web Services é que eles permitem que aplicações diferentes se comuniquem entre si e consumam recursos uma das outras independente da plataforma. Com eles, uma aplicação pode chamar outra para executar tarefas simples ou complexas mesmo que as duas aplicações estejam em diferentes sistemas e escritas em linguagens diferentes, ou seja, os Web Services fazem com que os seus recursos estejam disponíveis para que qualquer aplicação cliente possa consumir.

Os Web Services são identificados por um URI (Unique Resource Identifier), descritos e definidos usando XML (eXtensible Markup Language) e utilizam o protocolo SOAP sobre HTTP como transporte entre o cliente ou servidor. A Figura 1 demonstra toda a arquitetura envolvida em um processo que utilize Web Services.

Figura 1. Diagrama da Arquitetura de um WS

Nota: Em TI, um Identificador de Recursos Uniforme (URI) (Uniform Resource Identifier (em inglês)) é uma cadeia de caracteres compacta usada para identificar ou denominar um recurso na Internet. O principal propósito desta identificação é permitir a interação com representações do recurso através de uma rede, tipicamente a Rede Mundial, usando protocolos específicos. URIs são identificadas em grupos definindo uma sintaxe específica e protocolos associados.

Nota do DevMan

O W3C, OASIS são as instituições responsáveis pela padronização dos Web Services. Empresas como IBM e Microsoft, apóiam o desenvolvimento deste padrão. Segundo o W3C (World Wide Web Consortium) um Web Service define-se como: um sistema de software projetado para suportar a interoperabilidade entre máquinas sobre rede. Tem uma relação descritiva num formato machine-processable, especificamente WSDL (Web Service Description Language). Outros sistemas interagem com o Web Service usando as mensagens SOAP, tipicamente sobre HTTP com XML. As bases para a construção de um Web Service são os padrões XML e SOAP. O transporte dos dados é realizado normalmente via protocolo HTTP ou HTTPS para conexões seguras. Os dados são transferidos no formato XML, encapsulados pelo protocolo SOAP.

WSDL

A primeira coisa que precisamos aprender ao desenvolver Web Services é saber o que são os WSDL’s. Os WSDL’s podem ser traduzidos para Descrição de Linguagem Web Services. Em inglês sua sigla significa Web Services Description. Algumas linguagens de desenvolvimento já convertem o WSDL em arquivos que podem ser lidos pela própria linguagem. O WSDL é baseado em arquivos XML para que possam ser lidos e entendidos do ponto de vista de estrutura. Em outras palavras, são nos WSDL’s que ficam as descrições dos métodos de um Web Service.

Outra definição é:

“O WSDL é uma especificação desenvolvida pelo W3C que permite descrever os Web Services segundo um formato XML, independentemente dos formatos de mensagem e dos protocolos de rede que sejam usados. O WSDL descreve os serviços disponibilizados à rede através de uma semântica XML, de forma que toda a informação necessária para se chamar um sistema distribuído e o procedimento necessário para que esta comunicação se estabeleça já estejam também descritos. Enquanto que o SOAP especifica a comunicação entre um cliente e um servidor, o WSDL descreve os serviços oferecidos.”

Nota do DevMan

W3C - World Wide Web Consortium é um consórcio de empresas de tecnologia, atualmente com cerca de 500 membros. Fundado por Tim Berners-Lee em 1994 para levar a Web ao seu potencial máximo, por meio do desenvolvimento de protocolos comuns e fóruns abertos que promovem sua evolução e asseguram a sua interoperabilidade. O W3C desenvolve padrões para a criação e a interpretação dos conteúdos para a Web. Sites desenvolvidos segundo esses padrões podem ser acessados e visualizados por qualquer pessoa ou tecnologia, independente de hardware ou software utilizados, como celulares, PDAs, de maneira rápida e compatível com os novos padrões e tecnologias que possam surgir com a evolução da internet.

SOAP

SOAP (Simple Object Access Protocol) é um protocolo utilizado para invocar de forma remota um método qualquer informando seu endereço, o nome do método e seus parâmetros quando necessário. O SOAP é o principal protocolo para acesso a Web Services e principal componente dessa arquitetura. Projetado para chamar aplicações remotas via Remote Procedure Calls (Chamadas Remotas de Procedimento – RPC) ou ainda troca de mensagens, o SOAP é independente de plataforma de linguagem, sua principal vantagem.

O formato utilizado para envio e recebimento de tais mensagens não poderia ser outro diferente de XML e claro enviados via HTTP. Em outras palavras, tanto a aplicação cliente quanto a servidora podem ser desenvolvidas em linguagens diferentes, pois com XML tudo acaba se tornando mais fácil de fazer a integração.

Ele é o protocolo base para aplicações Web Services e tem garantido bons lucros para quem tem necessidade de interoperabilidade e intercomunicação.

Novamente pego carona nas palavras de um colega no que diz respeito ao protocolo RPC. Por trabalhar basicamente com HTTP, o SOAP consegue, de certa forma, ultrapassar as restrições de segurança/firewalls normalmente impostas a sistemas com que utilizam DCOM. Em vez de usar HTTP para pedir uma página HTML, o SOAP envia uma mensagem de XML através do pedido HTTP e recebe uma resposta, através de HTTP. Observe na Figura 2 como está dividida uma mensagem enviada utilizando protocolo SOAP.

Figura 2. Exemplo de Mensagem SOAP


Criando o exemplo

Na internet podemos encontrar diversos exemplos e Web Services gratuitos que nos oferecem os mais variados serviços, como checagem de e-mail, lista de CEP’s, e até tradutores. Um bom exemplo disso é o site http://www.webservicex.net. Nele encontramos alguns serviços que podem ser consumidos gratuitamente. Até exemplos podem ser facilmente encontrados. Vamos desenvolver uma pequena aplicação capaz de traduzir textos.

Inicie um novo projeto no Microsoft Visual Studio 2005 usando o menu File>New>Project>Visual C#>Smart Device>Pocket PC 2003 assim como na Figura 3. É claro que podemos utilizar qualquer outra opção na janela New Project, mas para nosso exemplo usaremos essa já mencionada (Figura 3).

Figura 3. Criação de novo projeto

Dê um nome à aplicação e um Location (diretório de gravação dos arquivos). Confirme e aguarde a criação do sistema e exibição da tela de exemplo do dispositivo móvel. A primeira coisa necessária para que possamos invocar mais tarde nosso Web Service, é adicionar ao sistema sua referência. Na verdade sua Web Referência. Para isso basta clicarmos no Solution Explorer, em nosso projeto, com o botão direito do mouse e selecionar a opção Add Web Reference e então digitarmos o endereço do serviço no campo URL. Veja que na Figura 4 o endereço do WSDL já foi digitado e o mini-browser já localizou e identificou nosso Web Services.

Agora basta clicar em Add Reference e aguardar que ela seja incluída na aplicação. Para termos certeza de que a referência foi adicionada, basta olharmos para o Solution Explorer e ver que existe um novo node com o link para a referência com.webservicex.www.

Figura 4. Inclusão da referência

Muito bom, agora ficou mais fácil e praticamente quase pronto nosso sistema. Isso mesmo! Quase pronto. O que precisamos fazer agora é incluir o namespace para a referência, criar uma janela para digitar a palavra e codificar a chamada ao WS.

Desenhando a aplicação

Vamos desenhar uma aplicação bem simples. Precisaremos apenas de um ComboBox, dois TextBoxes e um Button. Além disso cada componente, exceto o Button, terá um Label para informar qual o componente. Arraste então o primeiro Label com o Text igual a Traduzir de/para: e logo em seguida um ComboBox(cbxLinguagem). Na sequencia insira um novo Label e digite em seu Text o texto Palavra ou frase para tradução:. E claro, coloque logo abaixo um TextBox(txtFrase). Agora insira um Button(btnTraduzir).

Mais abaixo arraste mais um Label(Tradução:) e um TextBox(txtTradução). Se preferir confira a sugestão de Layout na Figura 5.

Figura 5. Exemplo de layout

Codificando

Como mencionado anteriormente, será necessário incluirmos o namespace Translator.com.webservicex.www ao nosso código-fonte. Esse namespace faz referência ao nosso Web Services gratuito que acabamos de adicionar ao nosso projeto. Clique duas vezes sobre o arquivo Form1.cs para que possamos visualizar seu código.

Na parte superior insira o código a seguir:


  using Translator.com.webservicex.www; 

Isso fará com que tenhamos acesso a todas as funcionalidades desse WS. Em seguida criaremos um procedimento para incluir em um ComboBox as linguagens que poderemos utilizar para traduzir as palavras. Crie um método privado onde possamos declarar tais informações. O código pode ser visto na Listagem 1.

O código é extremamente simples. Veja que a primeira coisa que fazemos é limpar o ComboBox cbxLinguagem para evitar sujeiras no futuro. Em seguida incluímos as línguas que podemos utilizar para fazer as traduções.

Listagem 1. Método para adição de linguagens


  #region PRIVATE METHODS
  private void Init(){
  try{
              //Carregamos o ComboBox de linguagens
  this.cbxLinguagem.Items.Clear;
  this.cbxLinguagem.Items.Add(Language.ChineseTOEnglish);
              this.cbxLinguagem.Items.Add(Language.EnglishTOChinese);
              this.cbxLinguagem.Items.Add(Language.EnglishTOFrench);
              this.cbxLinguagem.Items.Add(Language.EnglishTOGerman);
              this.cbxLinguagem.Items.Add(Language.EnglishTOItalian);
              this.cbxLinguagem.Items.Add(Language.EnglishTOJapanese);
              this.cbxLinguagem.Items.Add(Language.EnglishTOKorean);
              this.cbxLinguagem.Items.Add(Language.EnglishTOPortuguese);
              this.cbxLinguagem.Items.Add(Language.EnglishTOSpanish);
              this.cbxLinguagem.Items.Add(Language.FrenchTOEnglish);
              this.cbxLinguagem.Items.Add(Language.FrenchTOGerman);
              this.cbxLinguagem.Items.Add(Language.GermanTOEnglish);
              this.cbxLinguagem.Items.Add(Language.GermanTOFrench);
              this.cbxLinguagem.Items.Add(Language.ItalianTOEnglish);
              this.cbxLinguagem.Items.Add(Language.JapaneseTOEnglish);
              this.cbxLinguagem.Items.Add(Language.KoreanTOEnglish);
              this.cbxLinguagem.Items.Add(Language.PortugueseTOEnglish);
              this.cbxLinguagem.Items.Add(Language.RussianTOEnglish);
              this.cbxLinguagem.Items.Add(Language.SpanishTOEnglish);
        }
  catch(Exception ex){
  ErrMsgOut(ex);
        }
  }

Agora precisamos criar a função que efetivamente fará a chamada ao nosso Web Service e retornará a mensagem com a palavra traduzida. Crie novamente um novo método e nele digite o código da Listagem 2.

Listagem 2. Código para chamada da tradução


  private void MostrarTraducao(){
        try{
              //Verificamos se o usuário escolheu a linguagem
              object oLang = this.cboLanguage.SelectedItem;
              if(oLang!=null){
                    //Verificamos se o usuário digitou um texto
                    string sFrase = this.txtFrase.Text.Trim();
                    if(sFrase!=String.Empty){
                          //Limpamos o conteúdo do segundo TextBox
                          this.txtTranslation.Text = "";
                          //Traduzimos
                          Language lang = (Language)oLang;
                          TranslationService ts = new TranslationService();
                          string sResults = ts.Translate(lang, sFrase);
                          //Mostramos o resultado
                          this.txtTraducao.Text = sResults;
                    }
                    else{
                          WrnMsgOut("Informe a frase para tradução");
                    }
              }
              else{
                    WrnMsgOut("Seleção de linguagem inválida.");
              }
        }
              catch(Exception ex){
                    ErrMsgOut(ex);
        }
  }

Logo de início nós atribuímos a seleção da linguagem ao objeto oLang. Esse oLang é testado para verificar se existe uma seleção válida, ou seja, se o usuário selecionou uma linguagem para tradução. Feito isso, nós retiramos os caracteres em branco do início e fim da string usando o método Trim. Verificamos então se a string é diferente de vazia, significando que o usuário digitou uma palavra ou frase para tradução.

Limpamos o conteúdo do segundo TextBox (txtTraducao) e chamamos o Web Service passando como parâmetro nosso objeto oLang. Isso fará com que tenhamos o resultado da tradução, veja o trecho de código:


 Language lang = (Language)oLang;
 TranslationService ts = new TranslationService();
 string sResults = ts.Translate(lang, sFrase); 

Nesse trecho estamos fazendo a chamada e recebendo a tradução da palavra digitada. O texto traduzido é alocado na variável sFrase. Por fim atribuímos o conteúdo da variável sFrase a propriedade Text do controle txtTraducao.

Para que tenhamos uma aplicação mais profissional e informativa, perceba que chamamos dois métodos de mensagem que são WrnMsgOut() e ErrMsgOut(). Isso faz com que fique mais simples de exibirmos mensagens ao usuário informando possíveis erros e avisos. Veja o código de ambas funções na Listagem 3.

Nota: Não entrarei em detalhes sobre as funções passadas por não fazer parte do escopo desse artigo.

Listagem 3. Funções de mensagem


  private void ErrMsgOut(Exception ex){
        MessageBox.Show(
              ex.ToString(),
              "ERRO!",
              MessageBoxButtons.OK,
              MessageBoxIcon.Hand,
              MessageBoxDefaultButton.Button1
        );
  }
   
  private void WrnMsgOut(string sMsg){
        MessageBox.Show(
              sMsg,
              "AVISO!",
              MessageBoxButtons.OK,
              MessageBoxIcon.Exclamation,
              MessageBoxDefaultButton.Button1
        );
  }

Por fim, basta que façamos a chamada as funções Init() e MostrarTraducao(). O método Init() deve ser chamado no evento OnLoad do formulário principal, para que possa capturar as linguagens que podemos usar para traduzir nossos textos. Portanto, clique duas vezes no formulário ou apenas selecione o evento OnLoad() como mencionado. Apenas digite o código a seguir:


  Init();

Ou seja, apenas a chamada ao método de carregamento do ComboBox. Repita o processo, mas agora para o botão btnTraduzir. Clique duas vezes nele para facilitar. Digite o código de chamada da função MostrarTraducao() como a seguir:


       MostrarTraducao();

Perceba que não há nada de especial nisso tudo.

Testando o exemplo

Bem, essa é a parte mais divertida de tudo isso e sem dúvida a mais fácil. Basta rodar a aplicação e então entrar com as informações. Claro que será necessário que você configure o dispositivo (emulador) para acessar sua rede e consequentemente a internet para poder fazer a tradução de textos. Se você possuir um SmartPhone, basta copiar o arquivo .EXE gerado pela compilação em seu dispositivo, ativar a rede sem fio e então testar o programa.

Ao inicializar o emulador, apenas escolha a linguagem, digite o texto e cliquem em Traduzir. Veja o resultado na Figura 6.

Figura 6. Tradutor em ação

Conclusão

Como pudemos ver, o desenvolvimento de aplicações Mobile utilizando-se de Web Services não é difícil. O grande lance é que os Web Services possuem documentação on-line através do WSDL e isso facilita bastante o desenvolvimento. Outra grande vantagem é que desenvolvemos aqui em C#, mas poderíamos muito bem desenvolver esse mesmo sistema utilizando-se de outras linguagens, como Visual Basic, Visual J#, PHP entre outras.

Um forte abraço a todos e até a próxima