Trocando dados entre sua aplicação Visual Basic e a Internet
Tenho recebido diversos emails com dúvidas relacionadas a como acessar dados em um servidor remoto. Coisas do tipo :
Na verdade não existe uma resposta definitiva que resolva essas questões. Cada caso é um caso e muitos fatores tem que ser levados em consideração : o ambiente, os recursos, a implementação , as regras de negócios , o quanto se quer e se pode gastar , o objetivo final , etc...
Neste artigo vou mostrar uma solução para o um problema hipotético que servirá como um estimulo para que outras soluções seja criadas a partir da que vou mostrar. Embora simples ela é perfeitamente plausível e funcional.
O problema
Vamos supor que sua empresa tenha um site de vendas na internet que você queira acessar os dados dos produtos exibidos em sua página em uma aplicação Visual Basic. E então ? como fazer isto ???
Vou usar como exemplo a página da loja virtual que esta hospedada em http://www.macoratti.net/macoratti/loja/index.htm .(Esta loja foi construída em uma série de artigos ; para ler o primeiro artigo acesse : Criando a sua Loja Virtual - Objetivos e Modelagem de dados. )
Vou mostrar as telas iniciais do site loja virtual :
- Ao
lado esta a página inicial do site da sua empresa :
JcmSoft - A sua Loja Virtual - A seguir , abaixo , vamos exibir o catálogo de produtos |
|
|
Agora vamos mostrar a tela que exibe detalhes dos produtos , quando o usuário clicar no link relacionado ao produto: (veja a tela abaixo)
tela exibindo detalhes dos produtos |
Muito bem ! Eu quero criar uma aplicação Visual Basic que acesse e exiba localmente os dados mostrados na tela do site acima , ou seja , minha aplicação vai ter que exibir os seguintes dados :
Como fazer este acesso e como 'pegar' os dados e exibí-los em uma aplicação feita em Visual Basic localmente ?
A solução
É claro que não existe uma única forma de resolver este problema , vou mostrar uma delas.
Problema | Solução |
Como acessar as informações localizadas em um servidor remoto ? | Vou usar o controle INET (MSINET.OCX) |
Como tratar as informações e exibi-las localmente ? | Vou usar XML e DOM. |
Para este caso estou considerando a utilização do protocolo HTTP , e , neste caso a utilização do controle INET é muito simples , vou acessar as informações usando o INET , gerar um arquivo XML e depois localmente tratar este arquivo para exibir os dados na minha aplicação Visual Basic.
Fazendo alguns ajustes
A tela que exibe os detalhes dos produtos é acessada pelo link : http://macorati/loja/detalhe.asp?id=1 ; para o código do arquivo detalhe.asp passamos como parâmetro o código do produto que desejamos exibir. O link http://macorati/loja refere-se ao meu servidor virtual (estou usando o Personal Web Server) . Veja abaixo o código do arquivo detalhe.asp :
%@
Language=VBScript %> <!-- #Include file="ADOVBS.INC" --> <html><head> <title>detalhe.asp</title> </head> <body bgcolor="#FFFFFF"> <% 'declara as variáveis Dim frm_codId Dim frm_nome Dim frm_descricao Dim frm_valor Dim frm_urlimagem Dim SQL Dim quantidade ItemId=clng(request.querystring("id")) set conntemp=server.createobject("adodb.connection") conntemp.open application("conecta_bd") SQL="select * from produtos where ProdutoID =" & ItemId set rstemp=conntemp.execute(SQL,, aCmdText) ' verifica se há dados no recordset If rstemp.eof then response.write "Não há dados a exibir<br>" response.write aspSQL & "<br>Não retorna informação alguma..." connection.close set connection=nothing end if urlimagem=rstemp("urlimagem") <table
border="0" width="661"> |
Obs: Para explicações sobre o arquivo detalhe.asp acesse o artigo: Detalhando as informações sobre cada produto
Ao observer o código você percebe que o código HTML é usado para formatar a exibição dos dados em tabelas.
Para acessar as informações do site eu vou usar a url : http://macorati/loja/detalhe.asp?id=x usando o controle INET , mas eu preciso gerar um arquivo XML que retorne os dados para depois acessar este arquivo usando o DOM . (Para saber mais sobre XML leia o artigo : XML - eXtensible Markup Language - Introdução e para saber mais sobre o DOM leia o artigo : VB6 - Integrando XML com Visual Basic. )
Então eu vou alterar o arquivo detalhe.asp para retornar apenas um arquivo XML com a seguinte estrutura :
<Produtos> <Codigo>1</Codigo> <Autor>Macoratti, José Carlos</Autor> <Descricao>Completo com os fontes. Controla Valores/Saldos; Gera relatórios; Gera Gráficos, Exporta dados para o Excel.</Descricao> <Paginas>1</Paginas> <Preco>15,00</Preco> </Produtos> |
Fazemos isto removendo toda o código HTML usado para formatar os dados em tabelas no arquivo detalhe.asp. O código do novo arquivo detalhe.asp é o seguinte:
Dim SQL Dim strXML Dim ItemId ItemId=clng(request.querystring("id")) set conntemp=server.createobject("adodb.connection") 'a conexão usando um driver ODBC é apenas mostrada pois é mais lenta que usar um provedor OLE DB conntemp.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("\macoratti\db\esoft.mdb") conntemp.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" & Server.MapPath("\macoratti\db\esoft.mdb") '& ";" & "USER ID=admin;PASSWORD=;" SQL="select * from produtos where ProdutoID =" & ItemId set rstemp=conntemp.execute(SQL,, aCmdText) ' verifica se há dados no recordset If rstemp.eof then response.write "Não há dados a exibir<br>" response.write aspSQL & "<br>Não retorna informação alguma..." connection.close set connection=nothing else strXML = "<Produtos>" & vbcrlf strXML = strXML & "<Codigo>" & ItemId & "</Codigo>" & vbcrlf strXML = strXML & "<Autor>" & rstemp("Autor") & "</Autor>" & vbcrlf strXML = strXML & "<Descricao>" & rstemp("descricao") & "</Descricao>" & vbcrlf strXML = strXML & "<Paginas>" & rstemp("paginas") & "</Paginas>" & vbcrlf strXML = strXML & "<Preco>" & formatnumber(rstemp("Valor"),2) & "</Preco>" & vbcrlf strXML = strXML & "</Produtos>" end if response.write (strXML) %> |
Pronto ! esta tudo preparado para que possamos acessar a página no servidor usando o arquivo detalhe.asp e gerar um arquivo XML com os dados do produto desejado. Vamos agora criar a aplicação Visual Basic que fará este serviço.
Criando a aplicação Visual Basic para acessar dados remotos
Inicie um novo projeto no Visual Basic e no formulário padrão os controles conforme o layout abaixo
- A seguir faça uma
referência a library Microsoft XML 3.0
|
Vamos usar a referência a library Microsoft XML 3.0 para usar o DOM e o componente INET é que irá fazer o acesso aos dados. Para saber mais sobre o controle INET leia os artigos :
Como vamos usar o protocolo HTTP vamos usar algumas propriedades do controle INET . Abaixo temos as principais propriedades que iremos usar no nosso projeto:
Como já disse anteriormente a utilização do controle INET para acessar a página com os dados é simples . Ao executar o projeto Visual Basic o usuário deverá informar um número que corresponde ao código do produto que deseja exibir no formulário e a seguir clicar no botão de comando - Exibir dados do produto no formulário - . O código associado ao vento Click do botão de comando - cmdexibir - é o seguinte:
Private Sub cmdexibir_Click() Dim enderecoUrl As String Dim arquivoXml As String If txtCodigoProduto.Text = "" Or Not IsNumeric(txtCodigoProduto.Text) Then MsgBox "Código do Produto Inválido ! ", vbCritical, "Código do Produto" Exit Sub End If enderecoUrl = "http://macorati/loja/detalhe.asp?id=" & Val(txtCodigoProduto.Text) With inet1 .AccessType = icDirect .Proxy = "" .Protocol = icHTTP arquivoXml = .OpenURL(enderecoUrl) End With Call processaArquivoXml(arquivoXml) End Sub |
Vamos explicar o código :
Dim
enderecoUrl As String Dim arquivoXml As String |
- definição das variáveis Strings para armazenar o endereço da página de dados e o arquivo XML |
If
txtCodigoProduto.Text = "" Or Not
IsNumeric(txtCodigoProduto.Text) Then MsgBox "Código do Produto Inválido ! ", vbCritical, "Código do Produto" Exit Sub End If |
- Verifica se o codigo informado pelo usuário é válido |
enderecoUrl
= "http://macorati/loja/detalhe.asp?id=" &
Val(txtCodigoProduto.Text) |
Atribui á variável enderecoUrl a url da página de dados e o código do produto a exibir informado |
With
inet1 .AccessType = icDirect .Proxy = "" .Protocol = icHTTP arquivoXml = .OpenURL(enderecoUrl) End With |
- Configura as propriedades do controle INET |
Call processaArquivoXml(arquivoXml) | - Invoa a procedure - processaArquivoXML - para ler o arquivo XML gerado e exibir os dados usando DOM |
A procedure processaArquivoXMl recebe como parâmetro o nome do arquivo XML gerado e é quem fai fazer todo o serviço . O código da procedure é o seguinte:
Private Sub processaArquivoXml(arqxml As String) '-------------------------------------- ' define as variáveis usadas no programa '--------------------------------------- Dim oDom As DOMDocument Dim Numerocampos As Integer Dim icontador As Integer Dim NomeCampos As String '-------------------------------- ' instancia o objeto DOM '-------------------------------- Set oDom = New DOMDocument With oDom .loadXML arqxml '-------------------------------------------------------------- ' verifica se os dados foram recebidos e o arquivo XML carregado '-------------------------------------------------------------- If .parseError.errorCode <> 0 Then MsgBox "Não foi possível acessar os dados !" & vbrlf & _ .parseError.errorCode & vbCrLf & _ "linha : " & .parseError.Line & vbCrLf & _ "descrição : " & .parseError.srcText, vbCritical, "Erro no acesso aos dados " Set oDom = Nothing Exit Sub Else Numerocampos = .childNodes(0).childNodes.length If Numerocampos = 1 Then Dim oTexto As Object For Each oTexto In Me.Controls If TypeOf oTexto Is TextBox Then oTexto.Text = "" End If Next oTexto MsgBox " Nenhum produto foi encontrado !", vbCritical, " Produtos " Set oDom = Nothing Exit Sub End If For icontador = 0 To Numerocampos - 1 Me("txt" & .childNodes(0).childNodes(icontador).baseName).Text = .childNodes(0)._ childNodes(icontador).Text Next End If End With End Sub |
Ao executar o projeto , informar o código do produto e clicar no botão para exibir os dados teremos o seguinte resultado:
Voilá , os dados da página são capturados e exibidos no seu programa VB . Até o próximo artigo...
Mar 3:9
Recomendou, pois, a seus discípulos que se lhe preparasse um barquinho, por causa da multidão, para que não o apertasse;Mar 3:10
porque tinha curado a muitos, de modo que todos quantos tinham algum mal arrojavam-se a ele para lhe tocarem.Mar 3:11
E os espíritos imundos, quando o viam, prostravam-se diante dele e clamavam, dizendo: Tu és o Filho de Deus.
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB.NET - Conhecendo as estruturas de controle - Macoratti ...
VB .NET - Copiando arquivos entre diretórios - Macoratti.net