Desenvolvimento - Web Services
Obtendo dados atualizados da Web através do Excel XP Parte 2 - Consumindo Web Services no Office
O foco deste tutorial é demonstrar um pouco sobre as vantagens dos Web Services e deixar claro a possibilidade de podermos usufruir desta arquitetura nos aplicativos Office.
por Tomás Vásquez- Sistema Operacional: Windows 2000,Windows NT
- Softwares: Office XP ou 2003
- Disponibilzação de um WebService local ou na web
"Web Services" ou Serviços Web, é uma palavra que tem sido usada com certa frequência entre os profissionais de tecnologia. Isso tem mudado de uns tempos para cá. Não para pior é claro, mas sim para provar que os Web Services estão ficando cada vez mais conhecidos e respeitados mesmo entre os profissionais que não são da área de tecnologia.
Os Web Services são um assunto muito longo para que possam ser tratados aqui neste artigo. Colocarei uma breve descrição do que são os Web Services e completarei com links que certamente terminarão a explicação.
Os Web Services , do ponto de vista do desenvolvedor, são como métodos ou funções que podem ser dispostos na Web. O preço para isso é trabalhar no padrão SOAP e XML, que é como esses dados serão trafegados entre as diversas apicações.
Imagine da sequinte forma. Você tem uma função que gostaria de compartilhar ou oferecer aos seus clientes. Como estamos falando de Office, você teria de fazê-la ou numa planlha e disponibilizá-la para download, ou teria que recorrer a qualquer outra tecnologia como ASP por exemplo, mas este não é o foco deste artigo. Primeiro você deveria produzir o Web Service, coisa que hoje, com a quantidade de ferramentas e informações não é nada muito complexo. Depois, você precisaria fazer um aplicativo para consumir o Web Service. Convencer seus usuários a instalar mais um aplicativo seria uma pouco tortuoso não? Imagine então integrar isso com algum outro aplicativo ou solução. Sem chance? Por que não colocá-lo para ser consumido no próprio Office, por exemplo, numa planilha de Excel.
As vantagens são indiscutíveis pois os dados dispostos em uma planilha são passíveis de manipulação além do que qualquer outro aplicativo poderia oferecer. Éssa é nossa intenção. Fazer com que o usuário não precise sair do ambiente de trabalho mais comum para este e possa usufruir de todas as vantagens que os Web Services podem oferecer.
Como tenho a pretensão de que este seja um tutorial o mais completo possível, faremos a produção de um Web Service utilizando a ferramenta Visual Studio .NET 2003 na linguagem VB.NET para familiarizar com os usuário de VBA. Em seguida, iremos consumí-la em algum aplicativo do Office.
Construindo o Web Service
Não serei tão detalhista neste ponto. Caso queira saber mais sobre Web Services, acesse os links que disponibilizo no final deste artigo.
Abra uma nova solução no Visual Studio .NET na linguagem VB.NET do tipo ASP.NET Web Service. Nomeie-a de WSOffice conforme a figura:
Clique em OK para abrir a solução. Na próxima tela, aperte F4 para exibir a janela de propriedades do Web Service e renomeie-o para ServiceOffice:
Abra também do Solution explorer (Crtl+Alt+L) e altere o nome do arquivo Service1.asmx para ServiceOffice.asmx:
Volte à tela anterior e clique na opção que está no centro da tela nomeada de "click here to switch code view" para visualizar a tela de código que deve ser como a seguinte:
Pode-se perceber que já existe um modelo de Web Service pronto, porém comentado. Poderíamos aproveitá-lo, mas vamos construir um Web Service do zero para mostrar a facilidade e familiaridade deste ambiente para os desenvolvedores Office. Digite na tela de código logo abaixo do comentário e antes da linha "End Class" o seguinte:
Public Function Soma(ByVal x As Decimal, ByVal y As Decimal) As Decimal Soma = x + y End Function
Por enquanto não há nenhuma diferença entre este código e o VBA tradicional (salvo o tipo Decimal que é uma nova implementação do .NET) que já conhecemos, mas para tranformá-lo em um Web Service, o VB.NET exige uma sintaxe especial que consiste em colocar a diretiva WebMethod antes da função ou método que pretendemos publicar como serviço. Veja como fica o código depois da diretiva colocada:
<WebMethod(Description:="Soma o valor entre dois números")>_ Public Function Soma(ByVal x As Decimal, ByVal y As Decimal) As Decimal Soma = x + y End Function
O atributo "Description" adiciona uma descrição para ajudar na compreensão do Web Service como veremos mais adiante. Selecione no menu Build a opção Build Solution para compilar o Web Service e verificar seu funcionamento. Se o resultado for como mostra a figura abaixo, o Web Service está OK:
Para testar o resultado do Web Service, acione o menu Debug -> Start para que o Visual Studio faça uma chamada ao Web Service, dado que este trata-se de um serviço do tipo Web. O Resultado é uma página com o nome do método e sua descrição conforme dito anteriormente:
Clique no nome do método para ser enviado para uma página que solicitará os parâmetros necessários para execução da função:
Veja que os parâmetros são nomeados exatamente como fizemos na função produzida anteriormente. Insira dois valores, por exemplo, 25 e 25 e veja o resultado em XML:
Feito isso, o Web Service está pronto. Precisamos apenas gravar a primeira URL acessada deste Web Service, que no caso foi:
http://localhost/WSOffice/ServiceOffice.asmx
Grave essa URL ou anote em algum local.
Consumindo o Web Service no Office
Agora vamos ao que nos interessa. Trabalhar no Office.
Até agora não tenho informações de que o Office pode produzir Web Services, mas é possível comsumí-los sim. Para isso, é necessário instalar um ToolKit disponibilizado no site da Microsoft que é gratuito. Isso é necessário porque esse ToolKit dá ao Office a possibilidade de trabalhar com o protocolo SOAP, que é o padrão dos Web Services. Você pode baixar o ToolKit em:
Baixe o arquivo Setup.exe e execute para concluir a instalação. A pasta padrão é C:\Arquivos de programas\Microsoft Office 2003 Web Services Toolkit, ou XP se for o seu caso.
Abra o Excel. Entre no ambiente VBA com Alt+F11. Ao instalar este ToolKit, ele habilita uma nova opção no menu Ferramentas do VBA. Veja que dirente de anteriormente, agora existe uma opção chamada "Web Services Reference":
Clique nesta opção e a caixa de diálogo seguinte será aberta:
Esta tela oferece a você um conjunto de ferramentas que possibilitam procurar por Web Services publicados em serviços como o UDDI. Nos links sobre Web Services estes tipos de serviço são bem detalhados. Neste caso, usaremos o Web Service produzido por nós mesmos na primeira parte deste tutorial. Portanto, clique na opção Web Service URL para dizermos ao ToolKit que queremos informar a URL do nosso Web Service. Na caixa de texto URL: digite a nossa URL gravada no final da primeira parte deste aritgo e clique em Search:
Se tudo der certo, o assistente encontrará o Web Service e a caixa mais acima à direita deverá listará todas a funções que esse Web Service dispõe, que no nosso caso, nomeamos de ServiceOffice.
Expanda o nó ServiceOffice e veja que a função Soma é listada, inclusive com sua descrição:
Você pode clicar no botão Test para abrir e testar o Web Service novamente como foi feito no primeiro passo. Após isso, selecione o Web Service ServiceOffice marcando sua caixa de seleção e em seguida clique em Add.
Quando isto for feito, será montado um módulo de classe no VBA que conterá todos os métodos e classes necessárias para acessar o Web Service. Não convém analisarmos passo a passo este módulo de classe, mas vale a pena dar uma olhada no resultado produzido:
Você pode perceber que a função que faz a chamada à função Soma do Web Service é traduzida para a Function wsm_Soma conforme a figura abaixo:
E é essa Function que deveremos usar para chamar a função do nosso Web Service. Vamos agora fazer uma Function que utilize esse Web Service. Adicione um módulo no VBA e digite a seguinte função:
Public Function SomaWeb(ByVal x As Double, ByVal y As Double) As Double Dim ws_Office As New clsws_ServiceOffice SomaWeb = ws_Office.wsm_Soma(x, y) End Function
Na planilha, digite a seguinte fórmula:
=SomaWeb(10;10)
Veja o resultado. Isso obviamente também pode ser aproveitado por programas VBA. Portanto,motaremos um pequeno aplicativo. Ainda no VBA, insira um UserForm com duas TextBox, um CommandButton e um ListBox conforme a figura:
Clique duas vezes sobre o CommandButton1 para gerar seu evento Click e insira o seguinte código:
Private Sub CommandButton1_Click() Dim N1, N2, Result As Double "Declara e instacia a variável do Web Service Dim ws_Office As New clsws_ServiceOffice "Pega os números digitados nos TextBox N1 = CDbl(TextBox1.Text) N2 = CDbl(TextBox2.Text) "Chama a função Soma do Web Service ServiOffice e "atribui à variável Result Result = ws_Office.wsm_Soma(N1, N2) "Insere o resultado no ListBox ListBox1.AddItem CStr(Result) End Sub
Execute o formulário e veja o resultado:
A primeira execução é um pouco lenta, mas isso já era esperado já que estamos recebendo dados da diretamente da Web. O restante das chamadas ficam mais rápidas pois a função executada fica em cache após a primeira chamada.
Bom, qual é a graça de se fazer uma soma através da Web você deve estar se perguntando. Tudo bem, foi uma simples soma, mas se isso pode ser feito, imagine quais funções você poderia disponibilizar em um Web Service? Posso oferrcer algumas sugestões:
- Resultado de uma consulta a um banco de dados
- Acesso a funções padronizadas, disponibilizadas por orgãos regulamentadores
- Acesso a informações como bolsa de valores, dólar, cotações mundiais
Isso são alguns serviços que se podem acessar. Pense agora no que você poderia fazer pelos seus clientes.
Alguns detalhes fazem dos Web Services uma ferramenta imprecindível hoje em dia. A primeira delas é que o protocolo SOAP se baseia totalmente em XML, que já pode ser considerado padrão em troca de dados entre aplicativos, mesmo que estes sejam heterogêneos (rodando em ambientes e sistemas operacionais diferentes). Os dados trafegam pelo protocolo HTTP, ou seja, utilizam a porta 80 para transferir seus dados. Isso é importante pois não corremos o perigo de em algum momento barrarmos em alguma política de segurança, roteadores ou firewalls bem ou mal configurados. A segurança torna-se praticamente implícita, já que XML não passa de simples texto semanticamente.
Não devemos também amarrar os Web Services a uma tecnologia pois este já é um padrão de mercado. O Web Service produzido acima poderia ter sido feito em qualquer outra arquitetura como o J2EE da Sun.
Além do mais, você poderia consumir qualquer outro Web Service. Para os propósitos deste artigo, produzimos o nosso próprio Web Service para facilitar o entendimento de sua utilização.
Instalação do Web Service no Cliente
Quando uma aplicação MS-Office solicita um Web Service é preciso ter alguns arquivos instalados na máquina. Isso pode ser visto indo ao VBA, clicando em Ferramentas -> Referências. Veja que existe a referência à biblioteca "Microsoft Office Soap Library v3.0". Significa que você precisará instalar o SOAP ToolKit em todas as máquinas com Office da empresa. A sugestão é que você crie um pacote de instalação através de algum aplicativo Windows Instaler ou Visual Studio .NET ou Visual Studio 6 incluindo os seguintes arquivos:
- Microsoft SOAP 3.0 MSM, cujo local padrão é C:\Arquivos de programas\Arquivos comuns\Microsoft Shared\Web Service Reference\Redist\soap_core.msm.
- MSXML4.MSM, cujo local padrão é C:\Arquivos de programas\Arquivos comuns\Microsoft Shared\Web Service Reference\Redist\1033\MSXML4.MSM. Desta forma você já tem disponíveis as bibliotecas do SOAP e XML.
O foco deste tutorial era demonstrar um pouco sobre as vantagens dos Web Services e deixar claro a possibilidade de podermos usufruir desta arquitetura nos aplicativos Office. O Web Service poderia ter sido consumido tanto no Excel como neste exemplo como no Word, Access ou qualquer aplicativo da família Office que suporte o VBA.
Com certeza, você poderá incrementar suas soluções em Office em muito utilizando os recursos dos Web Services. Isso também deixa claro o compromisso da Microsoft com o produto Office, fazendo aquele fantasma de que o VBA será abandonado algo cada vez mais distante, mas não impossível. Mas isso já é outra história.
Referências e artigos recomendados sobre o assunto
- http://www.microsoft.com/brasil/msdn/tecnologias/webservices/web_services_8.aspx
- http://www.microsoft.com/brasil/msdn/tecnologias/webservices/web_services_5.aspx
- http://www.microsoft.com/brasil/msdn/colunas/webservices/col_webservices_1.aspx
- http://www.microsoft.com/brasil/msdn/colunas/batepapo/col_batepapo_3.aspx
- http://www.linhadecodigo.com.br/artigos.asp?id_ac=61
- http://www.linhadecodigo.com.br/artigos.asp?id_ac=60
- http://www.linhadecodigo.com.br/artigos.asp?id_ac=38
- http://www.linhadecodigo.com.br/artigos.asp?id_ac=3
- http://www.linhadecodigo.com.br/artigos.asp?id_ac=393
Abraços
Tomás Vásquez
Tomás Vásquez Web Page
The Spoke
- Verificando disponibilidade de um serviço WCF ou WebServiceC#
- Criando um WebService com ASP.NET Razor e WebMatrixWeb Services
- Construindo um List Suggest com ASP.NET Web Services e JQueryASP. NET
- Consumindo serviços REST com HttpClientWeb Services
- REST e o WSDLWeb Services