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 :

  1. Código do Produto
  2. Nome do Autor
  3. Decrição
  4. Páginas
  5. Preço

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")
urlimagem="<img src='" & urlimagem & "'>"
%>

<table border="0" width="661">
<tr>
<TD bgcolor="#FFFFFF" width="653" colspan="4">
<p align="center"><b><font color="#008080" size="5" face="Verdana">JcmSoft
- A sua Loja Virtual</font></b>
</TD>
</tr>
<tr>
<TD align=middle bgColor=#008080 width="653" colspan="4">
<p align="center"><B><FONT color=#FFFFFF 
face=arial size=-2>Copyright JcmSoft. Todos os direitos reservados</FONT></B></p>
</TD>
</tr>
<tr>
<td width="653" colspan="4"><b><font face="Verdana" size="2" color="#008080">Detalhe</font></b>
<hr color="#008080">
</td>
</tr>
<tr>
<td width="182" rowspan="5">
<p align="center">
<%=urlimagem%>
</td>
<td width="156"><b><font face="Verdana" size="1" color="#000000">Autor</font></b>
</td>
<td width="315" colspan="2"><font face="Verdana" size="2" color="#008080">
<%=rstemp("Autor")%></font>
</td>
</tr>
<tr>
<td width="471" colspan="3">
</td>
</tr>
<tr>
<td width="72"><b><font face="Verdana" size="1" color="#000000">Descrição</font>
</b>
</td>
<td width="361" colspan="2"><font face="Verdana" size="1" color="#000000">
<%=rstemp("descricao")%></font>
</td>
</tr>
<tr>
<td width="72"><font face="Verdana" size="1" color="#000000">
<b>Páginas</b>
</font>
</td>
<td width="583" colspan="2"><font face="Verdana" size="1" color="#008080">
<%=rstemp("paginas")%></font>
</td>
</tr>
<tr>
<td width="72">
<font face="Verdana">
<b><font size="1" color="#000000">Preço(R$)</font></b><font size="1" color="#000000"></font></font>
</td>
<td width="337"></font></b><font face="Verdana" size="1" color="#000000">
<%=formatnumber(rstemp("Valor"),2)%>
</font>
</td>
<td width="125">
<p align="center"><a href="http://macorati/loja/compre.asp?operacao=incluir&amp;quantidade=1
&amp;ProdutoID=<%=itemID%>"><img border="0" src="IMAGENS/cprar.gif"></a>
</td>
</tr>
</table>

<table border="0" width="661" bgcolor="#008080">
<tr>
<td bgcolor="#008080" width="647">
<p align="center"><a href="index.htm"><strong><font face="Verdana" color="#FFFFFF" size="2">Voltar</font></strong></a></td>
</tr>
</table>
<table border="0" width="661">
</table>

</body>
</html>

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
 
- Inclua também o component INET - Microsoft Internet Transfer Control 6.0. (Veja figura abaixo)

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:

Propriedade Tipo de Dados Descrição
AccessType Enum -Define/Retorna um valor que determina se o controle irá acessar a Internet diretamente(icDirect (1)) ou vai um servidor Proxy.(icNamedProxy (2)). Podemos usar a configuração padrão. (icUseDefault (0))
Document String -Define/Retornao arquivo ou documento a ser usado com o método Execute.
hInternet Long -Retorna o identificador Internet da API em WININET.DLL.
Password String -Define/Retorna a senha para o requisição de logon para sistemas remotos.
Protocol Enum -Define/Retorna o protocolo ( FTP, HTTP, HTTPS) a ser usado com o método Execute.
Proxy String -Define/Retorna o nome do servidor Proxy usado para acessar a Internet.
OpenURL String -Define/Retorna o o conteúdo de uma página WEB no formato texto(padrão) ou em um array de bytes.

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:


José Carlos Macoratti