sexta-feira, 4 de maio de 2001

Transferência de dados via ASP + XML

Um dos grandes feitos do XML é a possibilidade de transferir dados de uma forma padronizada, estruturada e com um vocabulário personalizado. Neste artigo, irei demonstrar um processo de transmissão de dados via ASP e XML, utilizando estes recursos.


Primeiro passo: selecionando a massa a ser exportada


Podemos utilizar o DOM para criar o documento XML. Opcionalmente, podemos criar o documento com response.write, mas esta forma é mais sujeita a falhas de programação.


<%


set xmlDoc = server.CreateObject("MSXML2.DOMDocument.3.0" )
xmlDoc.async = false
set tabela = xmlDoc.createElement("tabela")


set oConnection = server.CreateObject("ADODB.Connection" )
oConnection.open ( banco_de_dados )
set oRecordset = oConnection.execute( "select * from tabela" )


do while not oRecordset.eof


   set registro = xmlDoc.createElement( "registro" )


   For n = 0 To oRecordset.Fields.Count - 1


       campo = oRecordset.Fields.Item(n).name
      
if oRecordset.Fields.Item(n).type = adLongVarChar or _
         
oRecordset.Fields.Item(n).type = adLongVarWChar then
         
set memo = xmlDoc.createElement( campo )
          memo.text = oRecordset( campo )

          registro.appendChild memo
      
else
         
registro.setAttribute campo, oRecordset( campo )
       end if


   Next


   tabela.appendChild registro


loop


xmlDoc.appendChild tabela


%>


Segundo passo: Enviando dados para o servidor destino


Há duas soluções possíveis:


1. Enviar os dados em um campo textarea de um formulário


Nesta, basta incluir este código após o trecho acima:


<form action="http://destino/recebe.asp" method="post">
 
<textarea readonly name=xmlDoc><%= xmlDoc.xml %></textarea><input type="submit">
</form>


O incoveniente é que o campo não pode exceder o limite de 102.399 caracteres (http://support.microsoft.com/support/kb/articles/Q273/4/82.ASP?LN=EN) e que a aplicação que recebe o documento precisa certificar-se que os dados são coerentes.


2. Enviar os dados usando o XMLHTTP


<%


Set oXMLHTTP = Server.CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.open "POST", "http://destino/recebe.asp", false
oXMLHTTP.send(xmlDoc)


'Exibe o retorno do servidor. Como se trata de um documento XML, usamos as tags XMP para exibir o seu conteúdo, sem que o browser interprete-o. Opcionalmente, poderíamos transformar este documento em HTML, ou interagir com a base de dados local, dependendo da resposta.


response.write "<xmp>" & oXMLHTTP.responseXML.xml & "</xmp>


%>


O incoveniente aqui é que a máquina que processa este script precisa estar rodando o Windows 2000 ou Windows NT 4.0, com IE 5.01 ou superior instalado, não sendo suportado pelas versões 9x do Windows. Há também alguns problemas com web proxies, caso estejam sendo usados. Observados estes requisitos, funciona muito bem e elimina a necessidade de intervenção do usuário, sendo a opção recomendada.


No próximo passo, iremos adotar a segunda forma, para fins de exemplos.


Terceiro passo: Recebendo os dados no servidor e processando-os


Uma vez que os dados já foram enviados para o servidor, precisamos apenas recebê-los, verificar sua consistência e efetuar o devido processamento:


Recebe.asp


<%


Response.ContentType = "text/xml" 'Devemos retornar um documento XML


set xmlDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
xmlDoc.load(Request) 'Aqui, carregamos os dados enviados


set xmlResposta = Server.CreateObject("MSXML2.DOMDocument.3.0")
set resposta = xmlResposta .createElement("resposta")


if xmlDoc.parseError <> 0 then
  
resposta.setAttribute "status", "Falha: " & _
      xmlDoc.parseError.srcText & _
     
xmlDoc.parseError.reason & " Linha " & _
     
xmlDoc.parseError.line & " Col " & _
     
xmlDoc.parseError.linepos
else
  
'Aqui, faremos o que for necessário com os dados recebidos: alteração de banco de dados, inclusão dos novos registros, etc.


   resposta.setAttribute "status", "Processado sem problemas"


end if


xmlResposta.appendChild resposta
xmlResposta.save(Response) 'Retornamos o resultado do processamento para quem os enviou


%>


Done! Conseguimos exportar alguns dados de um servidor para outro, usando o XML para descrever os dados e o objeto XMLHTTP para envio dos mesmos. Essa solução se aplica em diversos casos:



  • Processamento de pedidos feitos por sites de terceiros

  • Dois sites trocando informações em esquemas de parceria

  • Uma aplicação offline transmitindo dados para o servidor central

  • E o que mais sua imaginação permitir!

Comentários sobre o código são bem-vindos.



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

0 comentários: